• C++ 图片格式转化和压缩


          在做人脸识别底库图片导入的时候,需要支持主流的图片的格式,如jpeg、bmp、png等格式。所以需要对图片进行格式转化。图片过大的话,还有进行缩放等。本文介绍的是利用cximage开源库,来进行对图片进行格式转化和压缩。

         使用cximage库的好处是支持各种平台,如windows、linux系统上都可以使用。

         1、首先从开源网站上下载cximage库。

           一般下载下来的cximage库支持大部分的图片格式,可以根据项目要求,进行裁剪,比如支持jpeg、bmp和png三种格式的话,可以裁剪到很多库。

         修改的头文件:ximacfg.h, 不需要支持的图片格式,可以直接改成0

        

      2、本次用到的函数介绍:

       1)、bool Load(const TCHAR* filename, DWORD imagetype=0);

              CxImage(const TCHAR * filename, DWORD imagetype);

          可以直接传入一个路径,直接加载

       2)CxImage(BYTE * buffer, DWORD size, DWORD imagetype);

          也可以通过上面的构造函数,直接传入图片的内存数据和大小

       3)bool IsValid() const;

        检查图片是否正确初始化

      4)bool Resample(long newx, long newy, int mode = 1, CxImage* iDst = NULL);

         自定义图片大小(缩放)

      3、下面的一段代码是把bmp、png格式的图片转成jpeg格式,如果图片过大,并进行缩放。

       ※ cximage转化后的jpeg格式是420采样的。

     1 // 图片压缩和格式转化
     2 int CompressPicure(char * inData, int inSize, char * outData, int & outSize)
     3 {
     4     int picType = getPictureType((unsigned char *)inData, inSize);
     5     int iTmpOutSize = 0;
     6     if (picType == -1)
     7     {
     8         printf("picType  is not valid.
    ");
     9         return -1;
    10     }
    11     CxImage image((BYTE *)inData, inSize, picType);
    12     if (!image.IsValid())
    13     {
    14         printf("image is not valid.
    ");
    15         return -1;
    16     }
    17 
    18     if (image.GetWidth() > 400 || image.GetHeight() > 300)
    19     {
    20         //缩放一下
    21         int rewith = (image.GetWidth() > 400 ? 400 : image.GetWidth());
    22         int height = (image.GetHeight() > 300 ? 300 : image.GetHeight());
    23         image.Resample(rewith, height, 1);
    24     }
    25 
    26     image.SetJpegQuality(JPEG_QUALITY_DEFAULT);
    27 
    28     CxMemFile memfile;
    29     memfile.Open();
    30     image.Encode(&memfile, CXIMAGE_FORMAT_JPG);
    31     BYTE *pImageBuf = memfile.GetBuffer();
    32     iTmpOutSize = memfile.Size();
    33     if (iTmpOutSize <= outSize)
    34     {
    35        outSize = iTmpOutSize;
    36         memcpy(outData, pImageBuf, outSize);
    37     }
    38     else
    39     {
    40         outSize = 0;
    41     }
    42     image.FreeMemory(pImageBuf);
    43     memfile.Close();
    44     return 0;
    45 }

    获取图片格式 ,只支持png、bmp和jpeg。

    int getPictureType(unsigned char * data, int isize)
    {
        if (data == NULL || isize < 4)
        {
            return -1;
        }
    
        // JPEG (jpg),文件头:FFD8FF
        if (data[0] == 0xFF && data[1] == 0xD8 && data[2] == 0xFF)
        {
            return CXIMAGE_FORMAT_JPG;
        }
        // PNG (png),文件头:89504E47
        else if (data[0] == 0x89 && data[1] == 0x50
            && data[2] == 0x4E && data[3] == 0x47)
        {
            return CXIMAGE_FORMAT_PNG;
        }
        // Windows Bitmap (bmp),文件头:424D
        else if (data[0] == 0x42 && data[1] == 0x4D)
        {
            return CXIMAGE_FORMAT_BMP;
        }
        else
        {
            return -1;
        }
    }
    高山流水,海纳百川!
  • 相关阅读:
    php 接口类与抽象类的实际作用
    php中的implements 使用详解
    swoole两种运行模式BASE和PROCESS的区别
    Java多线程总结
    Shell WordCount:一行shell命令统计固定格式单词词频
    收藏大数据相关写的比较好的博客
    Hive-SQL查询连续活跃登陆的用户
    Mysql触发器
    Python json字符串和字典相互转换
    MySQL基础之实现累加值
  • 原文地址:https://www.cnblogs.com/ahcc08/p/11842366.html
Copyright © 2020-2023  润新知