我想在jpg文件中写入一些对于图片说明的文字信息,可以由程序读取,但不影响图片的格式和显示,怎么写,写到什么地方?高手进

解决方案 »

  1.   

    JPEG/JFIF 文件格式使用 Motorola 格式, 而不是 Intel 格式, 就是说, 如果
    是一个字的话, 高字节在前, 低字节在后.JPG 文件是由一个个段 (segments) 构成的. 每个段长度 <=65535. 每个段从一个标
    记字开始. 标记字都是 0xff 打头的, 以非 0 字节和 0xFF 结束. 例如 'FFDA' , 
    'FFC4', 'FFC0'. 每个标记有它特定意义, 这是由第2字节指明的. 例如, SOS (Start
    Of Scan = 'FFDA') 指明了你应该开始解码. 另一个标记 DQT (Define Quantization
    Table = 0xFFDB) 就是说它后面有 64 字节的 quantization 表在处理 JPG 文件时, 如果你碰到一个 0xFF, 而它后面的字节不是 0, 并且这个字节
    没有意义. 那么你遇到的 0xFF 字节必须被忽略. (一些 JPG 里, 常用用 0xFF 做某
    些填充用途) 如果你在做 huffman 编码时碰巧产生了一个 0xFF, 那么就用 0xFF 
    0x00 代替. 就是说在 jpeg 图形解码时碰到 FF00 就把它当作 FF 处理.另外在 huffman 编码区域结束时, 碰到几个 bit 没有用的时候, 应该用 1 去填充.
    然后后面跟 FF.
      

  2.   

    正好,
    我做过和你一样的程序,
    在jpg文件结尾你会看到FF D9 (十六进制)
    该标志之后的所有数据都将被忽略,
    你可以把自己的数据添加在后面,
    读取的时候,取出最后面的数据即可,我就是这样做的,
    已经用了很久了,
      

  3.   

    To小楼一夜听雨:
        谢谢,你的方法我试了可以,但是我还有一个问题,因为我是想向数码相机拍出来的jpg相片文件写入一些对于这个相片的描述信息,用ACDSee等图片查看器打开相片文件右键点饥属性时可以看到很多关于相片的描述信息,如相片的拍摄时间,分辨率等等,有些是不能改的(灰的),有些可以改,比如Image description和User comment 等选项,我想把信息直接写到上边提到的字段中,不知道你试过没有,我想可能和jpg文件的数据存放格式有关,我在属性中手动写入后,将文件用Ultra Edit打开可以在靠前的字段中找到刚才写入的信息,你能再提供一些jpg文件的数据格式方便的资料么,谢谢
      

  4.   

    JPEG 文件格式
    ~~~~~~~~~~~~~~~~  - 文件头 (2 bytes):  $ff, $d8 (SOI) (JPEG 文件标识)
      - 任意数量的段 , 见后面
      - 文件结束 (2 bytes): $ff, $d9 (EOI)段的格式:
    ~~~~~~~~~  - header (4 bytes):
           $ff     段标识
            n      段的类型 (1 byte)
           sh, sl  该段长度, 包括这两个字节, 但是不包括前面的 $ff 和 n.
                   注意: 长度不是 intel 次序, 而是 Motorola 的, 高字节在前,
           低字节在后!
      - 该段的内容, 最多 65533 字节 注意:
      - 有一些无参数的段 (下面那些前面注明星号的)
        这些段没有长度描述 (而且没有内容), 只有 $ff 和类型字节.
      - 段之间无论有多少 $ff 都是合法的, 必须被忽略掉.段的类型:
    ~~~~~~~~~   *TEM   = $01   可以忽略掉    SOF0  = $c0   帧开始 (baseline JPEG), 细节附后
        SOF1  = $c1   dito
        SOF2  = $c2   通常不支持
        SOF3  = $c3   通常不支持    SOF5  = $c5   通常不支持
        SOF6  = $c6   通常不支持
        SOF7  = $c7   通常不支持    SOF9  = $c9   arithmetic 编码(Huffman 的一种扩展算法), 通常不支持
        SOF10 = $ca   通常不支持
        SOF11 = $cb   通常不支持    SOF13 = $cd   通常不支持
        SOF14 = $ce   通常不支持
        SOF14 = $ce   通常不支持
        SOF15 = $cf   通常不支持    DHT   = $c4   定义 Huffman Table,  细节附后
        JPG   = $c8   未定义/保留 (引起解码错误)
        DAC   = $cc   定义 Arithmetic Table, 通常不支持   *RST0  = $d0   RSTn 用于 resync, 通常被忽略
       *RST1  = $d1
       *RST2  = $d2
       *RST3  = $d3
       *RST4  = $d4
       *RST5  = $d5
       *RST6  = $d6
       *RST7  = $d7    SOI   = $d8   图片开始
        EOI   = $d9   图片结束
        SOS   = $da   扫描行开始, 细节附后
        DQT   = $db   定义 Quantization Table, 细节附后
        DNL   = $dc   通常不支持, 忽略
        DRI   = $dd   定义重新开始间隔, 细节附后
        DHP   = $de   忽略 (跳过)
        EXP   = $df   忽略 (跳过)    APP0  = $e0   JFIF APP0 segment er (细节略)
        APP15 = $ef   忽略    JPG0  = $f0   忽略 (跳过)
        JPG13 = $fd   忽略 (跳过)
        COM   = $fe   注释, 细节附后 其它的段类型都保留必须跳过SOF0: Start Of Frame 0:
    ~~~~~~~~~~~~~~~~~~~~~~~  - $ff, $c0 (SOF0)
      - 长度 (高字节, 低字节), 8+components*3
      - 数据精度 (1 byte) 每个样本位数, 通常是 8 (大多数软件不支持 12 和 16)
      - 图片高度 (高字节, 低字节), 如果不支持 DNL 就必须 >0
      - 图片宽度 (高字节, 低字节), 如果不支持 DNL 就必须 >0
      - components 数量(1 byte), 灰度图是 1, YCbCr/YIQ 彩色图是 3, CMYK 彩色图
        是 4
      - 每个 component: 3 bytes
         - component id (1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q)
         - 采样系数 (bit 0-3 vert., 4-7 hor.)
         - quantization table 号DRI: Define Restart Interval:
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  - $ff, $dd (DRI)
      - 长度 (高字节, 低字节), 必须是 4
      - MCU 块的单元中的重新开始间隔 (高字节, 低字节),
        意思是说, 每 n 个 MCU 块就有一个 RSTn 标记.
        第一个标记是 RST0, 然后是 RST1 等, RST7 后再从 RST0 重复 DQT: Define Quantization Table:
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  - $ff, $db (DQT)
      - 长度 (高字节, 低字节)
      - QT 信息 (1 byte):
         bit 0..3: QT 号(0..3, 否则错误)
         bit 4..7: QT 精度, 0 = 8 bit, 否则 16 bit
      - n 字节的 QT, n = 64*(精度+1) 备注:
      - 一个单独的 DQT 段可以包含多个 QT, 每个都有自己的信息字节
      - 当精度=1 (16 bit), 每个字都是高位在前低位在后DAC: Define Arithmetic Table:
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     法律原因, 现在的软件不支持 arithmetic 编码.
     不能生产使用 arithmetic 编码的 JPEG 文件DHT: Define Huffman Table:
    ~~~~~~~~~~~~~~~~~~~~~~~~~~  - $ff, $c4 (DHT)
      - 长度 (高字节, 低字节)
      - HT 信息 (1 byte):
         bit 0..3: HT 号 (0..3, 否则错误)
         bit 4   : HT 类型, 0 = DC table, 1 = AC table
         bit 5..7: 必须是 0
      - 16 bytes: 长度是 1..16 代码的符号数. 这 16 个数的和应该 <=256
      - n bytes: 一个包含了按递增次序代码长度排列的符号表
        (n = 代码总数) 备注:
      - 一个单独的 DHT 段可以包含多个 HT, 每个都有自己的信息字节COM: 注释:
    ~~~~~~~~~~  - $ff, $fe (COM)
      - 注释长度 (高字节, 低字节) = L+2
      - 注释为长度为 L 的字符流SOS: Start Of Scan:
    ~~~~~~~~~~~~~~~~~~~  - $ff, $da (SOS)
      - 长度 (高字节, 低字节), 必须是 6+2*(扫描行内组件的数量)
      - 扫描行内组件的数量 (1 byte), 必须 >= 1 , <=4 (否则是错的) 通常是 3
      - 每个组件: 2 bytes
         - component id (1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q), 见 SOF0
         - 使用的 Huffman 表:
    - bit 0..3: AC table (0..3)
    - bit 4..7: DC table (0..3)
      - 忽略 3 bytes (???) 备注:
      - 图片数据 (一个个扫描行) 紧接着 SOS 段.
      

  5.   

    楼上的,这些资料我在网上看过了,谢谢你贴给我,我是想把对图片的说明加到ACDSee的oxffe0就是说给应用程序留的段的image description字段中,不知道应该怎么加,用ultra edit打开看不出什么规律,是不是要研究一下ACDSee的源码或给其给图片加属性信息的那部分规范啊,不不知道你了解么?能不能再提供一些信息呢