Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   TImage, me da problemas al cargar grandes imagenes. (https://www.clubdelphi.com/foros/showthread.php?t=63601)

MAXIUM 21-02-2009 21:55:06

TImage, me da problemas al cargar grandes imagenes.
 
Ya estoy con el cerebro en las manos, no logro que un TImage haga algo tan sencillo como esto:

Código Delphi [-]
     Image1.Width := 3970;
     Image1.Height:= 4600;
     Image1.Canvas.FloodFill(1, 1, clWhite, fsSurface);

No se como solucionarlo, me da un problema de Espacio de almacenamiento insuficiente...

cHackAll 21-02-2009 22:27:07

3970x4600x[pf32bit]=70Mb.... Talvez si compras más memoria :rolleyes:

Si no es mucha intromisión, qué piensas hacer con eso?

MAXIUM 21-02-2009 23:07:55

Estoy usando 3970x4600x[pf8bit]

El asunto es que con un TPaintBox no me da esos problemas, pero tengo que estar redibujandolo para que no se borre la imagen cargada en el. Por otra parte, cosas como MS Paint, ese que biene en todos los Windows no da dramas.

Solo quiero cargar una imagen grande (un mapa).

MAXIUM 22-02-2009 00:21:16

Otro dato es que he descubierto que el problema ocurre al usar el Canvas, ya que que LoadFromFile funciona bien. AYUDA!!!!

cHackAll 22-02-2009 02:48:03

Cita:

Empezado por MAXIUM (Mensaje 338947)
Estoy usando 3970x4600x[pf8bit]...

Cita:

Empezado por MAXIUM (Mensaje 338952)
...el problema ocurre al usar el Canvas...

Canvas.PixelFormat := pf8bit;

[Error] Unit1.pas(): Undeclared identifier: 'PixelFormat'
[Fatal Error] Project1.dpr(): Could not compile used unit 'Unit1.pas'


:rolleyes:

MAXIUM 22-02-2009 04:44:33

Gracias cHackAll, lo probare. De todos modos ¿conoces algun componente similar que tenga TCanvas.Handle de tipo HDC?

cHackAll 25-02-2009 23:37:51

Cita:

Empezado por MAXIUM (Mensaje 338962)
Gracias cHackAll, lo probare...

No amigo, solo queria mostrarte mi "teoria" :rolleyes:... al manipular el cavas de una imagen aunque esta sea monocroma va a usar 32 bits por pixel.
Cita:

Empezado por MAXIUM (Mensaje 338962)
...¿conoces algun componente similar que tenga TCanvas.Handle de tipo HDC?

Pues hay muchos, aunque el "HDC" es un valor entero, el manejador retornado por wl SO al crear un Canvas, cualquier componente llegará a lo mismo.

MAXIUM 26-02-2009 00:17:28

cHackAll, gracias de todos modos, me he dado por vencido...

Usare el LoadFrom aunque ello implica consumir 72MB de recurso.

Pronto dare unos metodos que permiten cargar una gran imagen en memoria consumiendo solo un máximo de 300kb. Es un método que accidentalmente descubrí jeje!!.

Bueno, probe de todo incluso GDI+, pero se me acaba el tiempo y debo terminar el trabajo.

BlackDaemon 11-03-2009 16:06:31

Hola

la pregunta...

¿Cual es el método mágico?

Ya que yo quiero trabajar con imágenes grandes.

Saludos!

MAXIUM 11-03-2009 16:57:28

El mismo que utilizaste. Ir cargando porciones de la imagen completa y "pegandolas", las otras las vas liberando, de ese modo el consumo de memoria en mi caso no supero los 400kb en una imagen de 5000x5000.

Pero el sistema a veces funcionaba otras no, nunca descubrí el porque, siempre me daba "Espacio insuficiente de almacenamiento para procesar este comando...". Solo me funcionaba en forma segura si no pasaba de los 3000x3000.

BlackDaemon 11-03-2009 17:21:22

Hola

Aver, creo que andas equivocado, por que yo lo que hago es lo siguiente:
primero creo el Timage de X cantidad de pixeles, luego ir uniendo trozo por trozo, he creado imágenes grandes, pero necesito saber como crear de unos 60000 por 60000 px, como ves el tuyo de 3000 no se le acerca, esas de 3000 y más las puedo crear sin problemas, y tampoco puedes decir que vas creando y liberando la memória, por que en ese caso, el resutado sería solamente un trozo, osea el último, ya que lo que hacemos es ir añadiendo un trozo al Timage y este mismo lo guarda en memória, luego otro, etc y al final todo _junto_ se guarda en una sola imágen.

Saludos!

MAXIUM 11-03-2009 17:26:56

Código Delphi [-]
Const
     Mapa: Array[0..5,0..9] of String =
    (('Quilicura_01.bmp', 'Quilicura_02.bmp', 'Quilicura_03.bmp', 'Quilicura_04.bmp', 'Quilicura_05.bmp',
      'Quilicura_06.bmp', 'Quilicura_07.bmp', 'Quilicura_08.bmp', 'Quilicura_09.bmp', 'Quilicura_10.bmp'),
     ('Quilicura_11.bmp', 'Quilicura_12.bmp', 'Quilicura_13.bmp', 'Quilicura_14.bmp', 'Quilicura_15.bmp',
      'Quilicura_16.bmp', 'Quilicura_17.bmp', 'Quilicura_18.bmp', 'Quilicura_19.bmp', 'Quilicura_20.bmp'),
     ('Quilicura_21.bmp', 'Quilicura_22.bmp', 'Quilicura_23.bmp', 'Quilicura_24.bmp', 'Quilicura_25.bmp',
      'Quilicura_26.bmp', 'Quilicura_27.bmp', 'Quilicura_28.bmp', 'Quilicura_29.bmp', 'Quilicura_30.bmp'),
     ('Quilicura_31.bmp', 'Quilicura_32.bmp', 'Quilicura_33.bmp', 'Quilicura_34.bmp', 'Quilicura_35.bmp',
      'Quilicura_36.bmp', 'Quilicura_37.bmp', 'Quilicura_38.bmp', 'Quilicura_39.bmp', 'Quilicura_40.bmp'),
     ('Quilicura_41.bmp', 'Quilicura_42.bmp', 'Quilicura_43.bmp', 'Quilicura_44.bmp', 'Quilicura_45.bmp',
      'Quilicura_46.bmp', 'Quilicura_47.bmp', 'Quilicura_48.bmp', 'Quilicura_49.bmp', 'Quilicura_50.bmp'),
     ('Quilicura_51.bmp', 'Quilicura_52.bmp', 'Quilicura_53.bmp', 'Quilicura_54.bmp', 'Quilicura_55.bmp',
      'Quilicura_56.bmp', 'Quilicura_57.bmp', 'Quilicura_58.bmp', 'Quilicura_59.bmp', 'Quilicura_60.bmp'));
Var
   MapaBMP: TBitmap;
   Horizontal, Vertical: Integer;
begin
     MapaBMP:= TBitmap.Create;

  // Mapea el plano cargando las imágenes.   
     Try
        For Vertical:= 0 To 5 Do
           For Horizontal:= 0 To 9 Do
           Begin
                MapaBMP.LoadFromFile(Directorio + 'plano\'+ Mapa[Vertical, Horizontal]);
                Image1.Canvas.Draw(Horizontal*510, Vertical*500, MapaBMP);
           End;
     Finally
        MapaBMP.Free; // <- Voy liberando memoria :D
     End; 
end;

Cada imagen es de 510x500 pixeles, Las dimensiones del TImage las dejo definidas desde un principio y dentro de un ScrollBox. El consumo máximo de memoria no supera los 500kb para una imagen de 5100x5000 en este caso.

BlackDaemon 11-03-2009 17:42:50

Hola

Mira, yo tengo una imágen creada de 3800 px X 3800px y sin usar lo que tu dices, tarda un poco en unirla, pero con un progress bar y un thread se soluciona, además yo no tengo imágenes definidas, eso lo hace el usuario, osea que no podría hacer lo del array, aunque podría emplear los arrays dinámicos, pero de igual forma tendría problemas con los nombres de las imágenes, etc, y para que hacer esto si como lo hago me funciona a la perfección, pero repetiré otra ves, necesito imágenes GRANDES, de 60000px de ancho y lado, y como te digo, mis 3800 y tus 3000 no me sirven de mucho
De todas formas muchas gracias por los datos, pero ahí en tu código en el Image1 es donde quisiera crearlo de ~60000px
Saludos


La franja horaria es GMT +2. Ahora son las 19:40:02.

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