CxImage内存方式转换图像

最近,处于项目需要,需要将Bmp转换为JPEG格式。以前做过,采用的是GDI+的方式,该方式有一个极大地缺陷为无法实现跨平台处理。闲话少说,进入正题。

[cpp] view plain copy

  1. CxImage cxImageBmp(pRGBBuffer, dwRGBSize, CXIMAGE_FORMAT_BMP);
  2. cxImageBmp.Save("D:\\ttt.jpg",CXIMAGE_FORMAT_JPG);

该方式很正常,顺利将RGB格式24位BMP图像转化为本地JPG文件并保存下来。

但是采用以下内存转换方式,却失败了。

[cpp] view plain copy

  1. BYTE* pJpgDataTemp = new BYTE[1024 * 1024];
  2. int lJpgSize = 0;
  3. bool b = cxImageBmp.Encode(pJpgDataTemp, lJpgSize, CXIMAGE_FORMAT_JPG);

一方面,函数返回值为false;另一方面,数据长度,lJpgSize为0。

后来,经过以下修改,成功。

[cpp] view plain copy

  1. BYTE* pJpgDataTemp =NULL;
  2. int lJpgSize = 0;
  3. bool b = cxImageBmp.Encode(pJpgDataTemp,lJpgSize,CXIMAGE_FORMAT_JPG);

为什么?下面我们从CxImage::Encode()定义中进行查看:

[cpp] view plain copy

  1. bool CxImage::Encode(BYTE * &buffer, long &size, DWORD imagetype)
  2. {
  3. if (buffer!=NULL)
  4. {
  5. strcpy(info.szLastError,"the buffer must be empty");
  6. return false;
  7. }
  8. CxMemFile file;
  9. file.Open();
  10. if(Encode(&file,imagetype))
  11. {
  12. buffer=file.GetBuffer();
  13. size=file.Size();
  14. return true;
  15. }
  16. return false;
  17. }

真相大白!

时间: 2024-07-28 20:17:01

CxImage内存方式转换图像的相关文章

OpenCV中Mat,图像二维指针和CxImage类的转换

在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转换和相应的对应关系. 一.OpenCV的Mat类到图像二值指针的转换 以下为函数代码: unsigned char** MatTopImgData(Mat img) { //获取图像参数 int row = img.rows; int col = img.cols; int band = img.c

OpenCV4Android开发环境搭建两种方式加上图像二值化

1.环境搭建 进行android开发所需要的环境一般为:eclipse + android sdk + ADT,而OpenCV的开发由于需要编写本地代码(C/C++),因此还需要安装以下工具:NDK,Cygwin,CDT.网上都有大量详细的安装讲解,本文只描述下其中关键步骤. 1.1 NDK的安装 (1) NDK下载后解压到固定目录即可,无需安装.本文解压到D盘根目录下,其路径为:D:\android-ndk-r8d: (2) 添加环境变量,将其安装路径添加到系统path变量中,并添加系统变量N

opencv2 矩阵方式 resize图像缩放代码(转载)

http://blog.sina.com.cn/s/blog_74a459380101r0yx.html opencv2 矩阵方式 resize图像缩放代码(转载) (2014-05-16 09:55:35) 转载▼   分类: Opencv_Function 最近学习opencv的时候遇到的一些技术问题,拿出来分享一下.opencv1和opencv2最大的区别就是c++支持,这使得网上有些资料是opencv1的c语言写的,而有些人喜欢c++,当然接口函数也就不同了.下面是一个c++的openc

内存地址转换与分段

 原文标题:Memory Translation and Segmentation 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外高手的精彩文章翻译一下.一来自己复习,二来与大家分享.] 本文是Intel兼容计算机(x86)的内存与保护系列文章的第一篇,延续了启动引导系列文章的主题,进一步分析操作系统内核的工作流程.与以前一样,我将引用Linux内核的源代码,但对Windows只给出示例(抱歉,我忽略了BSD,Mac等系统,但大

Memory Translation and Segmentation.内存地址转换与分段

原文标题:Memory Translation and Segmentation 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外高手的精彩文章翻译一下.一来自己复习,二来与大家分享.] 本文是Intel兼容计算机(x86)的内存与保护系列文章的第一篇,延续了启动引导系列文章的主题,进一步分析操作系统内核的工作流程.与以前一样,我将引用Linux内核的源代码,但对Windows只给出示例(抱歉,我忽略了BSD,Mac等系统,但大部分的

linux下 文件夹和文件的字符集编码方式转换

网站有一些课件资源,课件资源是从windows传到Linux服务器,在windows下文件夹编码方式为GBK,而浏览器默认的编码模式为UTF-8(服务器默认编码也为UTF-8),如此,便导致了类似http://xxxx//Resources/北师大/初中语文/八年级上/本册综合/绿.ppt  这样的域名的无法访问,提示找不到资源.解决办法:用convmv工具将Resources目录下的所有文件的名称使用utf-8重新编码下载convmv:wget  https://www.j3e.de/linu

brk 和 sbrk()的使用 及分配内存方式

brk 和 sbrk的使用: 作用:malloc的底层实现,用于分配开辟内存,但是brk是系统调用 而sbrk不是  ,sbrk调用了brk 用法: 特别注意 : brk返回值 0成功 -1 失败                         sbrk返回的是开辟之前的地址,错误返回-1                开辟后要brk(p)释放掉内存空间简单示例: 1 1 #include <stdio.h> 2 2 #include <unistd.h> 3 3 #include

linux进程间通信,使用共享内存方式

闲来没事给想要学习进程间使用共享内存通信的例子,共享内存的效率比消息队列.信号量都要高?为什么呢? (1)共享内存是运行在用户空间的,由应用程序控制. (2)消息队列和信号量都是把数据从一个进程用户空间复制到内核空间,然后再由内核控件复制到另外一个进程的用户空间. #include <unistd.h> #include <stdio.h> #include <string.h> #include <sys/mman.h> #include <sys/

MAC中用ImageMagick转换图像

MAC上,安装imagemagic: 下载: http://www.imagemagick.org/script/binary-releases.php#macosx 安装: Create (or choose) a directory to install the package into and change to that directory, for example: $ cd $HOME Next, extract the contents of the package. For ex