最新在使用ImageMagick處理圖片時,發現有時通過處理的圖片變大的問題。工具
例如原圖爲27K,經處理後的圖片會變爲77K。測試
先看測試代碼:spa
// 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。從而致使圖片變大。code
最後經過ImageMagick自帶的工具 compare 對比原圖和新圖,發現圖片的差別在於下圖:(紅色部分即爲差別)orm
實際通過「提高質量到100」的新圖,在肉眼上與質量爲75的原圖並沒有區別。blog
因此不要錯誤的認爲原圖質量都爲100,設置新圖質量以前,能夠先參考原圖的質量。圖片