unsigned char arry0[1200][1000];
CBitmap m_bmp;
void CShowImageDlg::OnBnClickedButton2()
{
int iWidth = 1000;
int iHeight = 1200;
//随机生成颜色
srand((int)time(0));
for (int i = 0; i < iHeight; i++)
{
for (int j = 0; j < iWidth; j++)
{
//分两种,要测试画图方向是否正确
if (i < 10 && j < 20)
{
arry0[i][j] = 255;
}
else
{
arry0[i][j] = rand()%256;
}
}
}
//计时开始
clock_t clockBegin, clockEnd;
clockBegin = clock();
int iBytesWidth;
iBytesWidth = (iWidth*24+31)/32*4; //一个像素占3个字节,24位。然后转化为4字节整数倍
//分配空间 ,2选1
//Global分配空间
//HANDLE hMem = GlobalAlloc(GMEM_MOVEABLE, iBytesWidth * iHeight * 3);
//BYTE *Image = (BYTE*)GlobalLock(hMem);
//new分配空间
BYTE *Image = new BYTE[iBytesWidth * iHeight * 3];
for(int i = 0; i < iHeight; i++)
{
for(int j = 0; j<iWidth; j++)
{
*(Image+i*iBytesWidth+j*3) = arry0[iHeight - i - 1][j];//image的左下角对应数组的左上角,原点坐标不一样
*(Image+1+i*iBytesWidth+j*3) = arry0[iHeight - i - 1][j];
*(Image+2+i*iBytesWidth+j*3) = arry0[iHeight - i - 1][j];
}
}
BITMAPINFO bmi;
ZeroMemory(&bmi, sizeof(BITMAPINFO));
bmi.bmiHeader.biSizeImage = (iWidth*24+31)/32*4*iHeight;
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = iWidth;
bmi.bmiHeader.biHeight = iHeight;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biCompression = BI_RGB;
CDC * dc;
dc = GetDlgItem(IDC_RotImageShow)->GetDC(); // 获取picture控件DC
//提供两种方式显示图片
//方式一,因为图像比较大,根据控件大小自动缩放
CRect rc;
CWnd *pWnd = GetDlgItem(IDC_RotImageShow);//参数为控件ID。
pWnd->GetClientRect(&rc);//rc为控件的大小。
StretchDIBits(dc->GetSafeHdc(), 0, 0, rc.Width(), rc.Height(), 0, 0, iWidth, iHeight, Image, &bmi, DIB_RGB_COLORS, SRCCOPY);
//方式二,图像多大,显示多少,容易显示不全,但是显示速度快,因为不需要缩放插值
//::SetDIBitsToDevice(dc->GetSafeHdc(), 0, 0, iWidth, iHeight, 0, 0, 0, iHeight, Image, &bmi, DIB_RGB_COLORS);
//释放空间 ,2选1
//Global释放空间
//GlobalUnlock(hMem);
//GlobalFree(hMem);
//delete释放空间
delete [] Image;
//用时
clockEnd = clock();
int time = (clockEnd-clockBegin);
SetDlgItemInt(IDC_EDIT1, time);
}