我正在进行优化,Google建议对图像进行无损压缩,寻找在Django中实现此功能的方法。
这是他们指定的图像,我认为要有效地完成它需要在系统范围内实施,可能使用中间件类,想知道是否有人之前已经这样做过。以下是pagespeed https://developers.google.com/speed/pagespeed/insights/?url=www.kenyabuzz.com
的google analytics链接优化图片 正确格式化和压缩图像可以节省许多字节的数据。 优化以下图像,使其尺寸缩小627.3KiB(减少74%)。
Losslessly compressing http://www.kenyabuzz.com/media/uploads/clients/kenya_buzz_2.jpg could save 594.3KiB (92% reduction).
Losslessly compressing http://www.kenyabuzz.com/media/uploads/clients/new_tribe_2.jpg could save 25KiB (44% reduction).
Losslessly compressing http://www.kenyabuzz.com/…a/uploads/clients/EthiopianAirlines2.jpg could save 3KiB (22% reduction).
Losslessly compressing http://www.kenyabuzz.com/static/kb/images/Nightlife.Homepage.jpg could save 1.3KiB (2% reduction).
Losslessly compressing http://www.kenyabuzz.com/static/kb/img/social/blog.png could save 1.1KiB (43% reduction).
Losslessly compressing http://www.kenyabuzz.com/static/kb/img/social/twitter.png could save 969B (52% reduction).
Losslessly compressing http://www.kenyabuzz.com/…der-Board---Email-Signature--Neutral.jpg could save 920B (2% reduction).
Losslessly compressing http://www.kenyabuzz.com/static/kb/img/social/youtube.png could save 757B (31% reduction).
答案 0 :(得分:28)
无损压缩http://www.kenyabuzz.com/media/uploads/clients/kenya_buzz_2.jpg可以节省594.3KiB(减少92%)。
首先,日志中的信息相当误导,因为无法使用无损格式将图像压缩92%(除了某些情况,如单色图像,基本几何形状如正方形等)。请阅读this answer和this answer了解详情。真的,读它们,都是很好的答案。
其次,你可以使用有损压缩格式"而不会失去质量" - 差异是如此微妙,人眼甚至没有注意到。
因此,我从您从此链接优化的网站上下载了一张图片:http://www.kenyabuzz.com/media/uploads/clients/kenya_buzz_2.jpg
我打开了我的Python控制台并写了这个:
>>> from PIL import Image
>>> # Open the image
>>> im = Image.open("kenya_buzz_2.jpg")
>>> # Now save it
>>> im.save("kenya_buzz_compressed.jpg", format="JPEG", quality=70)
这在我的磁盘上创建了一个新图像。以下是两张图片。
原创(655.3kB)
压缩(质量减少22.4kB~96%= 70)
您可以使用quality
选项。比如,80
的价值会为您提供质量更好的图像,但尺寸会更大。
由于这是一个非常受欢迎的问题,我决定添加一个示例代码来压缩Django中的图像。
此代码适用于Django> = 1.7。
from io import BytesIO
from PIL import Image
from django.core.files import File
def compress(image):
im = Image.open(image)
# create a BytesIO object
im_io = BytesIO()
# save image to BytesIO object
im.save(im_io, 'JPEG', quality=70)
# create a django-friendly Files object
new_image = File(im_io, name=image.name)
return new_image
这就是你在Django模型中(或任何地方)使用上述compress
函数的方法:
# models.py
class MyModel(...):
image = models.ImageField(...)
def save(self, *args, **kwargs):
# call the compress function
new_image = compress(self.image)
# set self.image to new_image
self.image = new_image
# save
super().save(*args, **kwargs)
基本上就是这样。这是相当基本的代码。您可以通过仅在图像更改时压缩图像来改进代码,而不是每次保存模型时都是如此。
答案 1 :(得分:3)
您应该尝试Django Easy Thumbnails app,它有一些选项可以添加后处理来优化上传的图片:PostProcessor documentation
我在几个项目的生产中使用它。 效果很好,图片大小肯定更小,页面加载更快。
答案 2 :(得分:2)
我没有经验,但picopt
看起来很全面。它广泛依赖外部工具来执行优化,因此可能难以在受限或托管的服务器环境中进行设置。
除此之外,尝试谷歌搜索" python图像优化"。还有一些其他链接表明可能有基于PIL的解决方案,例如: