使用PIL和cv2压缩PNG

时间:2018-10-01 15:14:47

标签: python django python-3.x python-imaging-library cv2

我正在尝试在我的django项目中制作图像压缩器。我在jpg上做得很好,但是在png上遇到了很多问题。对于压缩,我使用PIL和cv2,但对于大型PNG文件(> 1 mb),压缩效果无法达到16%。香港专业教育学院试图结合两个库,它仍然不是天真的。这是我认为的简单代码:

(以上用于jpg压缩的代码)

elif picture.mode == ('RGBA'):
            if photo.image.size < 1000000:
                colorsloss = picture.convert(mode="P", palette=Image.ADAPTIVE)
                colorsloss.save('media/new/'+name,"PNG",quality=75, optimize=True, bits=8)
            else:
                originalImage = cv.imread(str('/home/andrey/sjimalka'+ photo.image.url))
                cv.imwrite('media/new/'+name, originalImage,[cv.IMWRITE_PNG_COMPRESSION, 9])
                cvcompressed = Image.open('media/new/'+name)
                cvcompressed.convert(mode="RGB")
                cvcompressed.save('media/new/'+name,"PNG",quality=75, optimize=True)

所以我在这里遇到了两个大问题: 1)如果香港专业教育学院获得了较小尺寸的图像(<1 mb),则在枕头中使用P模式。它的效果很好,但是如果我使用渐变压缩图像,则在出现渐变的地方会看到一些失真。 original compressed 我的压缩效果很好(大约85%),但不知道如何解决。

2)我无法很好地压缩大png文件。我最好的目标是达到16%,质量非常好,但是仍然不是天真的。 mb我做错了事,或者我拒绝使用任何其他库或技术来使其变得更好。我想获取大png文件压缩50%的列表。

我已经尝试使用pngquant,但是他们的文档对我来说还不太清楚,我找不到很好的代码示例。

1 个答案:

答案 0 :(得分:1)

PNG无损。您无法选择在写入时放弃信息以像JPEG一样缩小文件的大小。

如果您选择的是浅色版本,则每个像素只需要一个字节,而不是三个字节,但是您只能得到256种颜色,并且渐变看起来很垃圾。

此外,质量设置与JPEG的质量设置不同-它更像--fast的{​​{1}}或--best参数。

如果像您一样具有较大的透明度区域,您可以做的一件事就是使所有100%透明的像素变黑。那将帮助他们更好地压缩。参见example here