我正在尝试使用Python更新JPEG文件中嵌入的JFIF缩略图。
这是一种(稍微有点麻烦的)方法,它应该实现这一点:
def set_thumbnail(self, data):
# Data of the updated thumbnail
data = bytearray(data)
# Get offset of the old thumbnail data
offset = (self._exif_start +
self._unpack('I', self._get_tag_offset(0x201)+8))
# Get size of the old thumbnail
old_size = self._unpack('I', self._get_tag_offset(0x202)+8)
try:
# Strip everything between the JFIF APP1 and the quant table
jfif_start = data.index('\xff\xe0')
quant_start = data.index('\xff\xdb')
stripped_data = data[0:jfif_start] + data[quant_start:]
except ValueError:
stripped_data = data
# Writes the new length to the buffer
self._pack('I', self._get_tag_offset(0x202)+8, len(stripped_data))
# Writes the new data to the image buffer
self._buf[offset:offset+old_size] = stripped_data当我重写旧的缩略图时,这个函数工作得很好,即缩略图数据的大小不会改变。但是,一旦我将一些转换(例如裁剪或旋转)应用到它并再次存储它,生成的文件似乎不再有效。
为了进行更好的比较,我同时上传了原始图像和一个有更新的缩略图。
我从例如identify中得到的错误如下:
identify.im6: Invalid JPEG file structure: two SOI markers `/tmp/thumb_rotated.jpg' @ error/jpeg.c/JPEGErrorHandler/316.在对这两幅图像进行差分时,0x202大小标记中的值与嵌入的缩略图数据的大小相匹配,并且相应地文件也更大。
发布于 2014-05-08 16:05:15
我刚找到答案:
问题是,虽然我更新了TIFF标记中缩略图的大小,但没有更新APP1长度。一旦它也被更新,图像就会正确加载。
发布于 2014-05-08 15:55:45
这是您的图像文件的结构。注意,在APP1标记之后还有第二个SOI标记。
{图像的开始}
{ APP0标记长度: 16版本: 1.1密度单位:(像素/英寸)X密度: 72 Y密度: 72缩略图宽度:0缩钉高度:0}
{ APP1标记长度: 7678 Exif }
{图像的开始}
[定义量化表长度: 67表索引:0表精度:0表值:8 6 6 7 6 5 7 7 7 9 8 10 12 20 13 12 11 12 25 19 19 20 29 31 29 26 28 28 32 36 36 39 32 34 44 28 28 40 41 48 49 52 52 31 39 61 56 50 46 51 52 50 }
[定义量化表长度: 67表索引:1表精度:0表值:9 9 12 11 12 12 13 13 33 28 50 50 50
{开始帧类型:基线(哈夫曼)长度: 17精度:8高: 360度: 480分量计数:3分量1水平频率:2垂直频率:2量化表:0分量2水平频率:1垂直频率:1分量3水平频率:1垂直频率:1量化表:1}
{定义Huffman表长度: 28表索引0表类: DC代码计数:0 1 5 1 1 1 0 0 0代码值:3 1 2 4 5 6 0 7}
{定义哈夫曼表长度: 65表索引0表类: AC代码计数:0 2 1 3 2 4 4 4 5 3 3 3 0代码值:1 2 3 0 4 11 12 21 5 31 51 51 51 61 71 6 32 81 91 14 42 a1 b1 23 52 c1 d1 7 15 33 62 e1 43 72 f0 24 92 f1 16 53 82 25 83 c2 }
{定义Huffman表长度: 26表索引1表类: DC代码计数:0 3 1 1 1 0 0 0代码值:0 1 2 3 4 6}
{定义哈夫曼表长度: 45表索引1表类: AC代码计数:0 2 2 1 1 4 4 2 2 2 0 0 0代码值:0 1 2 11 3 4 12 21 31 31 31 51 51 31 31 31 51 31 31 31 51 31 31 31 51 31 31 31 51 31 31 31 51 31 31 31 51 31 31 31 51 31 31 31 51 31 31 31
{扫描起始长度: 12分量ID: 1 AC熵表:0 DC熵表:0分量ID: 2 AC熵表:1 DC熵表:1分量ID: 3 AC熵表:1 DC熵表:1光谱选择起始:0谱选择结束: 63吸出近似高:0吸出近似低:0}
{图像结束}
https://stackoverflow.com/questions/23537642
复制相似问题