最新在使用ImageMagick处理图片时,发现有时经过处理的图片变大的问题。
例如原图为27K,经处理后的图片会变为77K。
先看测试代码:
// imgtest.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <wand/magick_wand.h> #include "fcntl.h" #include <sys/io.h> #include "unistd.h" int main( int argc, char **argv ) { MagickWand *im = NULL; im = NewMagickWand(); MagickBooleanType bRet = MagickFalse; bRet = MagickReadImage(im, "fengjie.jpg"); if ( MagickTrue != bRet ) { printf("MagickReadImage fail.\n"); } printf("read sucess..\n"); //获取 MagickSizeType size = MagickGetImageSize(im); unsigned long width = MagickGetImageWidth(im); unsigned long height = MagickGetImageHeight(im); size_t quality = MagickGetImageCompressionQuality(im); char *format = MagickGetImageFormat(im); printf("src size=%ld\n", size); printf("src width=%d\n", width); printf("src height=%d\n", height); printf("src quality=%d\n", quality); printf("src format=%s\n", format); //修改质量 quality = 100; MagickSetImageCompressionQuality(im, quality); //生成 char *buff = NULL; size_t len = 0; buff = (char *)MagickWriteImageBlob(im, &len); int fd = -1; fd = open("cover1", O_WRONLY | O_TRUNC | O_CREAT, 00644); int wlen = write(fd, buff, len); printf("write len=%d\n", wlen); close(fd); return 0; }
代码中先是获取原图,然后设置原图质量,最后生成新图。貌似并没有什么改变。
最后经过调试发现,问题在于:设置了新图的质量为100,但其实原图的质量未必为100。从而导致图片变大。
最后通过ImageMagick自带的工具 compare 对比原图和新图,发现图片的差异在于下图:(红色部分即为差异)
实际经过“提升质量到100”的新图,在肉眼上与质量为75的原图并无区别。
所以不要错误的认为原图质量都为100,设置新图质量之前,可以先参考原图的质量。