VC++使用CImage在内存中Bmp转换Jpeg图片

之前写了一篇《VC++使用CImage在内存中Jpeg转换Bmp图片》,通过CImage实现了在内存中Jpeg转Bmp。

既然Jpeg能转Bmp,那CImage也支持Bmp转Jpeg,与上一篇文章依赖CImage的Load函数相反,Bmp转Jpeg通过Save函数实现:

使用的也是IStream接口的函数重载,具体可以参考MSDN:http://msdn.microsoft.com/zh-cn/library/d06f3fhw.aspx

下面贴出使用CImage在内存中Bmp转换Jpeg的代码:

unsigned long BMP2JPEG(char* pUnZipData,unsigned long ulUnZipDataLen,char** pBuffer)
{
	unsigned long ulBufferLen = 0;

	HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, ulUnZipDataLen);
	void* pData = GlobalLock(hGlobal);
	memcpy(pData, pUnZipData, ulUnZipDataLen);
	GlobalUnlock(hGlobal);  

	IStream* pStream = NULL;
	if(CreateStreamOnHGlobal(hGlobal, TRUE,  & pStream) == S_OK)
	{
		CImage image;
		if (SUCCEEDED(image.Load(pStream)))
		{
			IStream* pOutStream = NULL;
			if(CreateStreamOnHGlobal(NULL, TRUE,  & pOutStream) == S_OK)
			{
				image.Save(pOutStream, Gdiplus::ImageFormatJPEG);
				HGLOBAL hOutGlobal= NULL;
				GetHGlobalFromStream(pOutStream,&hOutGlobal);
				LPBYTE pBits= (LPBYTE)GlobalLock(hOutGlobal);
				ulBufferLen =(DWORD)GlobalSize(pBits);

				*pBuffer = new char[ulBufferLen];
				memcpy(*pBuffer, pBits, ulBufferLen);

				GlobalUnlock(hOutGlobal);
				pOutStream->Release();
			}
		}
		pStream->Release();
	}
	GlobalFree(hGlobal);  

	return ulBufferLen;
}


记录,为更好的自己!

时间: 2024-11-08 22:22:33

VC++使用CImage在内存中Bmp转换Jpeg图片的相关文章

VC++使用CImage在内存中Jpeg转换Bmp图片

VC++中Jpeg与Bmp图片格式互转应该是会经常遇到,Jpeg相比Bmp在图片大小上有很大优势. 本文重点介绍使用现有的CImage类在内存中进行转换,不需要保存为文件,也不需要引入第三方库. Libjpeg库在8以后也支持了内存读取和转换,不过使用起来较为麻烦,还需要手动编译,用CImage类完全可以实现,代码更简洁. 实现方法: VC++对Jpeg.Png图片的操作主要使用CImage,相信很多人用过CImage的Load和Save函数从文件读取或保存Jpeg或Png格式的文件,这两个重载

知道内存中一个图片的指针IntPtr大小,转换成图片显示

//nSize 为总长度//pImageData 为总数据//nImageSize //一个图片的长度 byte[] _bytes = new byte[nImageSize];// //IntPtr infosIntptr = Marshal.AllocHGlobal(pImageData); Marshal.Copy(pImageData, _bytes, 0, nImageSize);//复制 PtrMoveSize(ref pImageData, nImageSize);//丛总内存中去

Android内存中的图片

图片在内存中的大小 Android.graphics.Bitmap类里有一个内部类Bitmap.Config类,在Bitmap类里createBitmap(intwidth, int height, Bitmap.Config config)方法里会用到,打开个这个类一看 枚举变量public static final Bitmap.Config ALPHA_8public static final Bitmap.Config ARGB_4444public static final Bitma

图片在内存中的大小

Android.graphics.Bitmap类里有一个内部类Bitmap.Config类,在Bitmap类里createBitmap(intwidth, int height, Bitmap.Config config)方法里会用到,打开个这个类一看 枚举变量public static final Bitmap.Config ALPHA_8public static final Bitmap.Config ARGB_4444public static final Bitmap.Config A

VC++使用CImage PNG转BMP图片透明背景处理

PNG格式的图片是支持透明通道的,BMP格式的图片是没有透明通道的,所以当PNG格式的图片转换为BMP格式时,对于PNG图片的透明背景就需要进行特别的处理. VC++中的HBITMAP是支持透明色的,如果HBITMAP是PNG格式图片的句柄,使用CImage:Save或其它方式保存到文件时,透明背景会变成黑色. 解决这个问题可以用GDI+.LIBPNG等,最简单的方式是使用CImage,直接将图像数据中的透明部分替换为白色或其他颜色. 优点:处理方法简单,效率高,只需CImage: 缺点:在图片

移码及浮点数在内存中的存储方式

首先说一下十进制的小数怎么转化为二进制的小数,计算机根本就不认识10进制的数据,他只认识0和1,所以,10进制的小数在计算机中是用二进制的小数表示的. 十进制的小数转化为二进制的小数的方法: 可以简单的概括为正序取整,将十进制的小数部分乘以2,然后取整数部分. 例如将0.2转化为二进制的小数,那么0.2*2=0.4,其整数部分是0,所以二进制小数的第一位为0,然后0.4*2=0.8,其整数部分是0,所以二进制小数的第二位为0,然后0.8*2=1.6,其整数部分是1,所以二进制小数的第三位是1,然

字符在内存中最终的表示形式是什么?是某种字符编码还是码位(Code Point)?

字符在内存中最终的表示形式是什么?是某种字符编码还是码位(Code Point)? 根据我的了解,编码中有三个核心概念:1. 字符集(Character Set),可以说是一个抽象概念,字符的合集2. 码位(Code Point),将抽象的字符集中每一个字符映射到一个整数3. 字符编码(Encoding),按照某种编码规则用二进制来表示一个字符 我对码位这个概念理解的不是很清楚,Code point中说: The notion of a code point is used for abstra

关于内存中堆和栈的知识和应用的总结

以前做的一个小项目最近经常不稳定,查了下日志大部分都是因为缓冲溢出而导致程序报错,于是乎在网上查找了一些关于内存使用的内容,收获颇丰.在此将前人的一些精华总结收录于此,加深印象.有不对或不足的地方请大家予以指正. 文章链接:http://blog.csdn.net/szchtx/article/details/7981401 http://www.cppblog.com/oosky/archive/2006/01/21/2958.html http://www.cnblogs.com/lln77

Delphi接口的底层实现(接口在内存中仍然有其布局,它依附在对象的内存空间中,有汇编解释)——接口的内存结构图,简单清楚,深刻 good

引言 接口是面向对象程序语言中一个很重要的元素,它被描述为一组服务的集合,对于客户端来说,我们关心的只是提供的服务,而不必关心服务是如何实现的:对于服务端的类来说,如果它想实现某种服务,实现与该服务相关的接口即可,它也不必与使用服务的客户端进行过多的交互.这种良好的设计方式已经受到很广泛的应用. 早在Delphi 3的时候就引入了接口的概念,当时完全是因为COM的出现而诞生的,但经过这么多版本的进化,Delphi的接口已经成为Object Pascal语言的一部分,我们完全可以用接口来完成我们的