Icon 转换为 BMP

roger_xiong 2005-02-06 09:58:55
不知道大家有没有用过网上一个类,能够将jpg、gif、ico等图片转换bmp图片


//-----------------------------------------------------------------------------
// Picture (Implementations) Version 1.00
//
// Routins 4 Showing Picture Files... (.BMP .DIB .EMF .GIF .ICO .JPG .WMF)
//
// Author: Dr. Yovav Gad, EMail: Sources@SuperMain.com ,Web: www.SuperMain.com
//=============================================================================





但是这个类实际上不能将ico保存为bmp,而是保存为了16色ico。

各位有没有一个办法能够将ico保存为bmp的代码???如果能够将他保存的代码修改一下,使其能够将ico正确的保存为bmp,那是最合适不过的了!!!!!!!




下面是他保存的代码:

//-----------------------------------------------------------------------------
// Does: Saves The Picture That Is Stored In The IPicture Object As a Bitmap
// ~~~~ (Converts From Any Known Picture Type To a Bitmap / Icon File)
//
// InPut: sFilePathName - Path And FileName Target To Save
// ~~~~~
//
// OutPut: TRUE If Succeeded...
// ~~~~~~
//-----------------------------------------------------------------------------
BOOL CMyPicture::SaveAsBitmap(CString sFilePathName)
//=============================================================================
{
BOOL bResult = FALSE;
ILockBytes *Buffer = 0;
IStorage *pStorage = 0;
IStream *FileStream = 0;
BYTE *BufferBytes;
STATSTG BytesStatistics;
DWORD OutData;
long OutStream;
CFile BitmapFile;
CFileException e;
double SkipFloat = 0;
DWORD ByteSkip = 0;
_ULARGE_INTEGER RealData;

CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer

HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);

hr = pStorage->CreateStream(L"PICTURE",
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);

m_IPicture->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
FileStream->Release();
pStorage->Release();
Buffer->Flush();

// Get Statistics For Final Size Of Byte Array
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);

// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only "Pure" Picture Data)
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
else ByteSkip = (DWORD)SkipFloat;
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...

// Find Difference Between The Two Values
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);

// Allocate Only The "Pure" Picture Data
RealData.LowPart = 0;
RealData.HighPart = 0;
RealData.QuadPart = ByteSkip;
BufferBytes = (BYTE*)malloc(OutStream);
if(BufferBytes == NULL)
{
Buffer->Release();
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
MessageBoxEx(hWnd, "Can not allocate enough memory\t", ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
}

Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);

if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
{
BitmapFile.Write(BufferBytes, OutData);
BitmapFile.Close();
bResult = TRUE;
}
else // Write File Failed...
{
TCHAR szCause[255];
e.GetErrorMessage(szCause, 255, NULL);
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
bResult = FALSE;
}

Buffer->Release();
free(BufferBytes);

return(bResult);
}

...全文
293 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
roger_xiong 2005-02-22
  • 打赏
  • 举报
回复
如果有大大能够把上面的代码修改一下能够完善上面的功能就最好了。因为上面的类我已经再用了,已经能够讲jpg和gif转成bmp了,最好不要因为要将ico转成bmp就新搞一个类。

同时谢谢vcleaner提供的资料,我会看看的。


小弟初学VC,不周之处,各位大大海涵呵~~
老夏Max 2005-02-21
  • 打赏
  • 举报
回复
http://support.microsoft.com/?scid=kb;zh-cn;218972&spid=3003&sid=70
这个是一个使用COM接口处理图像的例子。也可以看看!
老夏Max 2005-02-21
  • 打赏
  • 举报
回复
例子参考:
http://www.longtoo.com/Download/rar/iconpro.zip
先打开一个ICO文件,然后可以使用菜单Edit中的菜单项导出为BMP,具体的参考源代码!
老夏Max 2005-02-21
  • 打赏
  • 举报
回复
参考:
http://www.vckbase.com/document/viewdoc/?id=451
roger_xiong 2005-02-21
  • 打赏
  • 举报
回复
怎么没有人回答啊,自己再顶,都沉下去了。
roger_xiong 2005-02-06
  • 打赏
  • 举报
回复
各位兄台多多帮忙,尽快给出答案,快过年了咯。先给大家拜个早年。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧