【mfc】二维数组在picture控件显示

本文介绍了一种使用C++在Windows环境下随机生成并显示彩色图像的方法。通过随机填充二维数组来创建图像数据,并利用StretchDIBits函数进行图像的缩放显示。文中详细解释了图像数据的组织方式、内存分配及释放过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值