Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Imagenes en memoria (https://www.clubdelphi.com/foros/showthread.php?t=43796)

dfarias 20-05-2007 23:22:49

Imagenes en memoria
 
Tengo un grupo de 12 paneles en los cuales quiero mostrar 12 imagenes por vez. Avanzando o retrocediendo quiero cambiar las imagens de estos. Como puedo primero leer las 200 imagens y guardales en memoria y luego ir refrescando el contenido visual.

Quiero evitar leer desde el disco cada vez.

Código Delphi [-]
For i:=1 to 12 do begin 

Img := TImage(Self.FindComponent('Img' + IntToStr(i))); 
img.Picture.LoadFromFile( '\GRAPHICS\foto1.jpg'); 
img.OnClick := Self.BotonClick; 
img.Tag := i-1 + inicio;

Muchas gracias.

droguerman 21-05-2007 00:36:53

una forma sencilla es usando Streams (por ejemplo TMemoryStream) entonces en vez de usar LoadFromFile puedes usar LoadFromStream

Delphius 21-05-2007 00:45:16

Leer las 200 imagenes para luego mostrarlas de a grupos es muy ineficiente.
Lo ideal es leer de a grupos.

Yo lo veo así: necesitas dos botones (al menos): Uno para adelantar y otro para retroceder el grupo.

Si tus imágenes están guardadas en un mismo directorio y siguen una misma nomeclatura (foto1, foto2, ... foto200), puedes valerte de una mejor técnica: Almacenar dicho valor en un resourcestring:

Código Delphi [-]
resourcestring
  DIR_IMG = '\GRAPHICS\foto%d.jpg';

El %d se sustituirá por el valor 1, 2,... 200. De modo que con pasar el número correspondiente se forma el directorio completo. De este modo abrir una imagen resulta más sencillo abrir una imagen:

Código Delphi [-]
Img.Picture.LoadFromFile(Format(DIR_IMG,[i]));

Ahora, como dije... lo ideal es abrir por grupos. Con un simple "truco" podemos hacer corresponder a cada grupo de imagenes con un numero. Algo como esto:

0: Imagenes 1 al 12
1: Imágenes 13 al 24

Entonces, ahora sólo se requiere de un procedimiento que lea este valor representativo y que abra dichas imagenes del grupo. A este procedimiento lo llamas desde los botones adelante y atras. Cada vez que presiones el botón "adelante" o siguiente, incrementas el valor del grupo:

Código Delphi [-]
inc(Grupo);
MostrarImagenes(Grupo);

Y la inversa, para el otro botón:
Código Delphi [-]
dec(Grupo);
MostrarImagenes(Grupo);

El procedimiento común (MostrarImagenes lo que hará es mostrar las imágenes...

Código Delphi [-]
for j := 1 to 12 do
  begin
    // localizar el TImage correspondiente:
    Img := TImage(FindComponent('Img' + IntToStr(j)));
    // Abrir la imagen si existe
   if FileExists(Format(DIR_IMG,[Grupo + j]))
      then Img.Picture.LoadFromFile(Format(DIR_IMG,[Grupo + j]));
  end;

Espero que se entienda. No probé el código, lo puse de memoria... pero creo que puede servirte.

Saludos,

Neftali [Germán.Estévez] 21-05-2007 11:04:33

Cita:

Empezado por dfarias
Como puedo primero leer las 200 imagens y guardales en memoria y luego ir refrescando el contenido visual.

También puedes utilizar un TStringList (FileName + TJPegImage), Leerlas todas al principio y luego ir accediendo a la lista; De todas formas el sistema no me acaba de convencer.
Habría que tener en cuenta de qué tipo/tamaño estamos hablando.
¿Puedes especificar un poco más? ¿es obligatorio cargarlas TODAS en memoria?

Piensa que el consumo puede ser muy grande...


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

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