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

  • 相关阅读:
    2020.04.11补提
    UCF Local Programming Contest 2017(2020-04-06)
    AtCoder Beginner Contest 161
    UCF Local Programming Contest 2016(2020-03-28)
    Benelux Algorithm Programming Contest 2019(2020.03.21)
    Preliminaries for Benelux Algorithm Programming Contest 2019(2020.03.14)
    AtCoder Beginner Contest 158
    A-Leftbest
    强迫症
    不大想更了……
  • 原文地址:https://www.cnblogs.com/solohac/p/4618906.html
Copyright © 2011-2022 走看看