PDA

Ver la Versión Completa : Crear un TBitmap a partir de un Buffer


joecool
08-05-2003, 14:52:50
Necesitaría generar un objeto TBitmap a partir de un buffer de datos. Me explico:

Una dll me devuelve un buffer de una longitud determinada con los bytes correspondientes a una imagen.

Dispongo de la profundidad de color en bits y las dimensiones de la imagen en pixels.

Utilizo la función createbitmap de las API que devuelve un HBitmap. (Es un handle a un bitmap). Todo parece correcto, pero al asignar ese handle a un nuevo TBitmap (MiBitmap.handle.assign(pBitmap)) no consigo visualizarlo en un tPicture.

Alguien conoce algún procedimiento diferente para conseguir el objetivo de mostrar un buffer de datos (formato bitmap) en un TImage?? ::confused:

Un saludo.

delphi.com.ar
08-05-2003, 16:46:27
Es que te falta pasarle todo el resto de los datos, lo único que estas haciendo es creando un Bitmap vacío.
Te recomiendo leer un poco la documentación de las funciones:
SetDIBits, PlgBlt, BitBlt, o ver el código de CopyBitmap

joecool
08-05-2003, 23:42:20
No me he explicado bien. Dispongo de un array de datos que contiene la infomación del bitmap en formato RGB con 24 bits/pixel, es decir, cada 3 bytes corresponde a un color RGB. Por otra parte dispongo de la anchura y altura del bitmap y de una estructura BitmapInfoHeader dentro de una BitmapInfo.

Según la Windows SDK la función createDIBitmap dice:

The CreateDIBitmap function creates a device-dependent bitmap (DDB) from a device-independent bitmap (DIB) and, optionally, sets the bitmap bits.

HBITMAP CreateDIBitmap(

HDC hdc, // handle to device context
CONST BITMAPINFOHEADER *lpbmih, // pointer to bitmap size and format data
DWORD fdwInit, // initialization flag
CONST VOID *lpbInit, // pointer to initialization data
CONST BITMAPINFO *lpbmi, // pointer to bitmap color-format data
UINT fuUsage // color-data usage
);

Así que relleno las estructuras y paso el puntero a los datos en el puntero *lpbInit.

La función no me devuelve 0, me devuelve un handle a un bitmap.

Mi pregunta:

Como hago para convertir ese handle a un bitmap en un TBitmap de delphi?

O igual no he comprendido la respuesta que me has dado.

He mirado el código fuente de la función CopyBitmap y creo que trabaja con handles y devuelve otro handle.

Igualmente con las funciones SetDIBits (que creo que lo que hace es rellenar los datos del handle con los de un array de datos, pero que la función createDIBitmap puede hacerlo al tiempo que crea el handle. Las otras funciones copian un rectangulo y un paralelogramo (???) pero siempre trabajan con handles.

Ya tengo un handle. Quizás esté vacío (en caso de que la función CreateDIBitmap solo creara el bitmap a cero) y lo pueda rellenar con las otras funciones. Pero luego necesito verlo con un objeto TImage, TPicture o TBitmap de Delphi.

Gracias por tu interés.

delphi.com.ar
09-05-2003, 00:03:34
Veo que no te entendí bien, este código yo lo utilizo, después de hacer unas cuantas cosas, entre ellas lo que haces vos:

var
hBmp : HBITMAP;
Bmp : TBitmap;
begin
...
hBmp := CreateDIBitmap( GetWindowDC(GetDesktopWindow()), ... );
Bmp := TBitmap.Create;
Try
Bmp.Handle := hBmp;
Bmp.SaveToFile( 'c:\...' );
finally
Bmp.Free;
end;


Lo resumí un poquito...

joecool
09-05-2003, 00:35:40
De nuevo muchas gracias.

La verdad, después de tanta documentación creo que al poner la pregunta no lo expliqué como era debido.

Sigue sin funcionar, encontraré el problema (quizás esté en los parámetros de la estructura BitmapInfo) pues la función CreateDIBitmap crea un handle que al asignarlo al TBitmap le pone la anchura y la altura a 1.

Un saludo y de nuevo gracias por tu paciencia.

;)

joecool
09-05-2003, 01:23:34
Lo tengo!!!

Al crear la estructrura TBitmapInfoHeader hay que inicializar el valor biSize.

La variable era

nfoHead : TBitmapInfoHeader

la inicializaba con

new(nfoHead)

y pasaba el valor a biSize mediante

nfoHead^.biSize := SizeOf(nfoHead)

Cuando en realidad tenía que ser:

nfoHead^.biSize := SizeOf(TBitmapInfoHeader)

Encontrar esta pulga entre todo el código ha sido un calvario pues no es lo mismo el tamaño del puntero que el tamaño de la estructura a la que apunta el puntero :(

La próxima vez postearé el código completo en la pregunta.

Gracias delphi.com.ar por el código de asignación del handle. Creí que el problema estaba ahí. La confirmación de que a tí te funcionaba me ha permitido buscar en otros segmentos del código. Me hubiera vuelto loco con la tontería de los handles y como son gestionados por los TBitmap.

De nuevo Gracias y Un saludo.

fitolanga
19-04-2007, 20:56:37
Hola, soy nuevo en Delphi y ya que están hablando sobre Bitmap les cuento que tengo una imagen en un una clase tbitmap y necesito pasarle el buffer rgb24 a una función, sería un puntero a los datos de la imagen... se puede???
Muchas gracias.