C/Visual C - Ayuda sobre cargar imagenes en memoria

 
Vista:

Ayuda sobre cargar imagenes en memoria

Publicado por Alberto David (9 intervenciones) el 06/10/2000 00:00:00
Por favor, si alguien sabe como cargar una imagen que no sea un BMP, me interesan JPG y TIFF fundamentalmente, de tal forma que en memoria quede en formato DIB que me lo explique.
Muchas gracias. A.D.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Cargar imágenes JPG y TIFF como DIB en memoria

Publicado por Alejandro (913 intervenciones) el 03/09/2024 19:56:28
Para cargar imágenes en formatos diferentes a BMP, como JPG y TIFF, y almacenarlas en memoria en formato DIB (Device Independent Bitmap), puedes utilizar las funciones de la biblioteca Windows GDI (Graphics Device Interface). A continuación, te proporciono un ejemplo de cómo cargar una imagen JPG o TIFF y convertirla en un DIB en C++:

1. Incluye las siguientes cabeceras en tu archivo de código:

1
2
3
#include <windows.h>
#include <gdiplus.h>
#pragma comment(lib, "gdiplus.lib")

2. Define una función para cargar la imagen y convertirla en un DIB:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
HBITMAP LoadImageAsDIB(const wchar_t* filePath)
{
    Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
 
    Gdiplus::Bitmap* bitmap = Gdiplus::Bitmap::FromFile(filePath);
    if (bitmap == NULL)
    {
        Gdiplus::GdiplusShutdown(gdiplusToken);
        return NULL;
    }
 
    Gdiplus::BitmapData bitmapData;
    Gdiplus::Rect rect(0, 0, bitmap->GetWidth(), bitmap->GetHeight());
    bitmap->LockBits(&rect, Gdiplus::ImageLockModeRead, PixelFormat32bppARGB, &bitmapData);
 
    BITMAPINFOHEADER bi;
    bi.biSize = sizeof(BITMAPINFOHEADER);
    bi.biWidth = bitmapData.Width;
    bi.biHeight = -bitmapData.Height; // Negativo para invertir la imagen verticalmente
    bi.biPlanes = 1;
    bi.biBitCount = 32;
    bi.biCompression = BI_RGB;
    bi.biSizeImage = 0;
    bi.biXPelsPerMeter = 0;
    bi.biYPelsPerMeter = 0;
    bi.biClrUsed = 0;
    bi.biClrImportant = 0;
 
    HDC hdc = GetDC(NULL);
    HBITMAP dib = CreateDIBitmap(hdc, &bi, CBM_INIT, bitmapData.Scan0, (BITMAPINFO*)&bi, DIB_RGB_COLORS);
    ReleaseDC(NULL, hdc);
 
    bitmap->UnlockBits(&bitmapData);
    delete bitmap;
 
    Gdiplus::GdiplusShutdown(gdiplusToken);
 
    return dib;
}

3. Llama a la función `LoadImageAsDIB` pasando la ruta del archivo JPG o TIFF:

1
2
3
4
5
6
7
8
9
10
11
12
13
const wchar_t* filePath = L"ruta_de_la_imagen.jpg"; // Cambia esto por la ruta de tu imagen JPG o TIFF
HBITMAP dib = LoadImageAsDIB(filePath);
if (dib != NULL)
{
    // La imagen se ha cargado y convertido en un DIB correctamente
    // Puedes utilizar el DIB como desees
    // Recuerda liberar la memoria del DIB cuando ya no lo necesites:
    DeleteObject(dib);
}
else
{
    // Error al cargar o convertir la imagen
}

Ten en cuenta que este código utiliza la biblioteca GDI+ de Windows para cargar y manipular imágenes. Asegúrate de tener instalada la biblioteca GDI+ y de vincular la biblioteca `gdiplus.lib` en tu proyecto.

Espero que esta información te sea útil y te ayude a cargar imágenes en formatos JPG y TIFF como DIB en C++. ¡Buena suerte con tu proyecto, Alberto!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar