Mostrar imágenes en el control de imagen en mfc

El programa es el siguiente:
simplemente llame a la función ShowMatImgToWnd (CWnd * pWnd, cv :: Mat img) para mostrar la imagen deseada en el control de imagen, donde se ingresa el controlador del control de imagen en el parámetro CWnd * pWnd, y se puede usar GetDlgItem (IDC_picture). ) Y otros métodos para obtener (IDC_picture es la ID del control de imagen), el parámetro Mat img es la imagen que desea mostrar en formato Mat
void ShowMatImgToWnd (CWnd * pWnd, cv :: Mat img)
{    
    if (img.empty ())  
        return;  

    CRect drect;       
    pWnd-> GetClientRect (& drect); // (drect); (& drect); Ambos métodos están disponibles    

    CClientDC dc (pWnd);
    HDC hDC = dc.GetSafeHdc ();

    // Los datos de la imagen en la memoria se copian en la pantalla
    BYTE * bitBuffer = NULL;
    BITMAPINFO * bitMapinfo = NULL;

    int ichannels = img.channels ();
    if (ichannels == 1)
    {
        bitBuffer = nuevo BYTE [40 + 4 * 256]; 
    }
    else if (ichannels == 3)
    {
        bitBuffer = new BYTE [sizeof (BITMAPINFO)]; 
    }
    else
    {
        return;
    }


    if (bitBuffer == NULL)
    {    
        return;
    }


    bitMapinfo = (BITMAPINFO *) bitBuffer;
    bitMapinfo-> bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
    bitMapinfo-> bmiHeader.biHeight = -img.rows; // Si la altura es positiva, la posición inicial del mapa de bits está en la esquina inferior izquierda. Si la altura es negativa, la posición inicial es en la esquina superior izquierda.
    bitMapinfo-> bmiHeader.biWidth = img.cols;
    bitMapinfo-> bmiHeader.biPlanes = 1; // El nivel del dispositivo de destino debe ser 1    
    bitMapinfo-> bmiHeader.biBitCount = ichannels * 8; // bits necesarios para cada píxel El número debe ser uno de 1 (color dual), 4 (16 colores), 8 (256 colores) o 24 (color verdadero)
    bitMapinfo-> bmiHeader.biCompression = BI_RGB; // Tipo de compresión de mapa de bits, debe ser 0 (sin compresión) ), Uno de 1 (tipo de compresión BI_RLE8) o 2 (tipo de compresión BI_RLE4)
    bitMapinfo-> bmiHeader.biSizeImage = 0; // el tamaño del mapa de bits, en bytes
    bitMapinfo-> bmiHeader.biXPelsPerMeter = 0; // bit Figura resolución horizontal, píxeles por metro
    bitMapinfo-> bmiHeader.biYPelsPerMeter = 0; // Resolución vertical de mapa de bits, píxeles por metro
    bitMapinfo-> bmiHeader.biClrUsed = 0; // Número de colores en la tabla de colores realmente utilizados por el
    mapa de bits bitMapinfo-> bmiHeader.biClrImportant = 0; // El número de colores importantes en el proceso de visualización de mapa de bits

    if (ichannels == 1)
    {
        for (int i = 0; i <256; i ++)
        {// 颜色 的 取值 范围 (0-255)
            bitMapinfo-> bmiColors [i] .rgbBlue = bitMapinfo-> bmiColors [i ] .rgbGreen = bitMapinfo-> bmiColors [i] .rgbRed = (BYTE) i;
        }

        bitMapinfo-> bmiHeader.biClrUsed = 256; // Número de colores en la tabla de colores realmente utilizada por el mapa de bits
    }
    SetStretchBltMode (hDC, COLORONCOLOR);

    
    StretchDIBits (hDC,
        0,
        0,
        drect.right, // Mostrar ancho de ventana
        drect.bottom, // Mostrar alto de ventana
        0,
        0,
        img.cols, // Ancho de imagen
        img.rows, // Altura de imagen
        img.data,            
        bitMapinfo,            
        DIB_RGB_COLORS, 
        SRCCOPY
        );

    eliminar [] bitBuffer;

}

Publicado 59 artículos originales · Me gusta46 · Visitas 30,000+

Supongo que te gusta

Origin blog.csdn.net/sinat_41852207/article/details/90372619
Recomendado
Clasificación