Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-05-2003
joecool joecool is offline
Miembro
 
Registrado: may 2003
Ubicación: Sant Boi - Barcelona
Posts: 15
Poder: 0
joecool Va por buen camino
Lightbulb 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?? :

Un saludo.
__________________
Disclaimer (no sé cómo se traduce pero los yankis lo ponen en toas partes- Debe ser algo así como me desentiendo de...).
Lo anteriormente expresado es una mera opinión y no está sujeta a garantía de ningún tipo.
Vamos, que es lo que me parece, me ha funcionado o he visto/leido, pero que me funcione a mí no quiere decir que te funcione a tí.
Responder Con Cita
  #2  
Antiguo 08-05-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
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
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 09-05-2003
joecool joecool is offline
Miembro
 
Registrado: may 2003
Ubicación: Sant Boi - Barcelona
Posts: 15
Poder: 0
joecool Va por buen camino
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.
__________________
Disclaimer (no sé cómo se traduce pero los yankis lo ponen en toas partes- Debe ser algo así como me desentiendo de...).
Lo anteriormente expresado es una mera opinión y no está sujeta a garantía de ningún tipo.
Vamos, que es lo que me parece, me ha funcionado o he visto/leido, pero que me funcione a mí no quiere decir que te funcione a tí.
Responder Con Cita
  #4  
Antiguo 09-05-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
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...
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #5  
Antiguo 09-05-2003
joecool joecool is offline
Miembro
 
Registrado: may 2003
Ubicación: Sant Boi - Barcelona
Posts: 15
Poder: 0
joecool Va por buen camino
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.

__________________
Disclaimer (no sé cómo se traduce pero los yankis lo ponen en toas partes- Debe ser algo así como me desentiendo de...).
Lo anteriormente expresado es una mera opinión y no está sujeta a garantía de ningún tipo.
Vamos, que es lo que me parece, me ha funcionado o he visto/leido, pero que me funcione a mí no quiere decir que te funcione a tí.
Responder Con Cita
  #6  
Antiguo 09-05-2003
joecool joecool is offline
Miembro
 
Registrado: may 2003
Ubicación: Sant Boi - Barcelona
Posts: 15
Poder: 0
joecool Va por buen camino
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.
__________________
Disclaimer (no sé cómo se traduce pero los yankis lo ponen en toas partes- Debe ser algo así como me desentiendo de...).
Lo anteriormente expresado es una mera opinión y no está sujeta a garantía de ningún tipo.
Vamos, que es lo que me parece, me ha funcionado o he visto/leido, pero que me funcione a mí no quiere decir que te funcione a tí.
Responder Con Cita
  #7  
Antiguo 19-04-2007
fitolanga fitolanga is offline
Registrado
 
Registrado: abr 2007
Posts: 7
Poder: 0
fitolanga Va por buen camino
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
crear tabla a partir de otra con sql JoseQ Conexión con bases de datos 4 12-01-2012 15:20:48
Crear un Reporte a partir de archivos de texto franciscobucio Impresión 4 18-01-2007 19:49:09
Crear TTable a partir de un TQuery ContraVeneno Conexión con bases de datos 10 23-06-2005 23:38:49
Crear una BD en blanco a partir de la estructura de otra?? burasu Conexión con bases de datos 1 11-03-2005 18:33:24
Crear un pdf a partir de otros pdf barencibia Varios 0 13-06-2004 20:25:08


La franja horaria es GMT +2. Ahora son las 21:51:27.


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
Copyright 1996-2007 Club Delphi