社区
机器视觉
帖子详情
使用GDI+能不能将BMP保存为JPEG(Exif)??
newzk
2002-09-12 04:53:58
使用GDI+能不能将BMP保存为JPEG(Exif)??
能否告诉方法
...全文
128
5
打赏
收藏
使用GDI+能不能将BMP保存为JPEG(Exif)??
使用GDI+能不能将BMP保存为JPEG(Exif)?? 能否告诉方法
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
newzk
2002-09-17
打赏
举报
回复
这鸟玩意怎样结帖!要不请管理员帮我结了?
newzk
2002-09-17
打赏
举报
回复
这鸟玩意怎样结帖!要不请管理员帮我结了?
newzk
2002-09-13
打赏
举报
回复
先谢谢你们对我的帮助,我用的是VC + GDI+ ;我的目的是要将BMP格式转换成JPEG(EXIF)格式,也就是数码相机使用的格式;若只是转换成一般的JPEG,那是很简单的,但我要转换成JPEG(Exif)格式,我就头疼了。
asett1
2002-09-12
打赏
举报
回复
我已经实现了,都可以互相转化的,很easy
zhangyan_qd
2002-09-12
打赏
举报
回复
可以,在CSDN上以前见过一个帖子,转贴在下面。其中的程序我试过,没有问题,可以用。版权属于原作者
===================================
CSDN - 技术频道 - 文档中心 - Visual C++
标题 VC中实现多格式图像的灵活转换 hujun614(转贴)
关键字 VC 图像格式转换
出处 http://www.ccw.com.cn/htm/app/aprog/01_12_17_2.asp
四川省新都县国家税务局 周鸣扬
色彩鲜艳漂亮的高品质图像,一个个形象的Windows图标,高速运动、活灵活现的三维动画,这些生动的图形无一不显示着程序设计者的艺术才华。在程序设计中,图像处理已经成了每个程序员的必修课,所以,对于每个程序员来说,熟悉“BMP”、“GIF”、“JPEG”图像格式及具体应用、调色板、图像文件头格式、图像压缩算法等概念似乎已经成了工作中不可缺少的基础知识。面对如此多的图像格式,如果要全部掌握其具体细节,好像这对程序员有些不公。在VC中编程显示一幅位图,下列的步骤是不可少的:装入位图、获得位图的大小信息、启用设备环境、位传输,所需的程序代码显得千篇一律的冗长。如果想要装入的位图另存为其他格式的图像文件……?两个字:头疼!而这一切都是因为GDI本身的局限性所造成。
随着Windows 2000的推出,上面的情况有了大大的改观:你可以不必了解每种图像格式的具体含义,照样可以写出多格式图像浏览或转换程序,这一切,全部都依赖于Windows 2000及后继版中所使用的GDI+技术。首先来看看GDI+的具体技术细节及GDI+编程特点。
Windows 2000在用户界面方面包括了几个重大的改进,可能你已经注意到了有阴影的鼠标、渐入的工具条快速提示、透明的窗口、平滑地窗口变化等。Windows 2000在界面上之所以有这么大的改进,完全是因为Windows2000采用了一种GDI(graphics device interface :图形设备接口)。这种GDI,以前叫GDI2k,现在有了一个更好听的名字:GDI+。GDI+是一种新型的图形设备接口,它的主要特点在于它能够创建全新的用户桌面体系、能够轻易地完成二维或三维的图形处理,为桌面带来一种数字化的图片。 GDI+ 同时也提供了增强的图形处理技术,如常见的:alpha blending、 纹理、贴图、增强的文本及图片显示技术。实际上,GDI+主要的特色就在于强调通过硬件加速来达到良好的视觉感受!
同传统的GDI不同,GDI+中引入了对COM(组件对象模型)技术的支持,通过COM技术,GDI+简化了对图像文件的访问(打开、保存)程序:通过调用COM组件来实现的,GDI+扮演的只是指挥者,而非操作员。对于图像文件,GDI+所关心的不是图像文件的文件头信息,不论欲打开的文件格式是什么类型,GDI+首先要做的是在注册中查看该图像格式的编码(或解码)信息是否已经注册(HKEY_CLASSES_ROOT\MIME\Database\Content Type),如果已经注册,就通过该编码信息调用COM组件,就这么简单。这种技术其实早就在微软的其他软件中已经使用了,如IE。“体验”过NIMDA病毒的朋友可能对“audio/wav”这段代码并不陌生,NIMDA就是靠它来伪装自己的:让IE认为附件是WAV文件而自动打开可执行程序。这其实也是IE使用COM技术的一个突出表现。
配合GDI+的推出,微软也同时发布了相应的SDK,如果你已经安装了最新的Microsoft PlatForm SDK或已经开始使用VS .NET,GDI+ SDK已经在你的系统中了。如果没有的话,可以到http://noner.top263.net/progtool上去下载GDI+的头文件和库文件。在使用GDI+之后,, 再有没有必要去考虑什么句柄、设备环境这样的概念了。你只需要简单地创建一个图形对象(Graphics object),然后直接调用该对象的方法(methods)进行绘图即可。图形对象是GDI+中核心,正如DC之于GDI那样。图形对象和DC有许多相似的地方,在使用上遵循着相同的使用规则,但是两者在本质上已经有很大的区别。一个是基于句柄的GDI,一个是基于组件对象模型的GDI+。使用GDI+的SDK编程,必须得按照下面的规范来进行:使用GDI+的名空间(namespace Gdiplus)、在使用GDI+函数时必须进行GDI+的初始化,使用完毕之后也得销毁GDI+,这种规范在下面所列的程序中有详细的说明。
前面说到了GDI+是通过在注册中查看编码信息来访问图像文件的,在GDI+的SDK中,编码信息是储存在 ImageCodecInfo类中的,在这个类中,有编码的CLSID(COM组件的GUID标识码)、编码方式描述等。在GDI中,在注册表中访问编码信息通常使用以下两个函数来实现:
1、查看系统中可用的图像编码信息(数量及大小)
Status GetImageEncodersSize(
UINT* numEncoders, //存储编码器数量的地址
UINT* size //存储编码信息所需内存大小
);
2、得到所有的编码信息
Status GetImageEncoders(
UINT numEncoders,//可用编码器数量
UINT size,//储存编码器信息所需内存(由ImageCodecInfo类组成的数组的大小)
ImageCodecInfo* encoders//编码器信息指针
);
在GetImageEncoders函数中,参数numEncoders和size都是由GetImageEncodersSize所返回的。下面的代码就能够在注册表中查找具体格式图像的编码方式:
int GetImageCLSID(const WCHAR* format, CLSID* pCLSID)
{//得到格式为format的图像文件的编码值,访问该格式图像的COM组件的
//GUID值保存在pCLSID中
UINT num = 0;
UINT size = 0;
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
if(size == 0)
return FALSE; // 编码信息不可用
//分配内存
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return FALSE; // 分配失败
//获得系统中可用的编码方式的所有信息
GetImageEncoders(num, size, pImageCodecInfo);
//在可用编码信息中查找format格式是否被支持
for(UINT i = 0; i < num; ++i)
{ //MimeType:编码方式的具体描述
if( wcscmp(pImageCodecInfo[i].MimeType, format) == 0 )
{
*pCLSID = pImageCodecInfo[i].Clsid;
free(pImageCodecInfo);
return TRUE;
}
}
free(pImageCodecInfo);
return FALSE;
}
有了这种认识,实现多格式的图像的浏览与转换就并不是什么难事了。为了讲述的方便,首先在VC中建立一个SDI项目ImageShow,首先对使用GDI+申明和初始化及销毁进行代码编制,具体代码如下:
#include "Gdiplus.h"
using namespace Gdiplus;
CImageShowView::CImageShowView()
{
//初始化GDI+
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
}
CImageShowView::~CImageShowView()
{
//销毁GDI+
ULONG_PTR gdiplusToken;
GdiplusShutdown(gdiplusToken);
}
接着通过类向导(Class Wizard),重载“文件”菜单中的“打开”和“另存为”两项,为了编程的简单,本程序只将当前打开的图像文件直接存为BMP文件(实际上保存成其他格式的文件也很简单,只不过是对文件名进行分析而已)。另外,为了在打开和保存文件进行文件名的传递,首先应在CImageShowView类中加入一全局变量“CString strOpenFileName”。“打开”和“另存为”两项的响应代码如下,大家通过代码中的注释部份理解编程思路,应该不会有什么问题:
WCHAR* ToWChar(char * str)
{
//在GDI+中,有关字符的参数类型全部都是WCHAR类型的
//该函数是将传统字符串进行转换
static WCHAR buffer[1024];
wcsset(buffer,0);
MultiByteToWideChar(CP_ACP,0,str,strlen(str),buffer,1024);
return buffer;
}
void CImageShowView::OnFileOpen()
{
//本程序能够打开各类常见格式的图像文件
static char szFilter[]="常见格式图形文件(*.*)|*.*|";
CFileDialog dlgChoseImage(1,NULL,NULL,NULL,szFilter);
if(dlgChoseImage.DoModal()==IDOK)
{
strOpenFileName=dlgChoseImage.GetPathName();
//打开文件后立即在窗口中显示(重绘客户窗口)
this->Invalidate();
}
}
void CImageShowView::OnFileSaveAs()
{
if(strOpenFileName.IsEmpty())
{
AfxMessageBox("当前没有打开图像文件,不能进行保存!");
return;
}
//建立图形对像
Graphics graphics(GetDC()->m_hDC);
//装入当前已经打开的图形文件
Image image(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength())));
CString strFileSave;
//当其他格式的图像全部另存为BMP文件
static char szFilter[]="位图(*.BMP)|*.BMP|";
CFileDialog dlgChoseImage(0,"BMP",NULL,NULL,szFilter);
if(dlgChoseImage.DoModal()==IDOK)
{
strFileSave=dlgChoseImage.GetPathName();
CLSID clsid;
if(GetImageCLSID(L"image/bmp", &clsid))
{
image.Save(ToWChar(strFileSave.GetBuffer(strFileSave.GetLength())), &clsid, NULL);
//将保存后的图像进行显示
strOpenFileName=strFileSave;
this->Invalidate();
}
}
}
最后,为了显示浏览图像转换前后的效果,还应该在窗口中分另绘制转换前后的图像,这很容易,只需要在OnDraw函数中添加绘制代码,如下所述:
void CImageShowView::OnDraw(CDC* pDC)
{
CImageShowDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//如果没有选择显示图形文件,则不用重绘
if(strOpenFileName.IsEmpty())
return;
//显示当前打开的图像文件的全名
this->GetParent()->SetWindowText(strOpenFileName);
//建立图形对象
Graphics graphics(pDC->m_hDC);
//装入图形文件
Image image(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength())));
Point destPoints[3] =
{
Point(0, 0),
Point(image.GetWidth(), 0),
Point(0, image.GetHeight())
在VC++6.0中将JPG格式图片转换成
BMP
格式
这是利用
GDI+
库的方法完成GIF、
JPEG
、
Exif
、PNG 、TIFF 、ICON、WMF 、EMF等多种格式的图片转成
BMP
,本文章的基础上,对各种格式的图片进行编辑,如区域选定变色,灰度化等!本文章所讲例子都经过了调试,可直接...
用
GDI+
转
BMP
为WMF、
EXIF
、EMF格式
从MSDN上可以看到用
GDI+
的Image::Save方法可以很容易的实现把图片
保存
为
BMP
、GIF、TIFF、PNG、
JPEG
格式。虽然
GDI+
的Metafile类给了我们读取EMF、WMF格式图片方便,但是这个类没有直接提供
保存
的方法来写EMF、
EXIF
、...
3天掌握Windows
GDI+
图形编程
GDI的出现使程序员无需要关心硬件设备及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,大大方便了开发工作。
GDI+
(Graphics Device ...
使用
GDI+
编程
顾名思义,
GDI+
是以前版本GDI的继承者,出于兼容性考虑,Windows XP仍然支持以前版本的GDI,但是在开发新应用程序的时候,开发人员为了满足图形输出需要应该
使用
GDI+
,因为
GDI+
对以前的Windows版本中GDI进行了优化,...
VC下如何
使用
GDI+
进行图像程序设计
原作者:孙涛 整理 ...
GDI+
介绍 Microsoft® Windows®
GDI+
是Windows XP... 如同它的名字暗示一样,
GDI+
是Windows 图形设备接口(GDI)的继承者, 这个图形设备接口包括早期的Windows版本。 Windows XP 或者 Win
机器视觉
4,446
社区成员
15,335
社区内容
发帖
与我相关
我的任务
机器视觉
图形图像/机器视觉
复制链接
扫一扫
分享
社区描述
图形图像/机器视觉
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章