您的位置:首页 > 其它

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

2015-07-03 16:07 369 查看
最新在使用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,设置新图质量之前,可以先参考原图的质量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: