如何在python中使用魔杖优化图像大小 [英] How to optimize image size using wand in python
问题描述
我想使用魔杖调整大小和优化png和jpg图像大小.
I want to resize and optimize png and jpg image size using wand.
使用PIL,如果我指定了优化选项,则能够以大约三分之一的大小保存同一图像.
With PIL, I'm able to save the same image with about a 3rd of the size if I specify the optimize option.
with open(filename, 'rb') as f:
pimage = PImage.open(f)
resized_pimage = pimage.resize((scaled_width, scaled_height), PImage.ANTIALIAS) bytes_buffer = io.BytesIO()
resized_pimage.save(bytes_buffer, format="PNG", optimize=True)
但是,我不确定Wand的等效选项是什么
However, I'm not sure what the equivalent option for Wand is:
with default_storage.open(filename, 'rb') as f:
img = WImage(file=f)
img.resize(width=scaled_width, height=scaled_height, filter='gaussian')
with WImage(width=scaled_width, height=scaled_height) as png:
png.composite(img, top=0, left=0)
png.format = 'png'
bytes_buffer = io.BytesIO()
png.save(file=bytes_buffer)
我阅读了一些有关ImageMagic图像优化的文章(例如 http://www.smashingmagazine.com/2015/06/efficiency-image-resizing-with-imagemagick/),但是在Wand中如何做到这些并不清楚(我是一个完全的新手棒或PIL).
I read a few articles about image optimization for ImageMagic (e.g. http://www.smashingmagazine.com/2015/06/efficient-image-resizing-with-imagemagick/) but it is not obvious how I can do these in Wand (I'm a complete newbie in either Wand or PIL).
任何帮助/指针将不胜感激.
Any help/pointer would be greatly appreciated.
推荐答案
更新后的答案
使用 wand 设置优化将需要一些其他MagickWand库扩展/配置.这是由于需要在wand
数据结构上设置quality
属性,而不是图像实例.使困惑?我是.幸运的是,Python的Wand库使此操作变得容易.请尝试以下操作.
Updated Answer
Setting the optimization with wand will require some additional MagickWand library extension/configuration. This is due to the quality
attribute needing to be set on the wand
data-structure, and not the image's instance. Confused? I am. Luckily Python's Wand library makes this easy. Try the following.
# Require wand's API library and basic ctypes
from wand.api import library
from ctypes import c_void_p, c_size_t
# Tell Python's wand library about the MagickWand Compression Quality (not Image's Compression Quality)
library.MagickSetCompressionQuality.argtypes = [c_void_p, c_size_t]
# Do work as before
from wand.image import Image
with Image(filename=filename) as img:
img.resize(width=scaled_width, height=scaled_hight)
# Set the optimization level through the linked resources of
# the image instance. (i.e. `wand.image.Image.wand`)
library.MagickSetCompressionQuality(img.wand, 75)
img.save(filename=output_destination)
原始答案
Original Answer
There are many types of "optimization" for png format, but I'm under the impression your seeking a way to reduce image size.
我相信 wand.Image.compression_quality
是您要寻找的. p>
from wand.image import Image
with Image(filename=filename) as img:
img.resize(width=scaled_width, height=scaled_hight)
img.compression_quality = 75
img.save(filename=output_destination)
以上内容不会像使用JPEG
格式所希望的那样将质量降低到75%,而是指示要使用的PNG压缩库/算法/过滤器.请参见 PNG压缩和更好的PNG压缩示例.
The above will not reduce quality to 75% as you would expect with the JPEG
format, but instruct which PNG-compression library/algo/filter to use. See PNG compression & Better PNG Compression examples.
+-----+
| 7 5 |
+-----+
| 0 . | Huffman compression (no-zlib)
| 1 . | zlib compression level 1
| 2 . | zlib compression level 2
| 3 . | zlib compression level 3
| 4 . | zlib compression level 4
| 5 . | zlib compression level 5
| 6 . | zlib compression level 6
| 7 . | zlib compression level 7
| 8 . | zlib compression level 8
| 9 . | zlib compression level 9
| . 0 | No data encoding/filtering before compression
| . 1 | "Sub" data encoding/filtering before compression
| . 2 | "Up" data encoding/filtering before compression
| . 3 | "Average" data encoding/filtering before compression
| . 4 | "Paeth" data encoding/filtering before compression
| . 5 | "Adaptive" data encoding/filtering before compression
+-----+
因此,将质量设置为75
会在执行adaptive
过滤器后使用zlib级别7
压缩.请注意,这只是级别和过滤器,而不是优化策略.可以使用CLI选项-define png:compression-strategy=zs
设置优化策略,但是 wand 尚未实现图像伪影方法.
So setting the quality to 75
will compress using zlib level 7
after performing an adaptive
filter. Note this is just the level and filter, not the optimization strategy. The optimization strategy can be set with the CLI option -define png:compression-strategy=zs
however wand has yet to implement image artifact methods.
这篇关于如何在python中使用魔杖优化图像大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!