¿Cómo mostrar una matriz bidimensional directamente como una imagen en escala de grises en MFC para lograr funciones similares a imshow() o imagesc() en matlab?
En MFC, puede mostrar una matriz bidimensional directamente como una imagen en escala de grises utilizando la función BitBlt() de la clase CDC. Los pasos específicos son los siguientes:
1. Cree un objeto DIB (mapa de bits independiente del dispositivo) para almacenar datos de imágenes en escala de grises.
2. Escanea cada elemento de la matriz bidimensional y conviértelo al valor de color correspondiente. Para una imagen en escala de grises de 8 bits, el valor de color de cada píxel oscila entre 0 y 255.
3. Escriba el valor del color en el objeto DIB y establezca el ancho y el alto de la imagen.
4. Utilice la función BitBlt() de la clase CDC para mostrar los datos de la imagen en el objeto DIB en el dispositivo especificado, como el lienzo o la ventana.
El siguiente es un código de muestra:
```c
// Supongamos que la matriz bidimensional de entrada es grayData, con ancho como ancho y alto como alto
p>
int ancho = 320;
int alto = 240;
BYTE* grayData = nuevo BYTE[ancho * alto] ;
// Crear objeto DIB
BITMAPINFO bmi;
ZeroMemory(amp;bmi, sizeof(BITMAPINFO));
bmi .bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = ancho;
bmi.bmiHeader.biHeight = -height // El número negativo indica de arriba hacia abajo
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 8
bmi.bmiHeader.biCompression = BI_RGB
bmi.bmiHeader.biSizeImage = ancho * alto;
HDC hdc = GetDC(hWnd); // hWnd es el identificador de la ventana
HBITMAP hBitmap = CreateDIBSection(hdc, bmi, DIB_RGB_COLORS , (void**) grayData, NULL, 0);
//Convierte la matriz bidimensional a datos en escala de grises
for (int y = 0; y lt; height; y) {
for (int x = 0; x lt; width; x) {
BYTE grayValue = ... // Calcula el valor del color según la entrada dos -matriz dimensional
grayData[y * width x] = grayValue;
}
}
//Mostrar imagen en escala de grises p>
CDC* pDC = CDC::FromHandle(hdc);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap bmp ;
bmp.Attach(hBitmap);
CBitmap* pOldBmp = memDC.SelectObject(amp; bmp);
pDC-gt; 0, ancho, alto, amp; memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBmp);
```
En este De esta manera, puede convertir la matriz bidimensional. La matriz se muestra directamente como una imagen en escala de grises.