我有一个数据矩阵
int image[300][300];
内容为 0 表示 白色
1 表示 黑色
2 表示 经色
3 表示 蓝色
4 表示 绿色
怎样快速在 vc ::OnDraw(CDC* pDC)
函数中显示 这个图像? 用画点的方法我会,但速度大慢,刷新时会看到画的过程程
能不能把矩阵转化为 CBitmap 再显示,如下面这个样子 CDC MemDC;
BITMAP bm;
CBitmap Bitmap;
// Bitmap.LoadBitmap(IDB_BITMAP1); // 用函改成 从矩阵 image[300][300]中获得
Bitmap.GetObject(sizeof(BITMAP),&bm);
MemDC.CreateCompatibleDC(pDC);
MemDC.SelectObject(&Bitmap);
pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY); MemDC.DeleteDC();
int image[300][300];
内容为 0 表示 白色
1 表示 黑色
2 表示 经色
3 表示 蓝色
4 表示 绿色
怎样快速在 vc ::OnDraw(CDC* pDC)
函数中显示 这个图像? 用画点的方法我会,但速度大慢,刷新时会看到画的过程程
能不能把矩阵转化为 CBitmap 再显示,如下面这个样子 CDC MemDC;
BITMAP bm;
CBitmap Bitmap;
// Bitmap.LoadBitmap(IDB_BITMAP1); // 用函改成 从矩阵 image[300][300]中获得
Bitmap.GetObject(sizeof(BITMAP),&bm);
MemDC.CreateCompatibleDC(pDC);
MemDC.SelectObject(&Bitmap);
pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY); MemDC.DeleteDC();
然后再根据CBitmap构造一个对象,其主要工作就是构造楼上所说的信息头,还有一个调色板,之后把你
所定义的颜色值对应为RGB三分量,最后你就可以去显示了.
int color[300][300];
for(int i=0;i<5;i+=8)
for(int j=0;j<300;j++)
color[50*i+30][j]=i; // 定义BITMAPINFO 结构和颜色表 BITMAPINFO *pBmpInfo = (BITMAPINFO*)new char[sizeof(BITMAPINFO) + sizeof(RGBQUAD) * (5)];
pBmpInfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
pBmpInfo->bmiHeader.biWidth=300;
pBmpInfo->bmiHeader.biHeight=300;
pBmpInfo->bmiHeader.biPlanes=1;
pBmpInfo->bmiHeader.biBitCount=4;// 4 位 位图 16色
pBmpInfo->bmiHeader.biCompression=0;
pBmpInfo->bmiHeader.biClrUsed=5; // 这里填5不知对不对 ?
pBmpInfo->bmiHeader.biSizeImage=0;
pBmpInfo->bmiHeader.biXPelsPerMeter=0;
pBmpInfo->bmiHeader.biYPelsPerMeter=0;
pBmpInfo->bmiHeader.biClrImportant=0; // 白色
pBmpInfo->bmiColors[0].rgbRed=255;
pBmpInfo->bmiColors[0].rgbGreen=255;
pBmpInfo->bmiColors[0].rgbBlue=255;
pBmpInfo->bmiColors[0].rgbReserved=0; // 黑色
pBmpInfo->bmiColors[1].rgbRed=0;
pBmpInfo->bmiColors[1].rgbGreen=0;
pBmpInfo->bmiColors[1].rgbBlue=0;
pBmpInfo->bmiColors[1].rgbReserved=0; // 红色
pBmpInfo->bmiColors[2].rgbRed=255;
pBmpInfo->bmiColors[2].rgbGreen=0;
pBmpInfo->bmiColors[2].rgbBlue=0;
pBmpInfo->bmiColors[2].rgbReserved=0; // 绿色
pBmpInfo->bmiColors[3].rgbRed=0;
pBmpInfo->bmiColors[3].rgbGreen=255;
pBmpInfo->bmiColors[3].rgbBlue=0;
pBmpInfo->bmiColors[3].rgbReserved=0; // 蓝色
pBmpInfo->bmiColors[4].rgbRed=0;
pBmpInfo->bmiColors[4].rgbGreen=0;
pBmpInfo->bmiColors[4].rgbBlue=255;
pBmpInfo->bmiColors[4].rgbReserved=0;
// 内容为 0 白色 1 黑色 2 红色 3 绿色 4 蓝色 byte color[300][300];
for(int i=0;i<5;i+=8)
for(int j=0;j<300;j++)
{
color[50*i+30][j]=i;
color[j][50*i+30]=i;
} // 定义BITMAPINFO 结构和颜色表 BITMAPINFO *pBmpInfo = (BITMAPINFO*)new char[sizeof(BITMAPINFO) + sizeof(RGBQUAD) * (5)];
pBmpInfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
pBmpInfo->bmiHeader.biWidth=300;
pBmpInfo->bmiHeader.biHeight=300;
pBmpInfo->bmiHeader.biPlanes=1;
pBmpInfo->bmiHeader.biBitCount=4;// 4 位 位图 16色
pBmpInfo->bmiHeader.biCompression=0;
pBmpInfo->bmiHeader.biClrUsed=5; // 这里填5不知对不对 ?
pBmpInfo->bmiHeader.biSizeImage=0;
pBmpInfo->bmiHeader.biXPelsPerMeter=0;
pBmpInfo->bmiHeader.biYPelsPerMeter=0;
pBmpInfo->bmiHeader.biClrImportant=0; // 白色
pBmpInfo->bmiColors[0].rgbRed=255;
pBmpInfo->bmiColors[0].rgbGreen=255;
pBmpInfo->bmiColors[0].rgbBlue=255;
pBmpInfo->bmiColors[0].rgbReserved=0; // 黑色
pBmpInfo->bmiColors[1].rgbRed=0;
pBmpInfo->bmiColors[1].rgbGreen=0;
pBmpInfo->bmiColors[1].rgbBlue=0;
pBmpInfo->bmiColors[1].rgbReserved=0; // 红色
pBmpInfo->bmiColors[2].rgbRed=255;
pBmpInfo->bmiColors[2].rgbGreen=0;
pBmpInfo->bmiColors[2].rgbBlue=0;
pBmpInfo->bmiColors[2].rgbReserved=0; // 绿色
pBmpInfo->bmiColors[3].rgbRed=0;
pBmpInfo->bmiColors[3].rgbGreen=255;
pBmpInfo->bmiColors[3].rgbBlue=0;
pBmpInfo->bmiColors[3].rgbReserved=0; // 蓝色
pBmpInfo->bmiColors[4].rgbRed=0;
pBmpInfo->bmiColors[4].rgbGreen=0;
pBmpInfo->bmiColors[4].rgbBlue=255;
pBmpInfo->bmiColors[4].rgbReserved=0;
int wid = 300; // 保存图像参数 图像宽
int hei = 300; // 保存图像参数 图像高
int bits = 4; // 图像每像素所占位数
int rowchars=(wid*bits+31)/32*4; // 每行像素所需的字节数
int PixSize = rowchars*hei; // 计算像素数据大小 char* lpBits=new char[PixSize];
::memset(lpBits,0,PixSize); // 根据数组初始化屏幕数据
for(i=0;i<300;i++)
{
int rr=299-i;
for(j=0;j<300;j++)
{
byte num=color[i][j];
if(j%2==0)
num<<4;
lpBits[rr*rowchars][j/2]+=num;
}
}
{
CDrawBitmapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here // 定义矩阵,内容为不同颜色线构成的网格
// 内容为 0 白色 1 黑色 2 红色 3 绿色 4 蓝色 byte color[300][300];
for(int i=0;i<5;i+=8)
for(int j=0;j<300;j++)
{
color[50*i+30][j]=i;
color[j][50*i+30]=i;
} // 定义BITMAPINFO 结构和颜色表 BITMAPINFO *pBmpInfo = (BITMAPINFO*)new char[sizeof(BITMAPINFO) + sizeof(RGBQUAD) * (5)];
pBmpInfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
pBmpInfo->bmiHeader.biWidth=300;
pBmpInfo->bmiHeader.biHeight=300;
pBmpInfo->bmiHeader.biPlanes=1;
pBmpInfo->bmiHeader.biBitCount=4;// 4 位 位图 16色
pBmpInfo->bmiHeader.biCompression=0;
pBmpInfo->bmiHeader.biClrUsed=5; // 这里填5不知对不对 ?
pBmpInfo->bmiHeader.biSizeImage=0;
pBmpInfo->bmiHeader.biXPelsPerMeter=0;
pBmpInfo->bmiHeader.biYPelsPerMeter=0;
pBmpInfo->bmiHeader.biClrImportant=0; // 白色
pBmpInfo->bmiColors[0].rgbRed=255;
pBmpInfo->bmiColors[0].rgbGreen=255;
pBmpInfo->bmiColors[0].rgbBlue=255;
pBmpInfo->bmiColors[0].rgbReserved=0; // 黑色
pBmpInfo->bmiColors[1].rgbRed=0;
pBmpInfo->bmiColors[1].rgbGreen=0;
pBmpInfo->bmiColors[1].rgbBlue=0;
pBmpInfo->bmiColors[1].rgbReserved=0; // 红色
pBmpInfo->bmiColors[2].rgbRed=255;
pBmpInfo->bmiColors[2].rgbGreen=0;
pBmpInfo->bmiColors[2].rgbBlue=0;
pBmpInfo->bmiColors[2].rgbReserved=0; // 绿色
pBmpInfo->bmiColors[3].rgbRed=0;
pBmpInfo->bmiColors[3].rgbGreen=255;
pBmpInfo->bmiColors[3].rgbBlue=0;
pBmpInfo->bmiColors[3].rgbReserved=0; // 蓝色
pBmpInfo->bmiColors[4].rgbRed=0;
pBmpInfo->bmiColors[4].rgbGreen=0;
pBmpInfo->bmiColors[4].rgbBlue=255;
pBmpInfo->bmiColors[4].rgbReserved=0;
int wid = 300; // 保存图像参数 图像宽
int hei = 300; // 保存图像参数 图像高
int bits = 4; // 图像每像素所占位数
int rowchars=(wid*bits+31)/32*4; // 每行像素所需的字节数
int PixSize = rowchars*hei; // 计算像素数据大小 char* lpBits=new char[PixSize];
::memset(lpBits,0,PixSize); // 根据数组初始化屏幕数据
for(i=0;i<300;i++)
{
int rr=299-i;
for(int j=0;j<300;j++)
{
byte num=color[i][j];
if(j%2==0)
num=num*16;
lpBits[rr*rowchars+j/2]+=num;
}
} // 显示
SetDIBitsToDevice(pDC->GetSafeHdc(),0,0,wid,hei,0,0,0,hei,lpBits,pBmpInfo,DIB_RGB_COLORS);
}显示出来只有一根白线,大部分是黑色
SetDIBitsToDevice(pDC->GetSafeHdc(),0,0,wid,hei,0,0,0,hei,lpBits,pBmpInfo,DIB_RGB_COLORS);
StretchDIBits(pDC->GetSafeHdc(),0,0,300,300,0,0,300,300,lpBits,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);
请大家帮我份析一下什么原因?
我看错了。只改上面的那行试试,如果还不行,调试看看你转换后的数据对不对。
byte color[300][300];
for(int i=0;i <5;i+=8)
for(int j=0;j <300;j++)
{
color[50*i+30][j]=i;
color[j][50*i+30]=i;
}