使用ImageMagick处理图片后导致图片变大的问题

最新在使用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,设置新图质量之前,可以先参考原图的质量。

 

posted on 2015-07-03 16:07  solohac  阅读(1099)  评论(0)    收藏  举报

导航