setImageCompressionQuality 与 setCompressionQuality 之间有什么区别 - Imagick

What is difference between setImageCompressionQuality vs setCompressionQuality - Imagick

我在Imagick中找到了两种设置图片压缩质量的方法

A) 设置图像压缩质量

B ) 设置压缩质量

所以我想知道哪个最好,为什么会出现以下情况

我了解到 setCompressionQuality 方法仅适用于新图像 (?)

我正在尝试压缩文件 jpeg/png

$im = new Imagick();

$im->readImage($file); // path/to/file
$im->setImageCompressionQuality($quality); // 90,80,70 e.g.

$im->writeImage($file);

方法 setImageCompressionQuality 设置当前图像的压缩质量。此方法是 MagickWandMagickSetImageCompressionQuality 函数的包装器。 Source code 是:

WandExport MagickBooleanType MagickSetImageCompressionQuality(MagickWand *wand,
  const size_t quality)
{
  assert(wand != (MagickWand *) NULL);
  assert(wand->signature == MagickWandSignature);
  if (wand->debug != MagickFalse)
    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
  if (wand->images == (Image *) NULL)
    ThrowWandException(WandError,"ContainsNoImages",wand->name);

  //This line sets the quality for the instance 'images'  
  wand->images->quality=quality;
  return(MagickTrue);
}

方法setCompressionQuality 设置整个对象的压缩质量。此方法是 MagickWandMagickSetCompressionQuality 函数的包装器。 Source code 是:

WandExport MagickBooleanType MagickSetCompressionQuality(MagickWand *wand,
  const size_t quality)
{
  assert(wand != (MagickWand *) NULL);
  assert(wand->signature == MagickWandSignature);
  if (wand->debug != MagickFalse)
    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);

  //This line sets quality for the image_info struct instance.
  wand->image_info->quality=quality;
  return(MagickTrue);
}

MagickWand 结构包含 ImageImageInfo 结构的实例,source:

struct _MagickWand
{
  ...

  Image
    *images;          /* The images in this wand - also the current image */

  ImageInfo
    *image_info;      /* Global settings used for images in Wand */
  ...
};

两个 Image and ImageInfo 结构都包含一个 size_t quality; 数据成员。因此,对于您的示例,setImageCompressionQuality 非常好。