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 14-10-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Unhappy Reducir una TImageList por encima

Hola,
Tengo una imágen de 128x640 pixels (donde se encuentra dibujado una Letra cada 64 pixels en 2 filas [10 letras encima y 10 letras abajo] c/64 pixels) que lo cargo con una TImageList (cual si fuera una matriz de 10x10), el código de abajo dibujándolo en un TPaintBox :
ImageList1.Draw(PaintBox1.Canvas,0,0,0)
me muestra el elemento [0,0] (primero de la fila 1); lo que intento es mostrar en este PaintBox el elemento [1,1] es decir por ejemplo, el SEGUNDO elemento de la Segunda Fila de mi imagen. No sé como realizarlo ya que el ImageList no tiene la propiedad TOP, entonces no avanzo.... ¿Existe alguna forma de reducir por código el tamaño de una TImageList o en su defecto del TPaintBox por encima para que me muestre los elementos de la parte inferior de mi Imagen?

Código Delphi [-]
var
  Bitmap: TBitmap;
begin
  Bitmap:= TBitmap.Create;
  try   
    BitMap.LoadFromFile(getcurrentdir+'/Doble.bmp');
    ImageList1.Width:= Bitmap.Width div 10;
    ImageList1.Height:= Bitmap.Height div 2;  //Le indico mostrar la primera fila
    ImageList1.Masked:= FALSE;
    ImageList1.Add(Bitmap,nil);
  finally
    Bitmap.Free;
  end;
end;
Responder Con Cita
  #2  
Antiguo 21-10-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Después de darle tanta vuelta al asunto he alcanzado responder a mi pregunta en un 90% creando un BitMap temporal, según el código de abajo, Cuando corro la aplicación y hago click en el primer botón funciona (me muestra un elemento de la primera fila), pero el segundo botón no me muestra nada!

De nuevo vuelvo a correr la aplicación y hago click pero esta vez en el segundo botón funciona (me muestra sí un elemento de la segunda fila) pero ahora el primer botón no me muestra nada!

¿A que se debe todo esto?

Código Delphi [-]
 
implementation
var
  Bitmap, tempBmp: TBitmap;
  DestRect, SrcRect: TRect;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin  //tempBmp contiene la primera fila del Bitmap
   tempBmp.Width := BitMap.Width;
   tempBmp.Height := Bitmap.Height div 2;
   DestRect := RECT(0,0,tempBmp.Width-1, tempBmp.Height-1);
   SrcRect:=DestRect;
   tempBmp.Canvas.CopyRect(DestRect, BitMap.Canvas, SrcRect);
   ImageList1.Width:= Bitmap.Width div 10;
   ImageList1.Height:= tempBmp.Height;
   ImageList1.AddMasked(tempBmp, tempBmp.Canvas.Pixels[0,0]);
   ImageList1.Draw(PaintBox1.Canvas,0,0,1);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin //tempBmp contiene la segunda fila del Bitmap
   tempBmp.Width := BitMap.Width;
   tempBmp.Height := Bitmap.Height div 2;
   DestRect := RECT(0,0,tempBmp.Width-1, tempBmp.Height-1);
   SrcRect:=DestRect;
   SrcRect.Top := tempBmp.Height;
   SrcRect.Bottom := Bitmap.Height-1;
   tempBmp.Canvas.CopyRect(DestRect, BitMap.Canvas, SrcRect);
   ImageList1.Width:= Bitmap.Width div 10;
   ImageList1.Height:= tempBmp.Height;
   ImageList1.AddMasked(tempBmp, tempBmp.Canvas.Pixels[0,0]);
   ImageList1.Draw(PaintBox1.Canvas,0,0,2);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  Bitmap:= TBitmap.Create;
  tempBmp:= TBitmap.Create;
  BitMap.LoadFromFile(getcurrentdir+'/Doble.BMP');
  ImageList1.BkColor:=clNone;
  ImageList1.BlendColor:= clNone;
  ImageList1.DrawingStyle:= dsTransparent;
  ImageList1.Masked:= True;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Bitmap.Free;
  tempBmp.Free;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
  PaintBox1.Canvas.Fillrect(PaintBox1.Canvas.ClipRect); //Borra el Canvas
end;
end.
Luego para corregir este problema, he creado un tercer botón para el borrado del Canvas. En el código de arriba al hacer click en el primer botón dibuja bien, luego click en el tercer botón y borra el Canvas; pero cuando click en el segundo botón me vuelve a mostrar el mismo elemento de la primera fila, y no el elemento de la segunda fila.

¿Cómo corregir este problema? Por favor.
Responder Con Cita
  #3  
Antiguo 21-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Antes de usar AddMasked usa Clear para borrar el contenido del TImageList, de lo contrario las imágenes que añades lo harán a continuación de las que ya están. Es decir algo así:

Código Delphi [-]
  ImageList1.Clear;
  ImageList1.AddMasked(tempBmp, tempBmp.Canvas.Pixels[0,0]);
Responder Con Cita
  #4  
Antiguo 22-10-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Smile

Gracias Seoane, así funciona,
Ahora veré el modo de llevarlo a un TTimer para simular una blinkado, pues por un momento debe mostrar la parte de arriba de mi imagen, luego la de abajo el mismo elemento (parte gráfica) pero con distinto color (así los tengo)
Una consulta: ¿el orden de mi código está bien? por ejemplo en:

Código Delphi [-]
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Bitmap.Free; tempBmp.Free; end;


Y otras líneas ¿están bien ordenados, o estoy muy chapulín?
Responder Con Cita
  #5  
Antiguo 22-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por Deiv
Código Delphi [-]
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin 
  Bitmap.Free; 
  tempBmp.Free; 
end;
No veo ningún problema en ese código. Aunque yo no cargaría las imágenes cada vez que quieras dibujar una de las imágenes, lo cargaría todo al principio. Me explico:
Código Delphi [-]
// Aqui dibujamos las imagenes en 2 filas y 9 columnas
procedure TForm1.Button1Click(Sender: TObject);
var
  i,j: integer;
begin
  for i:= 0 to 9 do
    for j:= 0 to 1 do
      Imagelist1.Draw(PaintBox1.Canvas,i*50,j*50,i+(j*10));
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Bitmap, Recorte: TBitmap;
begin
  Bitmap:= TBitmap.Create;
  Recorte:= TBitmap.Create;
  try
    Bitmap.LoadFromFile('d:\dibujo.bmp');
    ImageList1.Clear;
    ImageList1.Width:= Bitmap.Width div 10;
    ImageList1.Height:= Bitmap.Height div 2;
    Recorte.Width:= Bitmap.Width;
    Recorte.Height:= Bitmap.Height div 2;
    Recorte.Canvas.CopyRect(Recorte.Canvas.ClipRect,
      Bitmap.Canvas,Rect(0,0,Bitmap.Width,Bitmap.Height div 2));
    Imagelist1.AddMasked(Recorte, Recorte.Canvas.Pixels[0,0]);
    Recorte.Canvas.CopyRect(Recorte.Canvas.ClipRect,
      Bitmap.Canvas,Rect(0,Bitmap.Height div 2,Bitmap.Width,Bitmap.Height));
    Imagelist1.AddMasked(Recorte, Recorte.Canvas.Pixels[0,0]);
  finally
    Bitmap.Free;
    Recorte.Free;
  end;
end;

Si te fijas al cargar las imágenes en el TImagelist, primero añadimos una fila y la otra a continuación. A la hora de dibujar solo tenemos que utilizar como índice el numero de columna + el numero de fila * 10, por ejemplo el elemento [5,1] tendría como índice 5+(1*10)=15.
Responder Con Cita
  #6  
Antiguo 27-10-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Unhappy

Acabo de observar algo interesante, que si cargamos un BitMap de resolución 256 colores o 24 Bits con Bitmap.LoadFromFile('Archivo.BMP'); carga muy bien, pero este mismo archivo lo he modificado y regrabado en Photoshop con una resolución de 32 bits, y al correr el programa me lanza error en la línea de: Bitmap.LoadFromFile('Archivo.BMP') devolviendome un error:

"Project Transparente.exe raised exception class EReadError with message 'Stream read error'. Process stopped. Used Step or Run to continue ."

¿Debo limitarme a resoluciones menores que 32 bits?
Responder Con Cita
  #7  
Antiguo 06-11-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Seoane,
En varios de mis post me estuve haciendo mucho lío con el TPaintBox (y la neta verdad ya totalmente me confundí, no sé ¿cuando darle una utilidad efectiva a un TPaintBox y cuando a una TIMage en Delphi?) por ello quise cambiar todo el código que me orientaste aquí a una TImage, y pensé que solo era cambiar (digamos en un botón) con ImageList1.Draw(Image1.Canvas,0,0,15) para mostrar ese pedazo [15]

Si bien el código no tiene error, me nacieron las siguientes dudas:

a) ¿Como transparentar en el TImage mi BitMap de la TImageList?, pues intenté colocando con las líneas:
Código Delphi [-]
ImageList1.BkColor:=clNone;
ImageList1.BlendColor:= clNone;
ImageList1.DrawingStyle:= dsTransparent;
ImageList1.Masked:= True;
y NO TUVE ÉXITO

Lo propio con:
Código Delphi [-]
Image1.Transparent:=true;
BitMap.TransparentColor:=BitMap.Canvas.Pixels[0,0]; //Tiene fondo blanco
BitMap.Transparent:= True;
BitMap.TransparentMode:= tmFixed;
TAMPOCO

b) ¿Qué diferencia hay si coloco BitMap.TransparentColor:=BitMap.Canvas.Pixels[1,1];?
Así parece que no transparenta cuando intenté en otra Aplicación de prueba cargando solo una imagen y transparentando como mencioné arriba y nada, pero con [0,0] si funcionaba.

Bueno en fin: entonces a la hora de dibujar ¿Cómo muestro digamos el índice 15 TRANSPARENTADO del TImageList en una TImage?
Mis agradecimientos anticipados por vuestros consejos.
Responder Con Cita
  #8  
Antiguo 10-11-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Thumbs up Por fin

Pues lo he resuelto de esta manera:
Código Delphi [-]
    Image1.Transparent:= True;
    Image1.Picture.Bitmap.TransparentMode:= tmFixed;
   
    Image1.Picture.Bitmap.PixelFormat:= pf32bit;  
    Image1.Picture.Bitmap.Transparent := True;
    Image1.Picture.Bitmap.TransparentColor:= clWhite;
    Form1.DoubleBuffered:= True
Y lo dibujo en:
Código Delphi [-]
    Image1.picture.bitmap.PixelFormat:= pf32bit;
    Image1.picture.bitmap.canvas;
    ImageList1.GetBitmap(0,Image1.Picture.Bitmap);
Para mis conocimientos me costó mucho e inclusive aún dudo si más adelante lo implemento me trabaje bien.

Última edición por Deiv fecha: 10-11-2006 a las 22:06:44.
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
MDIChild encima vtdeleon OOP 2 20-02-2005 12:49:24
TImageList...como se usa? alt126 C++ Builder 2 09-02-2005 10:30:59
TImageList scooterjgm OOP 1 15-10-2004 11:43:55
Añadir imagenes en un TimageList JROMAN Gráficos 1 08-10-2004 10:21:45
TSpeedbutton Glyph desde un TImageList dmassive Varios 3 11-03-2004 16:06:02


La franja horaria es GMT +2. Ahora son las 15:18:46.


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