在做人脸识别底库图片导入的时候,需要支持主流的图片的格式,如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采样的。

 // 图片压缩和格式转化
int CompressPicure(char * inData, int inSize, char * outData, int & outSize)
{
int picType = getPictureType((unsigned char *)inData, inSize);
int iTmpOutSize = ;
if (picType == -)
{
printf("picType is not valid.\n");
return -;
}
CxImage image((BYTE *)inData, inSize, picType);
if (!image.IsValid())
{
printf("image is not valid.\n");
return -;
} if (image.GetWidth() > || image.GetHeight() > )
{
//缩放一下
int rewith = (image.GetWidth() > ? : image.GetWidth());
int height = (image.GetHeight() > ? : image.GetHeight());
image.Resample(rewith, height, );
} image.SetJpegQuality(JPEG_QUALITY_DEFAULT); CxMemFile memfile;
memfile.Open();
image.Encode(&memfile, CXIMAGE_FORMAT_JPG);
BYTE *pImageBuf = memfile.GetBuffer();
iTmpOutSize = memfile.Size();
if (iTmpOutSize <= outSize)
{
outSize = iTmpOutSize;
memcpy(outData, pImageBuf, outSize);
}
else
{
outSize = ;
}
image.FreeMemory(pImageBuf);
memfile.Close();
return ;
}

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

int getPictureType(unsigned char * data, int isize)
{
if (data == NULL || isize < )
{
return -;
} // JPEG (jpg),文件头:FFD8FF
if (data[] == 0xFF && data[] == 0xD8 && data[] == 0xFF)
{
return CXIMAGE_FORMAT_JPG;
}
// PNG (png),文件头:89504E47
else if (data[] == 0x89 && data[] == 0x50
&& data[] == 0x4E && data[] == 0x47)
{
return CXIMAGE_FORMAT_PNG;
}
// Windows Bitmap (bmp),文件头:424D
else if (data[] == 0x42 && data[] == 0x4D)
{
return CXIMAGE_FORMAT_BMP;
}
else
{
return -;
}
}

C++ 图片格式转化和压缩的更多相关文章

  1. 基于Python PIL实现简单图片格式转化器

    基于Python PIL实现简单图片格式转化器 目录 基于Python PIL实现简单图片格式转化器 1.简介 2.前期资料准备 2.1.1如何实现图片格式转换? 2.1.2如何保存需要大小的图片? ...

  2. 聊一聊几种常用web图片格式:gif、jpg、png、webp

    前言 在大多数的web页面中,图片占到了页面大小的60%-70%.因此在web开发中,不同的场景使用合适的图片格式对web页面的性能和体验是很重要的.图片格式种类非常多,本文仅针对几种web应用中常用 ...

  3. gif,jpg(jpeg),png,webp,base64图片格式比较

    对于web前端开发的同学来说,图片保存格式非常的重要.那么该如何选择图片保存的格式呢?下面我总结一下gif,jpg,png等图片格式的区别. gif是很早应用的一种图片格式.它采用的是lzw的压缩算法 ...

  4. vue实现PC端调用摄像头拍照人脸录入、移动端调用手机前置摄像头人脸录入、及图片旋转矫正、压缩上传base64格式/文件格式

    进入正题 1. PC端调用摄像头拍照上传base64格式到后台,这个没什么花里胡哨的骚操作,直接看代码 (canvas + video) <template> <div> &l ...

  5. [html] Webp、Apng图片格式

    WebP格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式.图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器带宽资源和数据空间. 与JPEG相同,WebP是一种有损压缩.但谷 ...

  6. Google最新的图片格式WEBP全面解析

    前言 不管是 PC 还是移动端,图片一直是流量大头,以苹果公司 Retina 产品为代表的高 PPI 屏对图片的质量提出了更高的要求,如何保证在图片的精细度不降低的前提下缩小图片体积,成为了一个有价值 ...

  7. 关于webp图片格式初探

    前言 不管是 PC 还是移动端,图片一直是流量大头,以苹果公司 Retina 产品为代表的高 PPI 屏对图片的质量提出了更高的要求,如何保证在图片的精细度不降低的前提下缩小图片体积,成为了一个有价值 ...

  8. c语言数字图像处理(一):bmp图片格式及灰度图片转换

    本篇文章首先介绍了bmp图片格式,主要参考wiki上的内容,包括bmp文件的存储方式,对于一些常见的bmp文件格式都给了例子,并且对8位 16位RGB555 16位RGB565格式的bmp文件进行了简 ...

  9. 【VC++技术杂谈007】使用GDI+进行图片格式转换

    本文主要介绍如何使用GDI+对图片进行格式转换,可以转换的图片格式为bmp.jpg.png. 1.加载GDI+库 GDI+是GDI图形库的一个增强版本,提供了一系列Visual C++ API.为了使 ...

随机推荐

  1. 跟我一起认识axure(一)

    第一步下载:https://www.axure.com.cn/ 第二步点击安装,一路next 第三步:认识Axure RP工作界面

  2. 阿里云发布敏感数据保护产品SDDP,数据贴身防护实现“外防内控”

    数据安全问题,尤其是个人信息保护问题,一直是所有企业和个人关注的重点问题,7月10日,阿里云针对云上企业正式发布一款敏感数据保护产品SDDP(Sensitive Data Detection and ...

  3. hdu 3652 【数位dp】

    hdu 3652 题意:求1到n中包含'13'('13'不一定连续)且能被13整除的数的个数. 这是我第一道比较了能看懂的数位dp.定义状态dp[pos][res][sta]表示处理到第pos位,模的 ...

  4. 2019-1-16-win10-uwp-发布的时候-ILC-编译不通过

    title author date CreateTime categories win10 uwp 发布的时候 ILC 编译不通过 lindexi 2019-1-16 20:37:5 +0800 20 ...

  5. css浮动规则

    1.浮动元素会从文档正常流中删除,但它仍会影响布局 2.浮动非替换元素必须为其指定width,否则元素的width会趋于0而导致浮动元素不能完整显示3.一旦元素具有了浮动属性,它便成为了一个块级元素. ...

  6. vue init定制团队模板使用方法

    每次做项目都要自己搭建项目目录,或者换了公司就的重新搭建项目目录,是不是很麻烦呢?有没有想过一次性把项目目录搭建好,以后直接用呢?你首先想到的可能是复制自己原来的项目,然后删除.修改等等.然而有个更方 ...

  7. Android 性感美图在线浏览APP

    周末无聊,遂整理了下近来常用的几个开源库,无意间又发现了一些开放接口,于是乎决定融合在一起,做个简单的"性感美图"浏览的APP,名字呢,就叫"性感沙滩",效果如 ...

  8. Python 基础09 面向对象的进一步拓展

    调用类的其他信息 上一讲中提到,在定义方法时,必须有self这一个参数,这个参数表示某个对象,对象有有类的所有性质, 那么我么可以通过self 调用类属性. class Human(object): ...

  9. spark.read.csv读取CSV文件 ArrayIndexOutOfBoundsException报错

    通过 spark.read.csv读取CSV文件时,遇到 到 ArrayIndexOutOfBoundsException报错,初步判断是缺少参数导致,放百度看看,没找引起问题相关的参数. 第一个看到 ...

  10. windows环境下安装nodeJS和express,一直提示command not found-配置环境变量

    1.安装NodeJS后,使用npm指令安装express框架,使用 npm install -g express npm install -g express-generator 安装了大半天的时间, ...