在做人脸识别底库图片导入的时候,需要支持主流的图片的格式,如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 int getPicType(unsigned char * data, int isize)
 2 {
 3     if (data == NULL || isize < 4)
 4     {
 5         return -1;
 6     }
 7
 8     // JPEG (jpg),文件头:FFD8FF
 9     if (data[0] == 0xFF && data[1] == 0xD8 && data[2] == 0xFF)
10     {
11         return CXIMAGE_FORMAT_JPG;
12     }
13     // PNG (png),文件头:89504E47
14     else if (data[0] == 0x89 && data[1] == 0x50
15         && data[2] == 0x4E && data[3] == 0x47)
16     {
17         return CXIMAGE_FORMAT_PNG;
18     }
19     // Windows Bitmap (bmp),文件头:424D
20     else if (data[0] == 0x42 && data[1] == 0x4D)
21     {
22         return CXIMAGE_FORMAT_BMP;
23     }
24     else
25     {
26         return -1;
27     }
28 }
29
30 int picCompress(char * data, int iSize, char * out, int & outSize)
31 {
32     int picType = getPicType((unsigned char *)data, iSize);
int iTmpOutSize = 0;
33 if (picType == -1) 34 { 35 printf("picType is not valid.\n"); 36 return -1; 37 } 38 CxImage image((BYTE *)data,iSize,picType); 39 if (!image.IsValid()) 40 { 41 printf("picCompress image is not valid.\n"); 42 return -1; 43 } 44 45 if (image.GetWidth() > 400 || image.GetHeight() > 300) 46 { 47 //缩放一下 48 int rewith = (image.GetWidth() > 400 ? 400 : image.GetWidth()); 49 int height = (image.GetHeight() > 300 ? 300 : image.GetHeight()); 50 image.Resample(rewith, height, 1); 51 } 52 53 image.SetJpegQuality(JPEG_QUILTY_DEFAULT); 54 55 CxMemFile memfile; 56 memfile.Open(); 57 image.Encode(&memfile, CXIMAGE_FORMAT_JPG); 58 BYTE *pImageBuf = memfile.GetBuffer(); 59 iTmpOutSize = memfile.Size(); 60 if (iTmpOutSize <= outSize) 61 {
   outSize = iTmpOutSize;
62 memcpy(out, pImageBuf, outSize); 63 } 64 else 65 { 66 outSize = 0; 67 } 68 image.FreeMemory(pImageBuf); 69 memfile.Close(); 70 return 0; 71 }
01-04 15:59
查看更多