现在我大致明白如何设置BitmapInfoheader了,可是在创建一个Bitmap对象时出问题: pbitmap = Bitmap::FromBITMAPINFO(p_bmi,imagedata); 这个执行后发现pbitmap是空的,就是说FromBITMAPINFO返回了空指针,我自己新分配一块图像数据大小的内存块然后
初始化为0,发现还是这样,所以推断应该是p_bmi的问题。p_bmi我是这样初始化的: m_pbmi = (BITMAPINFO*)malloc(sizeof(BITMAPINFO));
m_pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
m_pbmi->bmiHeader.biPlanes = 1;
m_pbmi->bmiHeader.biBitCount = 24;
m_pbmi->bmiHeader.biClrUsed = 0;
m_pbmi->bmiHeader.biClrImportant = 0;
m_pbmi->bmiHeader.biCompression = BI_RGB;
m_pbmi->bmiHeader.biSizeImage = 0;
m_pbmi->bmiHeader.biXPelsPerMeter = 0;
m_pbmi->bmiHeader.biYPelsPerMeter = 0;
// m_pbmi->bmiColors = NULL;
m_pbmi->bmiColors[0].rgbBlue=0;
m_pbmi->bmiColors[0].rgbGreen=0;
m_pbmi->bmiColors[0].rgbRed=0;
m_pbmi->bmiColors[0].rgbReserved=0;
不知道是不是有问题,很多文章里提到说biBitcount=24时,bmiColors应该为空,怎么设置为空呢?还是说我其他的设置有错?请有经验的人指点一下!
初始化为0,发现还是这样,所以推断应该是p_bmi的问题。p_bmi我是这样初始化的: m_pbmi = (BITMAPINFO*)malloc(sizeof(BITMAPINFO));
m_pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
m_pbmi->bmiHeader.biPlanes = 1;
m_pbmi->bmiHeader.biBitCount = 24;
m_pbmi->bmiHeader.biClrUsed = 0;
m_pbmi->bmiHeader.biClrImportant = 0;
m_pbmi->bmiHeader.biCompression = BI_RGB;
m_pbmi->bmiHeader.biSizeImage = 0;
m_pbmi->bmiHeader.biXPelsPerMeter = 0;
m_pbmi->bmiHeader.biYPelsPerMeter = 0;
// m_pbmi->bmiColors = NULL;
m_pbmi->bmiColors[0].rgbBlue=0;
m_pbmi->bmiColors[0].rgbGreen=0;
m_pbmi->bmiColors[0].rgbRed=0;
m_pbmi->bmiColors[0].rgbReserved=0;
不知道是不是有问题,很多文章里提到说biBitcount=24时,bmiColors应该为空,怎么设置为空呢?还是说我其他的设置有错?请有经验的人指点一下!
解决方案 »
- 怎么能把matlab程序在脱离MATLAB环境下运行
- 请教有什么持续集成(CI)和自动化单元测试工具适合VC项目使用
- 一个比较低的问题。
- ★★★哪位大哥可用分多的用不了,能否给小弟捐献一些,实在不行我用钱买!!!★★★
- 请教有关socket传输长字符串的好方案
- 错误:warning C4244: “=” : 从“INT_PTR”转换到“int”,可能丢失数据 请帮助
- 高分求助,在vc中怎样用ODBC动态创建一个Access数据库(在线等待)
- 在 ODBC 中应用DDX 和 RFX
- “地理信息系统”是什么
- SNMP网络管理软件开发
- 关于阻塞的CSOCKET和非阻塞的CAsyncSocket
- 如何在Direct3D程序环境中使用DirectShow播放视频了?
就是说没有图像数据了还有你没有设置图像的宽高;这样当然不能创建图像了
int nBytesPerLine = ((m_nWidth * 32 + 31) & (~31)) >> 3;
// Populate BITMAPINFO header
bmih.biSize = sizeof(BITMAPINFOHEADER);
bmih.biWidth = m_nWidth;
bmih.biHeight = m_nHeigh;
bmih.biPlanes = 1;
bmih.biBitCount = 32;
bmih.biCompression = BI_RGB;
bmih.biClrUsed = 0;
bmih.biSizeImage = nBytesPerLine * m_nHeigh; PVOID pvBits = NULL;
HBITMAP hbmpMem = ::CreateDIBSection(NULL, (PBITMAPINFO)&bmih, DIB_RGB_COLORS, &pvBits, NULL, 0);
ASSERT(hbmpMem != NULL);
memset( pvBits, 0, m_nWidth * 4 * m_nHeigh);
其它问题,由于FromBITMAPINFO的内部不知道啊
{
BITMAPINFO bmi = {0};
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biWidth = 101;
bmi.bmiHeader.biHeight = 102;
bmi.bmiHeader.biCompression = BI_RGB;
int nPixelBytes = bmi.bmiHeader.biBitCount / 8;
if (nPixelBytes * 8 != bmi.bmiHeader.biBitCount)
return;
int nWidthBytes = ((bmi.bmiHeader.biWidth * nPixelBytes) / 4 + 1) * 4;
int nSize = nWidthBytes * bmi.bmiHeader.biHeight;
LPBYTE pBmpData = new BYTE[nSize];
if (!pBmpData)
return;
for (int i = 0; i < nSize; i++)
pBmpData[i] = rand() % 255;
Bitmap* pBmp = Bitmap::FromBITMAPINFO(&bmi, pBmpData);
if (pBmp)
{
graphics.DrawImage(pBmp, 10, 10);
}
delete[] pBmpData;
}
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biWidth = 320;
bmi.bmiHeader.biHeight = 240;
bmi.bmiHeader.biCompression = BI_RGB;
int nPixelBytes = bmi.bmiHeader.biBitCount / 8;
if (nPixelBytes * 8 != bmi.bmiHeader.biBitCount)
return;
int nWidthBytes = ((bmi.bmiHeader.biWidth * nPixelBytes) / 4 + 1) * 4;
int nSize = nWidthBytes * bmi.bmiHeader.biHeight;
LPBYTE pBmpData = new BYTE[nSize];
if (!pBmpData)
return;
for (int i = 0; i < nSize; i++)
pBmpData[i] = rand() % 255;
Bitmap* pBmp = Bitmap::FromBITMAPINFO(&bmi, pBmpData);然后就看到pBmp是空的,0x00000000.不明白是怎么回事。
bmiColors数组只有一个数据成员,它是怎么存贮的呢?