如何把资源中的24位BMP存入.BMP文件?我刚看VC,请高手给个示例!

「已注销」 2003-04-21 12:44:30
有朋友要我用VC写个东东给他 我这几天我查了很多资料 搜索了不少地方
终究是不习惯VC的这些东东 感觉需要有过来人指点

我的要求很简单 就是如何把资源中的BMP写入文件
请不要贴代码了 我看得头都晕了 您高抬贵手写个示例给俺看看吧
请发送到 qfkx@eyou.com 或提供下载 自当以专家分奉上

拜托

//弄完这个以后 俺再也不用VC了 ^_*
...全文
157 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
shilong 2003-04-27
  • 打赏
  • 举报
回复
发了一个例子给你
按一下按纽就可把IDB_BITMAP1存成test.bmp
unicornstudio 2003-04-22
  • 打赏
  • 举报
回复
up
SeekTruth 2003-04-22
  • 打赏
  • 举报
回复


UP一个的说。
taianmonkey 2003-04-22
  • 打赏
  • 举报
回复
int CGetimageDlg::Tofile(HBITMAP hbitmap , LPSTR lpfilename)
{
HDC hdc; //设备描述表
int ibits;
WORD wbitcount; //当前显示分辨率下每个像素所占字节数

//位图中每个像素所占字节数,定义调色板大小,位图中像素字节大小,位图文件大小 ,写入文件字节数
DWORD dwpalettesize=0, dwbmbitssize, dwdibsize, dwwritten;

BITMAP bitmap; //位图属性结构
BITMAPFILEHEADER bmfhdr; //位图文件头结构
BITMAPINFOHEADER bi; //位图信息头结构
LPBITMAPINFOHEADER lpbi; //指向位图信息头结构

//定义文件,分配内存句柄,调色板句柄
HANDLE fh, hdib, hpal,holdpal=NULL;


//计算位图文件每个像素所占字节数
hdc = CreateDC("display",NULL,NULL,NULL);
ibits = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES);
DeleteDC(hdc);

if (ibits <= 1)
wbitcount = 1;
else if (ibits <= 4)
wbitcount = 4;
else if (ibits <= 8)
wbitcount = 8;
else if (ibits <= 16)
wbitcount = 16;
else if (ibits <= 24)
wbitcount = 24;
else
wbitcount = 32;

//计算调色板大小
if (wbitcount <= 8)
dwpalettesize = (1 << wbitcount) * sizeof(RGBQUAD);

//设置位图信息头结构
GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&bitmap);
bi.biSize = sizeof(LPBITMAPINFOHEADER);
bi.biWidth = bitmap.bmWidth;
bi.biHeight = bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wbitcount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;

dwbmbitssize = ((bitmap.bmWidth * wbitcount+31)/32)* 4 * bitmap.bmHeight ;
//为位图内容分配内存
hdib = GlobalAlloc(GHND,dwbmbitssize + dwpalettesize + sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hdib);
*lpbi = bi;

// 处理调色板
hpal = GetStockObject(DEFAULT_PALETTE);
if (hpal)
{
hdc = ::GetDC(NULL);
holdpal = SelectPalette(hdc, (HPALETTE)hpal, false);
RealizePalette(hdc);
}

// 获取该调色板下新的像素值
GetDIBits(hdc, hbitmap, 0, (UINT) bitmap.bmHeight,(LPSTR)lpbi +
sizeof(BITMAPINFOHEADER)+dwpalettesize,(BITMAPINFO*)lpbi, DIB_RGB_COLORS);

//恢复调色板
if (holdpal)
{
SelectPalette(hdc, (HPALETTE)holdpal, true);
RealizePalette(hdc);
::ReleaseDC(NULL, hdc);
}

//创建位图文件
fh = CreateFile(lpfilename, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE)
return false;

// 设置位图文件头
bmfhdr.bfType = 0x4d42; // "bm"
dwdibsize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ dwpalettesize + dwbmbitssize;
bmfhdr.bfSize = dwdibsize;
bmfhdr.bfReserved1 = 0;
bmfhdr.bfReserved2 = 0;
bmfhdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER)+ dwpalettesize;

// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfhdr, sizeof(BITMAPFILEHEADER), &dwwritten, NULL);

// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwdibsize, &dwwritten, NULL);
//清除
GlobalUnlock(hdib);
GlobalFree(hdib);
CloseHandle(fh);
return true;
}
free_card 2003-04-22
  • 打赏
  • 举报
回复
快速的装载位图到CBitmap对象

将一个*.BMP文件加入到CBitmap Object
创建你自已的CBitmap类(例如:CMyBitmap)
加入一个装载位图的函数如下:
BOOL CMyBitmap::LoadBitmap(LPCTSTR szFilename)
ASSERT(szFilename);
DeleteObject();
HBITMAP hBitmap = NULL;
hBitmap = (HBITMAP)LoadImage(NULL, szFilename, IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
return Attach(hBitmap);
} 
free_card 2003-04-22
  • 打赏
  • 举报
回复
如何将CBitmap写入文件

如果具有一个设备无关的位图句柄,把一个位图写入BMP文件非常简单:在位图内容之
后写入BITMAPINFOHEADER信息即可。需要设置BITMAPINFOHEADER的三个成员是bfType,
其值为"BM",bfSize,其值是位图的大小,以及,bfOffBits,其值为文件开始到位图
位的偏移量。
// WriteDIB - Writes a DIB to file
// Returns - TRUE on success
// szFile - Name of file to write to
// hDIB - Handle of the DIB
BOOL WriteDIB( LPTSTR szFile, HANDLE hDIB)
BITMAPFILEHEADER hdr;
LPBITMAPINFOHEADER lpbi;
if (!hDIB)
return FALSE;
CFile file;
if( !file.Open( szFile, CFile::modeWrite|CFile::modeCreate) )
return FALSE;
lpbi = (LPBITMAPINFOHEADER)hDIB;
int nColors = 1 << lpbi->biBitCount;
// Fill in the fields of the file header
hdr.bfType = ((WORD) ('M' << 8) | 'B'); // is always "BM"
hdr.bfSize="GlobalSize" (hDIB) + sizeof( hdr ); hdr.bfReserved1="0;"
hdr.bfReserved2="0;" hdr.bfOffBits="(DWORD)" (sizeof( hdr ) + lpbi->biSize +
nColors * sizeof(RGBQUAD));
// Write the file header
file.Write( &hdr, sizeof(hdr) );
// Write the DIB header and the bits
file.Write( lpbi, GlobalSize(hDIB) );
return TRUE;
BAYERN 2003-04-22
  • 打赏
  • 举报
回复
蹭分
herrycsdn 2003-04-22
  • 打赏
  • 举报
回复
资源中的BMP应该是ddb位图,而存成文件就是dib了,dib的结构看msdn就知道了
而ddb是在内存中创建并处理的,它并不附带调色盘,其颜色是有显示它的设备所决定的,
因此你需要根据资源中的BMP的信息来填写文件头等dib中有,而ddb中没有的东西,
呵呵,个人看法,楼主那么多星星,看得我都眼花了
「已注销」 2003-04-22
  • 打赏
  • 举报
回复

to masterz(MS MVP)

MVP 好酷哦

哎 等我有了高难度的问题再请教您吧

这个问题有污您的法眼啦

^_*
「已注销」 2003-04-22
  • 打赏
  • 举报
回复

不好意思各位 不要取笑我了

我的星星是CSDN奖励的 CSDN上说得很明白 三星的奖励之一就是在各版均为三星 级别不再分版

让你们误解了 我当然不可能是VC版的星星了 你们才是真正的高手哪

我本来已经想放弃了 准备去折腾点好玩的哪 看到这么多朋友回复

我准备今天重整旗鼓 顺便也装上MSDN等等资料 搞掂它

……祝大家 study hard,day day up..
loopyifly 2003-04-22
  • 打赏
  • 举报
回复
cast a glance over

看猩猩而来
HanZhu1 2003-04-22
  • 打赏
  • 举报
回复
噢!程序太长了没发完,发Email给我吧
HanZhu1 2003-04-22
  • 打赏
  • 举报
回复
有问题找我
hy1899@sohu.com
HanZhu1 2003-04-22
  • 打赏
  • 举报
回复
DWORD SetBitmapBits( DWORD dwCount, const void* lpBits )

Return Value

The number of bytes used in setting the bitmap bits; 0 if the function fails.

dwCount Specifies the number of bytes pointed to by lpBits.
lpBits Points to the BYTE array that contains the bit values to be copied to the CBitmap object.

*/
//设置DDB所使用的像素数据----整体
//lpBits----数据源, 扫描宽度字节数必须是2的倍数, 注意, 数据要充足
DWORD CDdb::SetBitmapBits(DWORD dwCount, const void* lpbyBits)
{
ASSERT(lpbyBits);
return (m_pDdb->SetBitmapBits(dwCount, lpbyBits));
}

//设置DDB所使用的像素数据----局部
//x, y, nWidth, nHeight
//lpBits----数据源, 扫描宽度字节数必须是2的倍数
DWORD CDdb::SetBitmapBits(int x, int y, int nWidth, int nHeight, int nBitCount, LPBYTE lpbyBits)
{
ASSERT(lpbyBits);
//类型不匹配, 则返回0, 表示没有设置任何数据
if(nBitCount != m_nBitCount)return 0;

//进行参数合法性检测
if((x > m_nWidth - 1) || (y > nHeight - 1))
{
AfxMessageBox("Cross the border!");
return 0;
}
//有效宽度和高度:w , h.
LONG w = (LONG)min(nWidth, m_nWidth - x);
LONG h = (LONG)min(nHeight, m_nHeight - y);

//扫描宽度, 以字节为单位, 必须被2整除
DWORD dwScanLength = CalcDdbWidthBytes(nWidth, nBitCount);

//实际拷贝的行字节长度:
DWORD dwLength = w;
//数据偏移量
DWORD dwOffset = x;
if(nBitCount == 16)
{
dwLength = w + w;
dwOffset = x + x;
}
else if(nBitCount == 24)
{
dwLength = 3 * w;
dwOffset = 3 * x;
}
else if(nBitCount == 32)
{
dwLength = 4 * w;
dwOffset = 4 * x;
}

//指向与CDdb对象绑连的数据区
BYTE* pbyDdbDst = m_pDdbData + y * m_nDdbWidthBytes + dwOffset;

//指向源数据的指针, 从外部而来
BYTE* pbyDdbRsc = lpbyBits;

for(int i = 0; i < h; i++)
{
::CopyMemory(pbyDdbDst, pbyDdbRsc, dwLength);
pbyDdbRsc += dwScanLength; //from
pbyDdbDst += m_nDdbWidthBytes; //to
}
m_pDdb->SetBitmapBits(m_nDdbWidthBytes * m_nHeight, m_pDdbData);
return (nWidth * nHeight * nBitCount);
}

//绘制设备相关的位图.当然由于该类是以CBitmap对象进行加工的, 因而事先必须有一个该对象, 所以该方法的作用显得不是很突出.因为完全不用该方法也能绘制DDB位图.
BOOL CDdb::Draw(CDC* pDstDC, int x, int y, int nWidth, int nHeight, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop)
{
CDC memoryDC;
memoryDC.CreateCompatibleDC(pDstDC);
CBitmap* pOldBitmap = memoryDC.SelectObject(m_pDdb);

BOOL bDraw = (pDstDC->StretchBlt(x, y, nWidth, nHeight, &memoryDC, xSrc, ySrc, nSrcWidth, nSrcHeight, dwRop ));
memoryDC.SelectObject(pOldBitmap);
return (bDraw);

}

/*
//功能如下:
1. 8位位图仍然保存为8位位图
2. 16位位图将被保存为24位位图.16位位图只用于16位增强显示模式, 不在不同的系统间进行传递.
3. 24位位图仍然被保存为24位位图.
4. 32位Ddb位图将被保存为24位位图.
5. 对于16色即4位位图, 不作处理.
*/
//将Ddb位图保存成Dib位图:被保存的区域由, x, y, nWidth, nHeight来定义
void CDdb::Save(const char *pszDibFileName, int x, int y, int nWidth, int nHeight)
{
ASSERT(pszDibFileName);
//首先进行参数合法性检测
if((x > m_nWidth - 1) || (y > nHeight - 1))
{
AfxMessageBox("Cross the border!");
return;
}

AfxGetApp()->BeginWaitCursor();

//被保存的最后有效宽度和高度:w , h.
LONG w = (LONG)min(nWidth, m_nWidth - x);
LONG h = (LONG)min(nHeight, m_nHeight - y);


//被保存位图每行的字节数
DWORD dwSaveWidthBytes = CalcDibWidthBytes(w, m_nBitCount);

//DIB位图数据大小, 以字节为单位
DWORD dwDibBitsSize = dwSaveWidthBytes * m_nHeight;

//计算整个Dib文件的大小dwFileSize
DWORD dwFileSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwDibBitsSize;
if(m_nBitCount == 8) dwFileSize += (256 * sizeof(RGBQUAD));

//计算位图信息到位图数据间的偏移量(字节)
DWORD dwOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
if(m_nBitCount == 8) dwOffBits += (256 * sizeof(RGBQUAD));


//位图文件头结构和位图信息结构
BITMAPFILEHEADER bmFileHeader;
BITMAPINFOHEADER bmInfo;

//填充BITMAPFILEHEADER结构
bmFileHeader.bfType=0x4d42;
bmFileHeader.bfSize = dwFileSize;
bmFileHeader.bfReserved1 = 0;
bmFileHeader.bfReserved2 = 0;
bmFileHeader.bfOffBits = dwOffBits;

//填充BITMAPINFOHEADER结构:8位仍然保存为8位, 其它均被保存为24位.最低显示模式为8位.
WORD wBitsPixel = (WORD)m_nBitCount;
if(m_nBitCount != 8)wBitsPixel = 24;
bmInfo.biSize = sizeof(BITMAPINFOHEADER);
bmInfo.biWidth = w;
bmInfo.biHeight = h;
bmInfo.biPlanes = 1;
bmInfo.biBitCount = wBitsPixel;
bmInfo.biCompression = 0;
bmInfo.biSizeImage = 0;
bmInfo.biXPelsPerMeter = 0;
bmInfo.biYPelsPerMeter = 0;
bmInfo.biClrUsed = 0;
bmInfo.biClrImportant = 0;

try
{
// 请创建自己的目录或获取当前目录:
CFile file((LPCTSTR )pszDibFileName, CFile::modeCreate |
CFile::modeReadWrite | CFile::shareExclusive);

//写入文件头和位图信息
file.Write((LPSTR)&bmFileHeader, sizeof(BITMAPFILEHEADER));
file.Write((LPSTR)&bmInfo, sizeof(BITMAPINFOHEADER));

//如果是8位显示模式, 还需要写入调色盘表项
if(m_nBitCount == 8)
{
//为8位显示模式准备调色盘
RGBQUAD* pRGBQuad = new RGBQUAD[256];
if(pRGBQuad == NULL)return;

//初始化为0
memset(pRGBQuad, 0, 256 * sizeof(RGBQUAD));

//创建表项:可能丢失颜色
GetSystemPaletteEntries(pRGBQuad);

//写入数据
file.Write((LPSTR)pRGBQuad, 256 * sizeof(RGBQUAD));

delete[] pRGBQuad;
}

switch(m_nBitCount)
{
case 8:
case 24:
{
//每行需要补0的个数
DWORD dwLength = (m_nBitCount == 8) ? w : (3 * w);
UINT nZero = dwSaveWidthBytes - dwLength;
BYTE abyZero[] = {0, 0, 0};

//数据索引基数, 从下往上读
DWORD dwBaseIndex = (y + h - 1) * m_nDdbWidthBytes + ((m_nBitCount == 8) ? x : (3 * x));
for(LONG i = 0; i < h ; i++)
{

LPSTR lpsRaw = (LPSTR)(m_pDdbData + dwBaseIndex);

//写入子数据, 注意数据量小于64k, 位图宽度可达22767个像素单位或更高
file.Write(lpsRaw, dwLength); //

//结尾补0
if(nZero > 0) file.Write((LPSTR)abyZero, nZero);
dwBaseIndex -= m_nDdbWidthBytes;

}
}
break;

case 16:
case 32:
{
//对于16位和32位位图, 由于数据需要重组, 所以需要重新分配内存

//指向Dib实际像素数据的指针,
BYTE* pbyDibBits = new BYTE[dwDibBitsSize];
if (pbyDibBits == NULL) return;

//数据索引基数
DWORD dwBaseIndex = y * m_nDdbWidthBytes + ((m_nBitCount == 16) ? (x + x) : (4 * x));
DWORD dwIndexDib = (h - 1) * dwSaveWidthBytes;
//离析像素数据, 并将其写入内存, 从上往下读
for(LONG i = 0; i < h; i++)
{

//指向Ddb内存数据的指针(行)
BYTE* pbyDdbData = m_pDdbData + dwBaseIndex;

//指向Dib内存数据的指针(行)
BYTE* pbyDibData = pbyDibBits + dwIndexDib;

for(LONG j = 0; j < w; j++)
{

//处理16位
if(m_nBitCount == 16)
{
//记录一个像素点的24位颜色值(16位和32位模式均被转化为24位)
BYTE* pbyRGB = new BYTE[3];
WORD* pwDdbData_16 = (WORD*)(pbyDdbData++);
GetRGB16(pbyRGB, pwDdbData_16);
pbyDdbData++;
*pbyDibData++ = pbyRGB[0]; //b
*pbyDibData++ = pbyRGB[1]; //g
*pbyDibData++ = pbyRGB[2]; //r
delete[] pbyRGB;
}

//处理32位
if(m_nBitCount == 32)
{
*pbyDibData++ = *pbyDdbData++; //蓝色
*pbyDibData++ = *pbyDdbData++; //绿色
*pbyDibData++ = *pbyDdbData++; //红色
pbyDdbData++;
}

}//end j
dwBaseIndex += m_nDdbWidthBytes;
dwIndexDib -= dwSaveWidthBytes;
}//end i

//将内存数据写入文件
file.WriteHuge((LPSTR)pbyDibBits, dwDibBitsSize);

delete[] pbyDibBits;
}
break;

}

file.Close();
}//end try
catch(CFileException* e)
{
e->Delete();
}

AfxGetApp()->EndWaitCursor();
}
HanZhu1 2003-04-22
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include "Ddb.h"

IMPLEMENT_DYNAMIC(CDdb, CObject)

CDdb::CDdb()
{
m_pDdbData = NULL;
m_hDdbData = 0;
}

CDdb::CDdb(CBitmap* pBitmap)
{
m_pDdbData = NULL;
m_hDdbData = 0;
SetDdb(pBitmap);
}


CDdb::~CDdb()
{
ClearMemory();
}

void CDdb::ClearMemory()
{
if(m_hDdbData != NULL)
::GlobalFree(m_hDdbData);
m_pDdbData = NULL;
m_hDdbData = 0;
}


//构造函数将调用它, 设置属性
void CDdb::SetDdb(CBitmap *pBitmap)
{
ASSERT(pBitmap);
BITMAP bitmap;
pBitmap->GetObject(sizeof(BITMAP), &bitmap);
//位图的宽度和高度
m_nWidth = bitmap.bmWidth;
m_nHeight = bitmap.bmHeight;

//指向CBitmap对象的指针, 在运算的过程中不改变
m_pDdb = pBitmap;

//获取设备描述表句柄
HDC hDC = ::GetDC(NULL);

//每个像素位的颜色位数
m_nBitCount = 24;
m_nBitCount = ::GetDeviceCaps(hDC, BITSPIXEL);

//不支持16色显示模式
if(m_nBitCount < 8)
{
AfxMessageBox(" Please Change your display mode.Thank you!");
return;
}

//计算设备相关位图的行字节数
m_nDdbWidthBytes = CalcDdbWidthBytes(m_nWidth, m_nBitCount);

//Ddb位图的位数据大小
DWORD dwDdbBitsSize = m_nDdbWidthBytes * m_nHeight;


//如果以前存在, 就释放内存.
if(m_pDdbData != NULL)
{
::GlobalFree(m_hDdbData);
m_pDdbData = NULL;
m_hDdbData = 0;
}


//分配全局内存
m_hDdbData = (HGLOBAL) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwDdbBitsSize);
if (m_hDdbData == 0) return ;

//指向位数据的指针, 在运算的过程中不改变
m_pDdbData = (BYTE*)::GlobalLock(m_hDdbData);
if (m_pDdbData == NULL)
{
::GlobalUnlock(m_hDdbData);
::GlobalFree(m_hDdbData);
m_hDdbData = 0;
return;
}


//从内存中获取Ddb数据
m_pDdb->GetBitmapBits(dwDdbBitsSize, m_pDdbData);



::GlobalUnlock(m_hDdbData);
//释放DC
::ReleaseDC(NULL, hDC);
}

#ifdef _DEBUG
void CDdb::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);
}

void CDdb::AssertValid() const
{
CObject::AssertValid();
ASSERT(m_pDdb != NULL);
ASSERT(m_hDdbData != 0);
ASSERT(m_pDdbData != NULL);
}
#endif


BYTE* CDdb::GetDdbData() const
{
return m_pDdbData;
}

BYTE CDdb::GetBitCount() const
{
return m_nBitCount;
}

LONG CDdb::GetWidth() const
{
return m_nWidth;
}

LONG CDdb::GetHeight() const
{
return m_nHeight;
}


LONG CDdb::GetDdbWidthBytes() const
{
return m_nDdbWidthBytes;

}

//计算设备相关位图的行字节宽度
LONG CDdb::CalcDdbWidthBytes(LONG nWidth, BYTE byBitCount)
{
//每行字节数必须被2整除
return (((nWidth * byBitCount + 15) / 16) * 2);
}

//计算设备无关位图的行字节宽度
LONG CDdb::CalcDibWidthBytes(LONG nWidth, BYTE byBitCount)
{
//每行字节数必须被4整除
if(byBitCount == 8)
return (((nWidth * 8 + 31) / 32) * 4);
else
return (((nWidth * 24 + 31) / 32) * 4);
}

/*
HanZhu1 2003-04-22
  • 打赏
  • 举报
回复
#ifndef _CDDB_H
#define _CDDB_H

class CDdb : public CObject
{
DECLARE_DYNAMIC(CDdb)
public:

CDdb();
CDdb(CBitmap* pBitmap);

virtual ~CDdb();

BOOL Draw(CDC* pDstDC, int x, int y, int nWidth, int nHeight, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop);
DWORD SetBitmapBits( DWORD dwCount, const void* lpbyBits );
DWORD SetBitmapBits(int x, int y, int nWidth, int nHeight, int nBitCount, LPBYTE lpbyBits);

void GetDdbDataTo32(int x, int y, int nWidth, int nHeight, LPBYTE lpbyBits32);
void GetDdbDataTo24(int x, int y, int nWidth, int nHeight, LPBYTE lpbyBits24);
void SaveAs256(const char *pszDibFileName, int x, int y, int nWidth, int nHeight);
void QuantizeColor(LPBYTE pDdbBits24, int nScanWidth, int nScanHeight, LPBYTE pDdbBits8, CPalette* pPalette);
void Save(const char* pszDibFileName, int x, int y, int nWidth, int nHeight);

LONG CalcDdbWidthBytes(LONG nWidth, BYTE byBitCount);

LONG GetDdbWidthBytes() const;
LONG GetHeight() const;
LONG GetWidth() const;
BYTE GetBitCount() const ;
BYTE* GetDdbData() const;
void SetDdb(CBitmap* pBitmap);


public:
CBitmap* m_pDdb;

public:
void ClearMemory();


#ifdef _DEBUG
virtual void Dump(CDumpContext& dc) const;
virtual void AssertValid() const;
#endif

protected:
BYTE* m_pDdbData; //所有DDB数据
BYTE m_nBitCount; //设备所支持的颜色位数, 它等于你在显示模式中设置的颜色位数
LONG m_nHeight; //DDB的高度
LONG m_nWidth; //DDB的宽度
LONG m_nDdbWidthBytes; //DDB每行的宽度(字节)
HGLOBAL m_hDdbData;

private:
void GetRGB16(BYTE* pbyRGB, WORD* pwColor);
void GetSystemPaletteEntries(RGBQUAD* pRGBQuad);
LONG CalcDibWidthBytes(LONG nWidth, BYTE byBitCount);
};

#endif
qiuafa 2003-04-21
  • 打赏
  • 举报
回复
蹭分
「已注销」 2003-04-21
  • 打赏
  • 举报
回复
我只要在WIN98下运行即可

大侠请细讲
lwang337 2003-04-21
  • 打赏
  • 举报
回复
这个东西写个事例和发代码是一样的,win98中,VC不支持bmp位图操作,所以代码必须自己写,网上有成熟的代码可以用,你只需要调用一个函数就行了

如果你的东西只想在winXP以上版本中运行的话,那么VC中可以直接写bmp文件,使用
GDI+就可以了
masterz 2003-04-21
  • 打赏
  • 举报
回复
sent out.

19,472

社区成员

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

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