请教大哥大姐们,保存jpeg、bmp等格式的图像,怎么修改Serialize(CArchive& ar)? 谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 见到的都是自己写或用别人的类,用Serialize的还没见过。这是VISUAL C++数字图像处理上的,供参考:/*************************************************************************** 函数名称:* SaveDIB()** 参数:* HDIB hDib - 要保存的DIB* CFile& file - 保存文件CFile** 返回值:* BOOL - 成功返回TRUE,否则返回FALSE或者CFileException** 说明:* 该函数将指定的DIB对象保存到指定的CFile中。该CFile由调用程序打开和关闭。**************************************************************************/BOOL WINAPI SaveDIB(HDIB hDib, CFile& file){ // Bitmap文件头 BITMAPFILEHEADER bmfHdr; // 指向BITMAPINFOHEADER的指针 LPBITMAPINFOHEADER lpBI; // DIB大小 DWORD dwDIBSize; if (hDib == NULL) { // 如果DIB为空,返回FALSE return FALSE; } // 读取BITMAPINFO结构,并锁定 lpBI = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) hDib); if (lpBI == NULL) { // 为空,返回FALSE return FALSE; } // 判断是否是WIN3.0 DIB if (!IS_WIN30_DIB(lpBI)) { // 不支持其它类型的DIB保存 // 解除锁定 ::GlobalUnlock((HGLOBAL) hDib); // 返回FALSE return FALSE; } // 填充文件头 // 文件类型"BM" bmfHdr.bfType = DIB_HEADER_MARKER; // 计算DIB大小时,最简单的方法是调用GlobalSize()函数。但是全局内存大小并 // 不是DIB真正的大小,它总是多几个字节。这样就需要计算一下DIB的真实大小。 // 文件头大小+颜色表大小 // (BITMAPINFOHEADER和BITMAPCOREHEADER结构的第一个DWORD都是该结构的大小) dwDIBSize = *(LPDWORD)lpBI + ::PaletteSize((LPSTR)lpBI); // 计算图像大小 if ((lpBI->biCompression == BI_RLE8) || (lpBI->biCompression == BI_RLE4)) { // 对于RLE位图,没法计算大小,只能信任biSizeImage内的值 dwDIBSize += lpBI->biSizeImage; } else { // 象素的大小 DWORD dwBmBitsSize; // 大小为Width * Height dwBmBitsSize = WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount)) * lpBI->biHeight; // 计算出DIB真正的大小 dwDIBSize += dwBmBitsSize; // 更新biSizeImage(很多BMP文件头中biSizeImage的值是错误的) lpBI->biSizeImage = dwBmBitsSize; } // 计算文件大小:DIB大小+BITMAPFILEHEADER结构大小 bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER); // 两个保留字 bmfHdr.bfReserved1 = 0; bmfHdr.bfReserved2 = 0; // 计算偏移量bfOffBits,它的大小为Bitmap文件头大小+DIB头大小+颜色表大小 bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpBI->biSize + PaletteSize((LPSTR)lpBI); // 尝试写文件 TRY { // 写文件头 file.Write((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER)); // 写DIB头和象素 file.WriteHuge(lpBI, dwDIBSize); } CATCH (CFileException, e) { // 解除锁定 ::GlobalUnlock((HGLOBAL) hDib); // 抛出异常 THROW_LAST(); } END_CATCH // 解除锁定 ::GlobalUnlock((HGLOBAL) hDib); // 返回TRUE return TRUE;} 可以用Serialize(CArchive& ar)来保存图象吗?关注ing.............. wrcluomo(落木:首先谢谢,那么按你的代码 ,各种格式的图象的保存,都可以吗 当然不是了,他这个只能保存位图的想保存jpeg和gif等就困难了,还是去找现成的代码 修改Serialize(CArchive& ar)的方法不知道的但是,如 herrycsdn(卓一凡) 兄所讲只要针对不同的文件格式,了解他们的文件内部结构对其结构进行描述就可以了比如dib就是对文件信息头改写一下就好了关键是文件的内部结构 我收藏了一个介绍各种图象格式的帖子,或许会有用:http://expert.csdn.net/Expert/topic/1151/1151880.xml?temp=.8853571 crazy_lazy_pig(疯狂懒猪),呵呵,你的那个帖子好像已经不在了 呵呵,谁说不在了,不注意看网页提示,看到错误信息就说电脑坏了,你真是菜鸟吗?算了,我教你吧,试试这个网址吧:http://search.csdn.net/expert/topic/50/5010/2002/11/6/1151880.htm crazy_lazy_pig(疯狂懒猪):呵呵,真是大意了,不好意思,就是个十足菜鸟:)图像格式的内部结构知道了,就根据图像数据的信息(比如说大小,长宽,数据存放起始地址等等)写入特定图像的数据结构,至于是什么数据结构就依据图像格式而定了,利用vc++中最基本的CFile类就能对文件进行读写操作了,这个任意一本书上都会有的: ) (板门弄斧...) 可以,在serialize函数中按顺序依次读写bmp对象的各部分数据就可以了。 用WritePrivateProfileString将数据存到后台ini文件中,可以指定格式么 SendMessage(hwndToolbar, TB_GETBUTTON, i, (LPARAM)m_ptbb)在vista下调用不成功 是为什么呀 创建对话框,怎么会失败?? visual assist 关于用Exitwindowsex() 函数 大家编程是这样的感觉吗? 如何为工具栏按钮添加描述性文字? 3D游戏大师编程技巧第八章调试问题 如何 将BYTE ID[2]送给id 关于非文档视图结构程序的菜单 请问乱码怎么翻 怎样在CEdit控件中换行
/*************************************************************************
*
* 函数名称:
* SaveDIB()
*
* 参数:
* HDIB hDib - 要保存的DIB
* CFile& file - 保存文件CFile
*
* 返回值:
* BOOL - 成功返回TRUE,否则返回FALSE或者CFileException
*
* 说明:
* 该函数将指定的DIB对象保存到指定的CFile中。该CFile由调用程序打开和关闭。
*
*************************************************************************/
BOOL WINAPI SaveDIB(HDIB hDib, CFile& file)
{
// Bitmap文件头
BITMAPFILEHEADER bmfHdr;
// 指向BITMAPINFOHEADER的指针
LPBITMAPINFOHEADER lpBI;
// DIB大小
DWORD dwDIBSize;
if (hDib == NULL)
{
// 如果DIB为空,返回FALSE
return FALSE;
}
// 读取BITMAPINFO结构,并锁定
lpBI = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) hDib);
if (lpBI == NULL)
{
// 为空,返回FALSE
return FALSE;
}
// 判断是否是WIN3.0 DIB
if (!IS_WIN30_DIB(lpBI))
{
// 不支持其它类型的DIB保存
// 解除锁定
::GlobalUnlock((HGLOBAL) hDib);
// 返回FALSE
return FALSE;
}
// 填充文件头
// 文件类型"BM"
bmfHdr.bfType = DIB_HEADER_MARKER;
// 计算DIB大小时,最简单的方法是调用GlobalSize()函数。但是全局内存大小并
// 不是DIB真正的大小,它总是多几个字节。这样就需要计算一下DIB的真实大小。
// 文件头大小+颜色表大小
// (BITMAPINFOHEADER和BITMAPCOREHEADER结构的第一个DWORD都是该结构的大小)
dwDIBSize = *(LPDWORD)lpBI + ::PaletteSize((LPSTR)lpBI);
// 计算图像大小
if ((lpBI->biCompression == BI_RLE8) || (lpBI->biCompression == BI_RLE4))
{
// 对于RLE位图,没法计算大小,只能信任biSizeImage内的值
dwDIBSize += lpBI->biSizeImage;
}
else
{
// 象素的大小
DWORD dwBmBitsSize;
// 大小为Width * Height
dwBmBitsSize = WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount)) * lpBI->biHeight;
// 计算出DIB真正的大小
dwDIBSize += dwBmBitsSize;
// 更新biSizeImage(很多BMP文件头中biSizeImage的值是错误的)
lpBI->biSizeImage = dwBmBitsSize;
}
// 计算文件大小:DIB大小+BITMAPFILEHEADER结构大小
bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);
// 两个保留字
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
// 计算偏移量bfOffBits,它的大小为Bitmap文件头大小+DIB头大小+颜色表大小
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpBI->biSize
+ PaletteSize((LPSTR)lpBI);
// 尝试写文件
TRY
{
// 写文件头
file.Write((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER));
// 写DIB头和象素
file.WriteHuge(lpBI, dwDIBSize);
}
CATCH (CFileException, e)
{
// 解除锁定
::GlobalUnlock((HGLOBAL) hDib);
// 抛出异常
THROW_LAST();
}
END_CATCH
// 解除锁定
::GlobalUnlock((HGLOBAL) hDib);
// 返回TRUE
return TRUE;
}
关注ing..............
首先谢谢,那么按你的代码 ,各种格式的图象的保存,都可以吗
想保存jpeg和gif等就困难了,还是去找现成的代码
但是,如 herrycsdn(卓一凡) 兄所讲
只要针对不同的文件格式,了解他们的文件内部结构
对其结构进行描述就可以了
比如dib就是对文件信息头改写一下就好了
关键是文件的内部结构
http://expert.csdn.net/Expert/topic/1151/1151880.xml?temp=.8853571
算了,我教你吧,试试这个网址吧:
http://search.csdn.net/expert/topic/50/5010/2002/11/6/1151880.htm
图像格式的内部结构知道了,就根据图像数据的信息(比如说大小,长宽,数据存放起始地址等等)写入特定图像的数据结构,至于是什么数据结构就依据图像格式而定了,利用vc++中最基本的CFile类就能对文件进行读写操作了,这个任意一本书上都会有的: ) (板门弄斧...)