使用ImageMagick處理圖片後致使圖片變大的問題

最新在使用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,設置新圖質量以前,能夠先參考原圖的質量。圖片

相關文章
相關標籤/搜索