在 VC++6.0 中将 JPG 格式图片转换成 BMP 格式
2013-07-16 20:07
701 查看
思路:利用 GDI+来完成
难点: (1)配置 GDI 开发环境,添加配置代码
(2)在当文档程序中添加转换代码
注意:本文档由 ybdesire 参考网上资料撰写完成,代码已经做过测试,可直接复制张贴
实现过程:
一、配置 GDI 开发环境
(1) 下载 GDI+ SDK for Visual C++ 6.0
http://www.codeguru.com/code/legacy/gdi/GDIPlus.zip
下载的GDIPlus文件夹中有Includes,Lib文件夹和gdiplus.dll文件。
将Includes和Lib中的文件分别拷到VC6安装目录中的VC98\include和lib文件夹下。
(2) 新建 MFC 单文档应用程序 show:
[cpp] view plaincopy
#include <afxdtctl.h>
#define ULONG_PTR ULONG
#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")
2、如(1)中所说,将gdiplus.dll拷贝到本工程的Debug或Release目录下
3、在show.h中的class CShowApp : public CWinApp中添加
[cpp] view plaincopy
private:
GdiplusStartupInput m_gdiplusStartupInput;
ULONG_PTR m_pGdiToken;
4、在show.cpp中的BOOL CShowApp::InitInstance()中添加
[cpp] view plaincopy
GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);
5、 CShowApp添加名字为ExitInstance的虚函数的,中添加如下退出GDI+的代码
[cpp] view plaincopy
GdiplusShutdown(m_pGdiToken);
(3) 测试 GDI+是否配置成功
[cpp] view plaincopy
void CShowView::OnDraw(CDC* pDC)
{
CShowDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
Graphics graphics(pDC->m_hDC);
Pen pen(Color(255, 0, 255));
graphics.DrawLine(&pen, 0, 0, 200, 100);
}
若能成功运行,表明GDI+配置成功
二、 添加转换代码,实现将打开的 JPG 格式文件保存成 BMP 格式文件
(1)在 CSshowView 中添加如下成员变量
[cpp] view plaincopy
CString strOpenFileName;
(2)在 CSshowView 中添加如下成员函数
1、在 CSshowView 中添加 ToWChar 函数
[cpp] view plaincopy
WCHAR* CShowView::ToWChar(char *str)
{
//在 GDI+中,有关字符的参数类型全部都是 WCHAR 类型的
//该函数是将传统字符串进行转换
static WCHAR buffer[1024];
wcsset(buffer,0);
MultiByteToWideChar(CP_ACP,0,str,strlen(str),buffer,1024);
return buffer;
}
2、在 CSshowView 中添加 GetImageCLSID 函数
[cpp] view plaincopy
int CShowView::GetImageCLSID(const WCHAR *format, CLSID *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;
}
3、在 MFC ClassWixard 中重载 OnFileOpen()
[cpp] view plaincopy
void CShowView::OnFileOpen()
{
static char szFilter[ ]="常见图像格式文件(*.*)|*.*|";
CFileDialog dlgChoseImage(1,NULL,NULL,NULL,szFilter);
if(dlgChoseImage.DoModal() ==IDOK)
{
strOpenFileName=dlgChoseImage.GetPathName();
// 打开文件后立即在窗口中显示 (重绘客户窗口)
this->Invalidate() ;
}
}
4、在 MFC ClassWixard 中重载 OnFileSave()
[cpp] view plaincopy
void CShowView::OnFileSave()
{
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",strOpenFileName,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() ;
}
}
}
转自:http://blog.sina.com.cn/s/blog_9402171001012i5u.html
难点: (1)配置 GDI 开发环境,添加配置代码
(2)在当文档程序中添加转换代码
注意:本文档由 ybdesire 参考网上资料撰写完成,代码已经做过测试,可直接复制张贴
实现过程:
一、配置 GDI 开发环境
(1) 下载 GDI+ SDK for Visual C++ 6.0
http://www.codeguru.com/code/legacy/gdi/GDIPlus.zip
下载的GDIPlus文件夹中有Includes,Lib文件夹和gdiplus.dll文件。
将Includes和Lib中的文件分别拷到VC6安装目录中的VC98\include和lib文件夹下。
(2) 新建 MFC 单文档应用程序 show:
[cpp] view plaincopy
#include <afxdtctl.h>
#define ULONG_PTR ULONG
#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")
2、如(1)中所说,将gdiplus.dll拷贝到本工程的Debug或Release目录下
3、在show.h中的class CShowApp : public CWinApp中添加
[cpp] view plaincopy
private:
GdiplusStartupInput m_gdiplusStartupInput;
ULONG_PTR m_pGdiToken;
4、在show.cpp中的BOOL CShowApp::InitInstance()中添加
[cpp] view plaincopy
GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);
5、 CShowApp添加名字为ExitInstance的虚函数的,中添加如下退出GDI+的代码
[cpp] view plaincopy
GdiplusShutdown(m_pGdiToken);
(3) 测试 GDI+是否配置成功
[cpp] view plaincopy
void CShowView::OnDraw(CDC* pDC)
{
CShowDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
Graphics graphics(pDC->m_hDC);
Pen pen(Color(255, 0, 255));
graphics.DrawLine(&pen, 0, 0, 200, 100);
}
若能成功运行,表明GDI+配置成功
二、 添加转换代码,实现将打开的 JPG 格式文件保存成 BMP 格式文件
(1)在 CSshowView 中添加如下成员变量
[cpp] view plaincopy
CString strOpenFileName;
(2)在 CSshowView 中添加如下成员函数
1、在 CSshowView 中添加 ToWChar 函数
[cpp] view plaincopy
WCHAR* CShowView::ToWChar(char *str)
{
//在 GDI+中,有关字符的参数类型全部都是 WCHAR 类型的
//该函数是将传统字符串进行转换
static WCHAR buffer[1024];
wcsset(buffer,0);
MultiByteToWideChar(CP_ACP,0,str,strlen(str),buffer,1024);
return buffer;
}
2、在 CSshowView 中添加 GetImageCLSID 函数
[cpp] view plaincopy
int CShowView::GetImageCLSID(const WCHAR *format, CLSID *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;
}
3、在 MFC ClassWixard 中重载 OnFileOpen()
[cpp] view plaincopy
void CShowView::OnFileOpen()
{
static char szFilter[ ]="常见图像格式文件(*.*)|*.*|";
CFileDialog dlgChoseImage(1,NULL,NULL,NULL,szFilter);
if(dlgChoseImage.DoModal() ==IDOK)
{
strOpenFileName=dlgChoseImage.GetPathName();
// 打开文件后立即在窗口中显示 (重绘客户窗口)
this->Invalidate() ;
}
}
4、在 MFC ClassWixard 中重载 OnFileSave()
[cpp] view plaincopy
void CShowView::OnFileSave()
{
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",strOpenFileName,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() ;
}
}
}
转自:http://blog.sina.com.cn/s/blog_9402171001012i5u.html
相关文章推荐
- 在 VC++6.0 中将 JPG 格式图片转换成 BMP 格式
- C# 图片格式(JPG,BMP,PNG,GIF)等转换为ICO图标
- C# 图片格式(JPG,BMP,PNG,GIF)等转换为ICO图标
- JAVA 实现jpg/tif/bmp 等图片格式互相转换,解决RenderedOp资源不能释放
- BMP与JPG图片格式的互相转换
- C++Builder中实现BMP,JPG图片格式的转换
- 使用JAVA 实现jpg/tif/bmp 等图片之间格式得互相转换
- JAVA 实现jpg/tif/bmp 等图片之间格式得互相转换
- BCB实现BMP图片的RGB分解,BMP与JPG格式的相互转换
- opencv实现不同格式图片的转换(jpg<-->bmp)
- VC2005中将Picture控件显示图片保存为BMP,JPG等格式
- Delphi png、bmp、gif等图片格式转换成jpg
- JAVA 实现jpg/tif/bmp 等图片之间格式得互相转换
- [转载]C#图片格式(JPG,BMP,PNG,GIF)等转换为ICO图标
- wmf和emf格式的图片有什么区别? JPG图片如何转换WMF文件?
- tif 等任意多帧图片转换bmp 或者gif等格式
- php 将bmp图片转为jpg等其他任意格式的图片
- 图片转换,把bmp图片转换为jpg图片
- 转换一个JPG/GIF格式的图片到BITMAP位图格式.
- 如何将jpg转换成pdf格式的图片