枕头转换会增加图像尺寸
pillow conversion increases image size
我正在使用 python Pillow 库进行简单的图像格式转换。
这是一些简单的代码来演示我在做什么
im = Image.open("images/filename.tiff", mode="r")
im.save("images/filename.png", optimize=True)
平均而言,大小增加了 98%。这是我尝试创建的输入 tiff 的数据:
<image mode=1 size=2544x2230>
当我显式转换它时(通过调用 .convert(),大小平均只增加了 87%,但仍然很糟糕。为什么大小膨胀这么多?
这是我试过的方法?
- 在 .save() 上使用“质量”参数似乎效果不大
- 将“模式”参数显式传递给保存命令几乎没有效果
- 使用 .convert("L") 对转换后的整体尺寸影响不大
编辑
这是一个示例图片,运行 通过我上面描述的内容生成了 87% 的 png 文件、907% 的 jpeg 文件和 907% 的 jpg 文件。
https://share.getcloudapp.com/YEuR9LqP
Pillow 最新版本:8.2
Python版本:3.8
运行 在 MacOS 上:10.15.7
我是不是遗漏了一些明显的东西,或者这只是我不了解图像库的工作原理?
我认为问题在于您的图片是 CCITT Group4 Compressed,它特别适合您的图片内容,并且没有对应的 PNG 格式。
exiftool image-1.tiff
输出
ExifTool Version Number : 12.00
File Name : image-1.tiff
Directory : .
File Size : 95 kB
File Modification Date/Time : 2021:05:17 11:46:57+01:00
File Access Date/Time : 2021:05:17 11:57:15+01:00
File Inode Change Date/Time : 2021:05:17 11:46:58+01:00
File Permissions : rw-r--r--
File Type : TIFF
File Type Extension : tif
MIME Type : image/tiff
Exif Byte Order : Little-endian (Intel, II)
Image Width : 2544
Image Height : 2230
Bits Per Sample : 1
Compression : T6/Group 4 Fax <--- HERE IT IS
Photometric Interpretation : WhiteIsZero
Strip Offsets : 180
Orientation : Horizontal (normal)
Rows Per Strip : 2230
Strip Byte Counts : 96954
X Resolution : 300
Y Resolution : 300
Resolution Unit : inches
Image Size : 2544x2230
Megapixels : 5.7
在我的 Mac 上,我从 PIL 获得了大小为 138,200 字节的输出 PNG,即使使用 pngcrush
我也只能减少到 124,810 字节:
pngcrush -bruteforce result-opt.png crushed.png
Recompressing IDAT chunks in result-opt.png to crushed.png
Total length of data found in critical chunks = 138200
Best pngcrush method = 4 (ws 15 fm 0 zl 9 zs 1) = 124816
我正在使用 python Pillow 库进行简单的图像格式转换。
这是一些简单的代码来演示我在做什么
im = Image.open("images/filename.tiff", mode="r")
im.save("images/filename.png", optimize=True)
平均而言,大小增加了 98%。这是我尝试创建的输入 tiff 的数据:
<image mode=1 size=2544x2230>
当我显式转换它时(通过调用 .convert(),大小平均只增加了 87%,但仍然很糟糕。为什么大小膨胀这么多?
这是我试过的方法?
- 在 .save() 上使用“质量”参数似乎效果不大
- 将“模式”参数显式传递给保存命令几乎没有效果
- 使用 .convert("L") 对转换后的整体尺寸影响不大
编辑
这是一个示例图片,运行 通过我上面描述的内容生成了 87% 的 png 文件、907% 的 jpeg 文件和 907% 的 jpg 文件。
https://share.getcloudapp.com/YEuR9LqP
Pillow 最新版本:8.2
Python版本:3.8
运行 在 MacOS 上:10.15.7
我是不是遗漏了一些明显的东西,或者这只是我不了解图像库的工作原理?
我认为问题在于您的图片是 CCITT Group4 Compressed,它特别适合您的图片内容,并且没有对应的 PNG 格式。
exiftool image-1.tiff
输出
ExifTool Version Number : 12.00
File Name : image-1.tiff
Directory : .
File Size : 95 kB
File Modification Date/Time : 2021:05:17 11:46:57+01:00
File Access Date/Time : 2021:05:17 11:57:15+01:00
File Inode Change Date/Time : 2021:05:17 11:46:58+01:00
File Permissions : rw-r--r--
File Type : TIFF
File Type Extension : tif
MIME Type : image/tiff
Exif Byte Order : Little-endian (Intel, II)
Image Width : 2544
Image Height : 2230
Bits Per Sample : 1
Compression : T6/Group 4 Fax <--- HERE IT IS
Photometric Interpretation : WhiteIsZero
Strip Offsets : 180
Orientation : Horizontal (normal)
Rows Per Strip : 2230
Strip Byte Counts : 96954
X Resolution : 300
Y Resolution : 300
Resolution Unit : inches
Image Size : 2544x2230
Megapixels : 5.7
在我的 Mac 上,我从 PIL 获得了大小为 138,200 字节的输出 PNG,即使使用 pngcrush
我也只能减少到 124,810 字节:
pngcrush -bruteforce result-opt.png crushed.png
Recompressing IDAT chunks in result-opt.png to crushed.png
Total length of data found in critical chunks = 138200
Best pngcrush method = 4 (ws 15 fm 0 zl 9 zs 1) = 124816