您的位置:首页 > 编程语言 > C语言/C++

在 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息