- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Python 更新 JPEG 文件中嵌入的 JFIF 缩略图。
这是应该实现此目的的(有点hackish)方法:
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
当我重写旧的缩略图时,该功能工作正常,即缩略图数据的大小没有改变。但是,一旦我对其应用一些转换(例如裁剪或旋转)并再次存储它,生成的文件似乎不再有效。
我上传了 original image和 one with an updated thumbnail为了更好的比较。
我从例如中得到的错误识别
如下:
identify.im6: Invalid JPEG file structure: two SOI markers `/tmp/thumb_rotated.jpg' @ error/jpeg.c/JPEGErrorHandler/316.
比较两个图像时,0x202
大小标签中的值与嵌入的缩略图数据的大小相匹配,文件也相应变大。
最佳答案
这是图像文件的结构。请注意,在 APP1 标记之后有第二个 SOI 标记。
{图像开始}
{ APP0 标记 长度:16 版本:1.1 密度单位:(每英寸像素) X密度:72 Y 密度:72 缩略图宽度:0 缩略图高度:0}
{ APP1 标记 长度:7678埃克斯夫}
{图像开始}
{ 定义量化表 长度:67 表索引:0 工作台精度:0 表值: 8 6 6 7 6 5 8 7 7 7 9 9 8 10 12 20 13 12 11 11 12 25 18 19 15 20 29 26 31 30 29 26 28 28 32 36 46 39 32 34 44 35 28 28 40 55 41 44 48 49 52 52 52 31 39 57 61 56 50 60 46 51 52 50}
{ 定义量化表 长度:67 表索引:1 工作台精度:0 表值: 9 9 9 12 11 12 24 13 13 24 50 33 28 33 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50}
{ 帧开始 类型:基线(霍夫曼) 长度:17 精度:8 高度:360 宽度:480 组件数量:3 组件1 水平频率:2 垂直频率:2 量化表:0 组件2 水平频率:1 垂直频率:1 量化表:1 组件 3 水平频率:1 垂直频率:1 量化表:1}
{ 定义哈夫曼表 长度:28 表索引 0 表类别:DC 代码计数:0 1 5 1 1 1 0 0 0 0 0 0 0 0 0 0 代码值:3 1 2 4 5 6 0 7 8}
{ 定义哈夫曼表 长度:65 表索引 0 table 等级:AC 代码计数:0 2 1 3 2 4 4 4 4 4 5 3 3 4 3 0 代码值: 1 2 3 0 4 11 12 21 5 31 41 51 13 22 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 34 53 82 25 83 c2}
{ 定义哈夫曼表 长度:26 表索引1 表类别:DC 代码计数:0 3 1 1 1 1 0 0 0 0 0 0 0 0 0 0 代码值:0 1 2 3 4 5 6}
{ 定义哈夫曼表 长度:45 表索引1 table 等级:AC 代码计数:0 2 2 1 4 1 4 2 2 2 1 5 0 0 0 0 代码值: 0 1 2 11 3 4 12 21 31 41 13 22 51 61 32 71 5 14 23 91 f0 33 42 81 a1 b1}
{ 扫描开始 长度:12 组件 ID:1 AC 熵表:0 DC 熵表:0 组件 ID:2 AC熵表:1 DC熵表:1 组件 ID:3 AC熵表:1 DC熵表:1 光谱选择开始:0 光谱选择结束:63 逐次逼近高:0 逐次逼近低:0}
{ 图片结束 }
关于python - 更新 JPEG 文件中的 JFIF 缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23537642/
我是一名优秀的程序员,十分优秀!