Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Crear un TBitmap a partir de un Buffer (https://www.clubdelphi.com/foros/showthread.php?t=214)

joecool 08-05-2003 14:52:50

Crear un TBitmap a partir de un Buffer
 
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:

Código:

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

BITMAP Buffer
 
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.


La franja horaria es GMT +2. Ahora son las 06:35:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi