zoukankan      html  css  js  c++  java
  • 使用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.
    ");
        }
        
        printf("read sucess..
    ");
    
        //获取
        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
    ", size);
        printf("src width=%d
    ", width);
        printf("src height=%d
    ", height);
        printf("src quality=%d
    ", quality);
        printf("src format=%s
    ", 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
    ", wlen);
        close(fd);
    
        return 0;
    }

    代码中先是获取原图,然后设置原图质量,最后生成新图。貌似并没有什么改变。

    最后经过调试发现,问题在于:设置了新图的质量为100,但其实原图的质量未必为100。从而导致图片变大。

    最后通过ImageMagick自带的工具 compare 对比原图和新图,发现图片的差异在于下图:(红色部分即为差异)

    实际经过“提升质量到100”的新图,在肉眼上与质量为75的原图并无区别。

    所以不要错误的认为原图质量都为100,设置新图质量之前,可以先参考原图的质量。

  • 相关阅读:
    Hadoop、Spark和Storm
    bro安装过程(纪念其中遇到的坑)
    tensorflow中出现{TypeError}unhashable type: 'numpy.ndarray'
    Python高级函数(map,reduce,cmp,filter,闭包,lambda )
    Java中设置百分数保留两位小数
    查看python支持的whl文件类型
    js 图表转图片
    dorado 7 使用总结
    Socket 接收本地短连接并转发为长连接 多线程
    java Socket 长连接 心跳包 客户端 信息收发 demo
  • 原文地址:https://www.cnblogs.com/solohac/p/4618906.html
Copyright © 2011-2022 走看看