自定义一个位图处理类,生成的位图文件无法用画图工具打开,请各位高手帮忙看一下!

tobephonix 2003-08-19 03:19:23
自定义一个位图处理类,用来生成、编辑、保存DIB位图对象,目前利用这个类生成的BMP文件无法用WINDOWS自带画图工具打开,请各位高手帮我看一下程序哪些地方有问题。这是小弟写的第一个c++程序,请各位不吝赐教!

========================================================================
头文件:

class CBitMapUtil
{
private:
HBITMAP m_hBitMap; //the handle of a bitmap object
byte* m_pBmpBits; //pointer to bitmap bits data
BITMAPFILEHEADER hBmpFhd;
LPBITMAPINFO lpBmpInfo;
private:
bool CreateBitMap(LPBITMAPINFO lpBmpInfo, void* lpSrcBits); //create a bitmap as the defined width and height from the lpSrcBits
void CreateFileHeader();

public:
CBitMapUtil();
CBitMapUtil(int nWidth,int nHeight,UINT nBitCount); //contructor for a bitmap as defined widht and height
void SetPixel(int xPixel,int yPixel,COLORREF color); //paint point with specific color
bool SaveBitMap(LPCTSTR fileName); //save the bitmap object to disk
~CBitMapUtil();
};
========================================================================
cpp文件:
#include "stdafx.h"
#include "CBitMapUtil.h"
#include "Windef.h"
CBitMapUtil::CBitMapUtil()
{

}
/*

*/
CBitMapUtil::CBitMapUtil(int nWidth,int nHeight,UINT nbitCount)
{
ASSERT(nbitCount == 24); //only deal with 24-bit bitmap object;
lpBmpInfo = (LPBITMAPINFO) new BYTE[sizeof(BITMAPINFOHEADER)];
//init BITMAPINFOHEADER
lpBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpBmpInfo->bmiHeader.biWidth = nWidth;
lpBmpInfo->bmiHeader.biHeight = nHeight;
lpBmpInfo->bmiHeader.biBitCount = nbitCount;
lpBmpInfo->bmiHeader.biPlanes = 1;
lpBmpInfo->bmiHeader.biCompression = 0;
lpBmpInfo->bmiHeader.biSizeImage = nWidth*nHeight*3 ; //may be need to be recalculated
lpBmpInfo->bmiHeader.biXPelsPerMeter = 0x0;
lpBmpInfo->bmiHeader.biYPelsPerMeter = 0x0;
lpBmpInfo->bmiHeader.biClrUsed = 0;
lpBmpInfo->bmiHeader.biClrImportant = 0;
//init m_pBmpBits
m_pBmpBits = (byte*) new BYTE[nWidth*nHeight*3];
for(int i = 0;i < sizeof(m_pBmpBits); i++)
{
m_pBmpBits[i]=(byte)0xFF; //init as white background;
}
//create bitmap object
CreateBitMap(lpBmpInfo,m_pBmpBits);
}


bool CBitMapUtil::CreateBitMap(LPBITMAPINFO lpBmpInfo,LPVOID lpSrcBits)
{
HDC hMemDC;
hMemDC = CreateCompatibleDC (NULL);
m_hBitMap = CreateDIBSection(hMemDC,lpBmpInfo,DIB_RGB_COLORS,&lpSrcBits,NULL,0);
delete hMemDC;
return true;
}


void CBitMapUtil::SetPixel(int xPixel,int yPixel,COLORREF color)
{
CDC dc;
dc.SelectObject(m_hBitMap);
dc.SetPixel(xPixel,yPixel,color);
delete dc;
}

void CBitMapUtil::CreateFileHeader()
{
hBmpFhd.bfType = (('B'<<8)|'M');
hBmpFhd.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(m_pBmpBits);
hBmpFhd.bfReserved1 = 0;
hBmpFhd.bfReserved2 = 0;
hBmpFhd.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
}

bool CBitMapUtil::SaveBitMap(LPCTSTR lpszFileName)
{
CFile file;
if (!file.Open(lpszFileName, CFile::modeWrite|CFile::modeCreate))
return FALSE;

file.Write(&hBmpFhd, sizeof(hBmpFhd));
// Write the DIB header
file.Write(lpBmpInfo, sizeof(BITMAPINFOHEADER));

// Write DIB bits
file.Write(m_pBmpBits, lpBmpInfo->bmiHeader.biSizeImage);

return TRUE;
}

CBitMapUtil::~CBitMapUtil()
{
delete m_hBitMap;
delete m_pBmpBits;
delete lpBmpInfo;
}

...全文
182 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
tobephonix 2003-09-15
  • 打赏
  • 举报
回复
写这个类的目的是用来以图形的方式输出调试结果,后来由于这个类无法达到预期的效果就放弃了,不过谢谢大家的意见和建议^_^

to wangjinwang(王进):有机会我会调试你的源代码,非常感谢!
孤必有邻 2003-09-05
  • 打赏
  • 举报
回复
(改了改,可以用了:共3部分)

// 1、头文件:

class CBitMapUtil
{
private:
HBITMAP m_hBitMap; //the handle of a bitmap object
byte* m_pBmpBits; //pointer to bitmap bits data
BITMAPFILEHEADER hBmpFhd;
LPBITMAPINFO lpBmpInfo;
//
HDC hMemDC;
int m_nSize;
private:
bool CreateBitMap(LPBITMAPINFO lpBmpInfo, void* lpSrcBits); //create a bitmap as the defined width and height from the lpSrcBits
void CreateFileHeader();

public:
CBitMapUtil();
CBitMapUtil(int nWidth,int nHeight,UINT nBitCount); //contructor for a bitmap as defined widht and height
void SetPixel(int xPixel,int yPixel,COLORREF color); //paint point with specific color
bool SaveBitMap(LPCTSTR fileName); //save the bitmap object to disk
~CBitMapUtil();
};

// 2、cpp文件:

#include "stdafx.h"
#include "Bitmap.h"//改名
#include "Windef.h"
CBitMapUtil::CBitMapUtil()
{}
CBitMapUtil::CBitMapUtil(int nWidth,int nHeight,UINT nbitCount)
{
ASSERT(nbitCount == 24); //only deal with 24-bit bitmap object;
lpBmpInfo = (LPBITMAPINFO) new BYTE[sizeof(BITMAPINFOHEADER)];
//init BITMAPINFOHEADER
lpBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpBmpInfo->bmiHeader.biWidth = nWidth;
lpBmpInfo->bmiHeader.biHeight = nHeight;
lpBmpInfo->bmiHeader.biBitCount = nbitCount;
lpBmpInfo->bmiHeader.biPlanes = 1;
lpBmpInfo->bmiHeader.biCompression = 0;
lpBmpInfo->bmiHeader.biSizeImage = nWidth*nHeight*3 ; //may be need to be recalculated
lpBmpInfo->bmiHeader.biXPelsPerMeter = 0x0;
lpBmpInfo->bmiHeader.biYPelsPerMeter = 0x0;
lpBmpInfo->bmiHeader.biClrUsed = 0;
lpBmpInfo->bmiHeader.biClrImportant = 0;
//init m_pBmpBits
m_nSize=nWidth*nHeight*3;
m_pBmpBits = (byte*) new BYTE[m_nSize];
for(int i = 0;i < sizeof(m_pBmpBits); i++)
{
m_pBmpBits[i]=(byte)0xFF; //init as white background;
}
//create bitmap object
CreateBitMap(lpBmpInfo,m_pBmpBits);
}

bool CBitMapUtil::CreateBitMap(LPBITMAPINFO lpBmpInfo,LPVOID lpSrcBits)
{
//HDC hMemDC;
CreateFileHeader();
hMemDC = CreateCompatibleDC (NULL);
m_hBitMap = CreateDIBSection(hMemDC,lpBmpInfo,DIB_RGB_COLORS,&lpSrcBits,NULL,0);
//delete hMemDC;
return true;
}

void CBitMapUtil::SetPixel(int xPixel,int yPixel,COLORREF color)
{
CDC * pDC=CDC::FromHandle(hMemDC);
//pDC->SelectObject(m_hBitMap);
pDC->SetPixel(xPixel,yPixel,color);
//delete dc;
}

void CBitMapUtil::CreateFileHeader()
{
hBmpFhd.bfType = (('M'<<8)|'B');
//hBmpFhd.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(m_pBmpBits);
hBmpFhd.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + m_nSize;
hBmpFhd.bfReserved1 = 0;
hBmpFhd.bfReserved2 = 0;
hBmpFhd.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
}

bool CBitMapUtil::SaveBitMap(LPCTSTR lpszFileName)
{
CFile file;
if (!file.Open(lpszFileName, CFile::modeWrite|CFile::modeCreate))
return FALSE;

file.Write(&hBmpFhd, sizeof(hBmpFhd));
// Write the DIB header
file.Write(lpBmpInfo, sizeof(BITMAPINFOHEADER));

// Write DIB bits
file.Write(m_pBmpBits, lpBmpInfo->bmiHeader.biSizeImage);

file.Close();
return TRUE;
}

CBitMapUtil::~CBitMapUtil()
{
//delete m_hBitMap;
delete m_pBmpBits;
delete lpBmpInfo;
}

// 3、使用方法

#include "Bitmap.h"//引用头文件
//在任何适当的地方

CBitMapUtil bmp(32,32,24);//尺寸任意,24必须
bmp.SetPixel(0,0,RGB(255,0,0));
//...随意画图
bmp.SaveBitMap("c:\\bmp.bmp");//文件名自定

//当前问题:1、色彩不对,2、位置不对。(好好调吧)
minworld 2003-08-31
  • 打赏
  • 举报
回复
不知道你的位图文件每一行字节数的大小是不是能被四整除啊
dawndu 2003-08-31
  • 打赏
  • 举报
回复
学习,帮你up
njsg_zeng 2003-08-30
  • 打赏
  • 举报
回复
lpBmpInfo->bmiHeader.biSizeImage = nWidth*nHeight*3 ; //may be need to be recalculated

有没有考虑到图象宽度*bitCount/8不能够被8整除需要补位的情况阿,建议看些关于bmp格式的文章
tobephonix 2003-08-27
  • 打赏
  • 举报
回复
to youda() :本人的理解是24位颜色模式是直接用像素数据表示颜色信息(rrggbb),没有用到颜色表,所以就没有考虑颜色的尺寸,不知道这样是否正确。
youda 2003-08-26
  • 打赏
  • 举报
回复
to up
既然bih.biBitCount=24,就是BID,而不是DDB,就要考虑颜色表!
那么bfh.bfsize,bfh.bfOffBits的大小就要加上颜色表大小,sizeof(RGBQURAD)*m_nColorEntries.

DDB与DIB的结构是不同的,注意CBITMAP类BMP的区别!
chenghl 2003-08-25
  • 打赏
  • 举报
回复
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
memset(&bfh, 0, sizeof(BITMAPFILEHEADER));
memset(&bih, 0, sizeof(BITMAPINFOHEADER));
bfh.bfType =0x4D42;//别少了!!!!
bfh.bfSize =sizeof(BITMAPFILEHEADER) +sizeof(BITMAPINFOHEADER) +size;
bfh.bfOffBits =sizeof(BITMAPFILEHEADER) +sizeof(BITMAPINFOHEADER);//54

bih.biSize = (LONG)sizeof(BITMAPINFOHEADER);
bih.biWidth = 352;//Width;
bih.biHeight= 288;//Height;
bih.biPlanes = 1;
bih.biBitCount = 24;
bih.biCompression = BI_RGB;
bih.biSizeImage = size;
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
bih.biClrUsed = 0;
bih.biClrImportant =0;
mct1025 2003-08-20
  • 打赏
  • 举报
回复
我也遇到过这个问题,有些图片能打开,有些图片打不开,但不知怎么解决

帮你up
yingyinghz 2003-08-20
  • 打赏
  • 举报
回复
说实话。。。这么长的程序,,又没有注释。。。愿意看的人好像不多
yingyinghz 2003-08-20
  • 打赏
  • 举报
回复
BMP文件有固定的文件头和格式,

(具体也记得不是很清楚是怎样的了)保证这些都没错,,才能让文件打开
tobephonix 2003-08-19
  • 打赏
  • 举报
回复
没人理,郁闷!

大家给点意见吧,UP有分!

19,469

社区成员

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

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