Python 使用PIL和cv2压缩PNG

Python 使用PIL和cv2压缩PNG,python,django,python-3.x,python-imaging-library,cv2,Python,Django,Python 3.x,Python Imaging Library,Cv2,我试图在我的django项目中制作图像压缩程序。我在jpg方面做得很好,但在png方面遇到了很多问题。对于压缩,我使用了PIL和cv2,但对于大PNG文件(>1MB),其结果比16%的压缩效果要好。我曾尝试将这两个库合并,但仍然没有创新。下面是我的观点的简单代码: (以上代码用于jpg压缩) elif picture.mode==('RGBA'): 如果photo.image.size

我试图在我的django项目中制作图像压缩程序。我在jpg方面做得很好,但在png方面遇到了很多问题。对于压缩,我使用了PIL和cv2,但对于大PNG文件(>1MB),其结果比16%的压缩效果要好。我曾尝试将这两个库合并,但仍然没有创新。下面是我的观点的简单代码:

(以上代码用于jpg压缩)

elif picture.mode==('RGBA'):
如果photo.image.size<1000000:
colorsloss=picture.convert(mode=“P”,palete=Image.ADAPTIVE)
colorsloss.save('media/new/'+名称,“PNG”,质量=75,优化=True,位=8)
其他:
originalImage=cv.imread(str('/home/andrey/sjimalka'+photo.image.url))
cv.imwrite('media/new/'+名称,原始图像,[cv.imwrite\u PNG\u COMPRESSION,9])
cvcompressed=Image.open('media/new/'+name)
cvcompressed.convert(mode=“RGB”)
cvcompressed.save('media/new/'+名称,“PNG”,质量=75,优化=True)
这里有两个大问题: 1) 如果我得到了小尺寸的图像(<1MB),我会在枕头上使用P模式。它工作得很好,但若我用梯度压缩图像,我可以在得到梯度的地方看到一些扭曲。 我有很好的压缩(大约85%),但还不知道如何修复它

2) 我不能很好地压缩大的png文件。我最好的目标是16%,质量确实很好,但仍然没有创新。Mb我做错了什么,或者我应该使用任何其他库或技术来改进它。我想得到一个列表50%的压缩与大png文件


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

PNG是无损的。您不能选择在写入时丢弃信息,以便像使用JPEG一样缩小文件

如果你选择的是调色板版本,你只需要每像素一个字节而不是三个字节,但是你只能得到256种颜色,渐变看起来很糟糕

此外,质量设置与JPEG不同-它更像
--fast
--best
参数到
gzip


如果你像你一样有大面积的透明度,你可以做的一件事就是把所有100%透明的像素变成黑色。这将帮助他们更好地压缩。请参阅。

Thx以获取您的答案。我找到了另一个名为PyPNG的库。现在我想把png图片按像素分解,并尝试用像素阵列进行一些操作。如果我以编程方式基于传入的图片绘制一幅图片,那么大小可能会更小。我不确定它是否能起作用,但现在我认为这是实现预期目标的最佳途径。
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)