Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   carga de una imagen en memoria (https://www.clubdelphi.com/foros/showthread.php?t=60479)

oab_boa 03-10-2008 15:47:38

carga de una imagen en memoria
 
Buenas Gente, un saludo a todos.

Tengo este problema, una aplicacion simple con 2 elementos TImage (Image1 e Image2) y un boton, en Image1 tengo una foto.
Lo que quiero es que al hacer click en el boton, me visualice la imagen cargada en Image2, es decir que la copie.

Lo que quiero es realizar esto pero copiando la imagen en un bloque de memoria sin usar bitblt, se entiende? quiero ver como es el tratamiento de una imagen en memoria usando punteros y memoria dinamica.

No tengo ni encuentro ningun ejemplo para esto. Les agradezco de ante mano por su ayuda.

Haaa, me olvidava, uso builder c++

Saludos

coso 03-10-2008 18:38:19

Hola, mirando en las clases TBitmap, TCanvas, TImage etc. no aparece el acceso directo a lo que serian los datos en si. Por otra parte, en teoria seria algo como

Código:


tam = x*y*prof*sizeof(tipo_de_datos_image);
 
malloc(Image2->puntero_a_datos,tam);
memcpy(Image2->puntero_a_datos,Image1->puntero_a_datos,tam);

donde prof seria la profundidad de color (cuantos bytes necesita para representar cada color), x la anchura e y la altura. tipo_de_datos_image en teoria seria unsigned char. Vamos, que seria copiar una serie de datos de memoria a otro. Está todo muy al aire :confused::confused: a ver si investigando un poco encuentro mas informacion. Saludos.

coso 03-10-2008 18:38:56

por otra banda, existe .scanline que quizas te simplifique bastante lo que quieras hacer. Saludos de nuevo.

oab_boa 03-10-2008 19:54:42

saludos
 
Cita:

Empezado por coso (Mensaje 317964)
por otra banda, existe .scanline que quizas te simplifique bastante lo que quieras hacer. Saludos de nuevo.

Gracias COSO, estuve investigando y encontre un codigo que hace un tratamiento de imagenes bmp, el programa corre en modo consola y se lanza con argumentos, hace un tratamiento a una imagen pasada como parametro y genera un segundo archivo con esta imagen ya tratada, lo tomare como base y cuando lo tenga bien masticado, posteo la solucion,

el link: http://mipagina.cantv.net/bernardolg/CPP/BmpFx.html

Saludos..

escafandra 04-10-2008 18:32:18

Windows trata las imágenes como objetos DIB que son la imagen en memoria de los bmp (de distinta profundidad de color). Las API que usan ongetos DIB trabajan con estas imégenes de memoria.

Hace unos años cree un código para lo que creo que necesitas.

Para convertir un objeto TBitmap a este tipo de objeto analiza este código:

Código:

BITMAPFILEHEADER *FileHeader;
BITMAPINFO      *Info;
void            *Bits;
TMemoryStream    *SMBitmap;
 
SMBitmap = new TMemoryStream;
Bitmap->SaveToStream(SMBitmap);
SMBitmap->Position = 0;
 
FileHeader = (LPBITMAPFILEHEADER)SMBitmap->Memory;
Info = (LPBITMAPINFO)((Byte*)SMBitmap->Memory + sizeof(BITMAPFILEHEADER));
int  nColors = Info->bmiHeader.biClrUsed;
int  colorAlloc = nColors * sizeof(RGBQUAD); // size of color tables

// Info es la imagen del DIB  (BITMAPINFO)
// Esta es la imagen en memoria de los pixels:
Bits = (char*)Info + ((int)Info->bmiHeader.biSize + colorAlloc);


Si lo que buscas es el simple traslado de la Imagen, quizás te baste con las funciones TBitmap.SaveToStream y TBitmap.LoadFromStream.


Espero que sea esto lo que buscas.
Saludos.

oab_boa 06-10-2008 16:59:40

gracias
 
Cita:

Empezado por escafandra (Mensaje 318198)
Windows trata las imágenes como objetos DIB que son la imagen en memoria de los bmp (de distinta profundidad de color). Las API que usan ongetos DIB trabajan con estas imégenes de memoria.

Hace unos años cree un código para lo que creo que necesitas.

Para convertir un objeto TBitmap a este tipo de objeto analiza este código:

Código:

BITMAPFILEHEADER *FileHeader;
BITMAPINFO      *Info;
void            *Bits;
TMemoryStream    *SMBitmap;
 
SMBitmap = new TMemoryStream;
Bitmap->SaveToStream(SMBitmap);
SMBitmap->Position = 0;
 
FileHeader = (LPBITMAPFILEHEADER)SMBitmap->Memory;
Info = (LPBITMAPINFO)((Byte*)SMBitmap->Memory + sizeof(BITMAPFILEHEADER));
int  nColors = Info->bmiHeader.biClrUsed;
int  colorAlloc = nColors * sizeof(RGBQUAD); // size of color tables

// Info es la imagen del DIB  (BITMAPINFO)
// Esta es la imagen en memoria de los pixels:
Bits = (char*)Info + ((int)Info->bmiHeader.biSize + colorAlloc);

Si lo que buscas es el simple traslado de la Imagen, quizás te baste con las funciones TBitmap.SaveToStream y TBitmap.LoadFromStream.


Espero que sea esto lo que buscas.
Saludos.


Hola escafandra, estuve viendo tu codigo, anda a la perfeccion, muchas gracias!!!!


La franja horaria es GMT +2. Ahora son las 23:52:07.

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