`
coding1688
  • 浏览: 232703 次
  • 来自: 上海
社区版块
存档分类
最新评论

VC/MFC怎样将位图CBitmap对象保存成为jpg格式文件?

 
阅读更多

VC/MFC怎样将位图CBitmap对象保存成为jpg格式文件?

前面几篇文章中已经实现了将 CBitmap 对象保存为 bmp 格式文件,以及将 bmp 格式转换成 jpg 格式,中间绕了一道弯,为什么不直接将 CBitmap 对象直接存为 jpg 格式呢?

 

可以借鉴下面的资料,该文中实现了先将 bmp 文件加载为 CBitmap 对象,然后使用 IJG jpeg 库函数保存为 jpg 格式文件:

VC中利用IJG库实现图片由BMP转JPG格式

http://hi.baidu.com/andyleesoft/blog/item/d6f354003fcbbe024bfb5113.html

 

我对该文中的代码进行了测试和调整,分解成两个函数:

1. 将CBitmap对象存为jpg格式文件,命名为 IJG_bmp2jpg;

1. 将bmp文件加载为CBitmap对象,然后调用第一个函数来保存为jpg格式文件。

 

/****函数功能:CBitmap存为JPG******/             
/*入口:CBitmap对象,目标文件地址,压缩质量*/
bool IJG_bmp2jpg(CBitmap& cbmp, CString Dfilepath,int quality)
{
	BITMAP bmp;


	cbmp.GetBitmap(&bmp);//获取图像信息

	if (bmp.bmBitsPixel<8)
	{
	   AfxMessageBox("不支持8位以下图像转换。");
	   return false;
	}

	byte * p = new byte[bmp.bmWidth * bmp.bmHeight*bmp.bmBitsPixel/8];//创建空间,大小=像素*每像素所占字节数

	cbmp.GetBitmapBits(bmp.bmWidth * bmp.bmHeight*bmp.bmBitsPixel/8,p);//将图像数据复制到内存

	if (bmp.bmBitsPixel==32)//32位需要特殊处理,去掉其中透明字节,并且需要改变RGB顺序
	{
  
	   for (long i=0, j=0;j<bmp.bmWidth * bmp.bmHeight*4 ;i+=3,j+=4)
	   {
		*(p+i)=*(p+j+2);
		*(p+i+1)=*(p+j+1);
		*(p+i+2)=*(p+j);
   
	   }
	}



	/************以下利用IJG库进行格式转换******************/
	struct jpeg_compress_struct jcs; /*声明JPEG压缩对象*/

	struct jpeg_error_mgr jem; /*声明错误处理器*/

	JSAMPLE *image_buffer=(JSAMPLE *)p;   /*转换的源图像缓冲区指向之前申请的内存*/

	JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */

	int row_stride; /*每行字节数*/

	jcs.err=jpeg_std_error(&jem);

	jpeg_create_compress(&jcs); /*initialize the JPEG compression object.*/

	FILE* f=fopen(Dfilepath,"wb"); /*建立JPEG文件*/

	if(f==NULL)
	{
	   AfxMessageBox("建立JPEG文件失败。");
	   fclose(f);
	   delete []p;
	   return false ;
	}

	jpeg_stdio_dest(&jcs, f); /*将目标文件与转换结果相关联*/

	jcs.image_width = bmp.bmWidth; /* image width and height, in pixels */

	jcs.image_height = bmp.bmHeight;

	jcs.input_components = (bmp.bmBitsPixel/8>=3?3:bmp.bmBitsPixel/8);   /* # of color components per pixel */

	jcs.in_color_space = JCS_RGB; /* colorspace of input image */

	jpeg_set_defaults(&jcs);

	jpeg_set_quality(&jcs, quality, TRUE /* limit to baseline-JPEG values */);

	jpeg_start_compress(&jcs, TRUE); /*开始压缩*/

	row_stride=jcs.image_width*jcs.input_components;

	while (jcs.next_scanline<jcs.image_height)
	{
	   row_pointer[0] = & image_buffer[jcs.next_scanline * row_stride];
	   (void) jpeg_write_scanlines(&jcs, row_pointer, 1);
	}

	jpeg_finish_compress(&jcs);

	fclose(f);

	jpeg_destroy_compress(&jcs);

	delete []p;

	return true;
}

/****函数功能:bmp转JPG******/             
/*入口:源文件地址,目标文件地址,压缩质量*/
bool IJG_bmp2jpg(CString Sfilepath,CString Dfilepath,int quality)
{
	CBitmap cbmp;

	HBITMAP hbitmap=(HBITMAP)::LoadImage(NULL,Sfilepath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);//位图句柄,读取外部位图

	if (hbitmap==NULL)
	{
	   AfxMessageBox("源图像读取错误");
	   return false;
	}

	cbmp.Attach(hbitmap);//将外部图像引入CBITMAP

	return IJG_bmp2jpg(cbmp, Dfilepath, quality);
}

 

调用方式如下:

				//bool IJG_bmp2jpg(CString Sfilepath,CString Dfilepath,int quality)
				IJG_bmp2jpg("clipboard.bmp", "clipboard2.jpg", 60);

				//bool IJG_bmp2jpg(CBitmap cbm,CString Dfilepath,int quality)
				IJG_bmp2jpg(*cbm, "clipboard3.jpg", 60);
 

 

3
2
分享到:
评论

相关推荐

    MFC制作的MP3

    使用MFC制作MP3打开vc6.0,建立如图所示mfc工程文件 选择基于对话框的确定 删除所有空间,建立如图所示对话框 属性如下: 播放 IDC_open; 添加 IDC_fileopen; 暂停 IDC_pause; 删除 IDC_del; 停止 IDC_stop...

    VC++实现“动态”的位图动画

    摘要:VC/C++源码,界面编程,位图动画 VC++实现“动态”的位图动画,这个比静态的BMP动画更流畅了些,具体怎么实现了,您看了源码就知道了。相关释义:  CBitmap m_Bitmap[6]; //装载要显示位图对象  int m_...

    VC读取24位位图bitmap

    使用MFC读取24位的位图! 带测试方法,改为灰度图!

    C++MFC教程

    Visual C++MFC入门教程 目录 +-- 第一章 VC入门 |------ 1.1 如何学好VC |------ 1.2 理解Windows消息机制 |------ 1.3 利用Visual C++/MFC开发Windows程序的优势 |------ 1.4 利用MFC进行开发的通用方法介绍 |----...

    人脸检测、定位技术及VC++的实现代码

    内容索引:VC/C++源码,图形处理,人脸检测, 人脸检测技术及VC++的实现代码,计算相似度、图像定位判断等,部分代码释义:  CDC *pDCShow;//用来画图的区域  CDib *m_pMainDib;//位图   RGBQUAD** m_tOriPixelArray...

    VC中的位图变透明类代码 基于Cbitmap派生

    摘要:VC/C++源码,界面编程,位图透明 运行环境:Windows/Visual C/C++

    C++ MFC实现飞机大战游戏

     (4) 复制粘贴位图到“掩码”位图的设备描述表中,这个时候“掩码”位图设备描述表中存放的位图与位图设备描述表中的位图一样;  (5) 把需要透明绘制的位图与对话框绘图相应区域的背景进行逻辑异或操作绘制到...

    VC类似QQ游戏大厅导航的树型控件

    第一步:新建一个基于对话框的MFC工程,拖动一棵标准树型控件放于界面之上。添加一个新类CTreeCtrlBT派生自CTreeCtrl。 第二步:为该类添加一些消息响应以及虚函数。其详细作用如下: void PreSubclassWindow(); //...

    VC++双缓冲技术代码演示

    摘要:VC/C++源码,控件相关,双缓冲 VC++双缓冲技术代码演示代码,虽然比较老的代码,但是仍然很有用途,源码将演示如何在VC++中实现双缓冲技术的实例,演示了使用普通方式绘图和采用双缓冲技术绘图的例子,首先给出...

    VC之美化界面篇本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础:

    VC之美化界面篇 作者:白乔 链接:http://vcer.net/1046595482643.html 本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础: 1. 大致了解MFC框架的基本运作原理; 2. 熟悉Windows...

    部分MFC和API函数

    CBitmap类:封装Windows的图形设备接口(GDI)位图 CBrush类:封装图形设备接口(GDI)中的画刷 CButton类:提供Windows按钮控件的功能 CByteArray类:该类支持动态的字节数组 CCmdUI类:该类仅用于ON_UPDATE_COMMAND_UI...

    Windows编程循序渐进.part2

    5.4.1 位图CBitmap 63 5.4.2 实例:使用GDI对象CBitmap示例 64 第6章 键盘与鼠标消息 67 6.1 键盘消息 67 6.1.1 键盘消息的类型 67 6.1.2 实例:响应键盘消息示例 68 6.1.3 模拟键盘消息 70 6.1.4 实例:...

    Windows编程循序渐进.part3

    5.4.1 位图CBitmap 63 5.4.2 实例:使用GDI对象CBitmap示例 64 第6章 键盘与鼠标消息 67 6.1 键盘消息 67 6.1.1 键盘消息的类型 67 6.1.2 实例:响应键盘消息示例 68 6.1.3 模拟键盘消息 70 6.1.4 实例:...

    Visual C++ 编程资源大全(英文源码 图形)

    1,01.zip Displaying a 256 color bitmap 在程序中显示256色的位图(6KB)&lt;END&gt;&lt;br&gt;2,02.zip Creating a bitmap object from a BMP file 从位图文件中创建位图对象(6KB)&lt;END&gt;&lt;br&gt;3,03.zip An auto-...

    Led 显示 类 数码管 数码 数字

    对象析构时会自动删除已经保存的所有的背景位图及区域. 3.使用方法(仅举一种使用方法) (Using e.g.) i. void CLEDView::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your...

    《Visual C++数字图像处理开发入门与编程实践》源码

    第4章 图像文件格式 131 4.1 图像文件概述 132 4.1.1 图像文件 132 4.1.2 图像文件的一般结构 132 4.1.3 图像文件的常用参数 133 4.2 BMP文件格式 134 4.2.1 文件结构 135 4.2.2 文件头和信息头 135 4.2.3 主要参数 ...

    VC编程控件类HTControl之CHTGDIManager GDI资源管理类用法解析

    本文主要介绍了VC编程控件类HTControl的CHTGDIManager GDI资源管理类用法,MFC提供的CBitmap类的LoadBitmap接口只能从EXE内部获取位图,但是很多情况下需要从EXE外部获取,CHTGDIManager类提供了从EXE外部获取位图的...

Global site tag (gtag.js) - Google Analytics