Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ¿mover imagenes? (https://www.clubdelphi.com/foros/showthread.php?t=68290)

JXJ 06-06-2010 02:50:32

¿mover imagenes?
 
¿como se pude mover imagenes de arriba abajo derecha izquierda?

quiero hacer una aplicacion done pueda poner imagenes
ya sean png, jpg, gif. si son png con transparencias

en un form o dentro de un panel que ahi se muevan y no se vean
rastros de su movimiento

algo como esta web

http://joomla15.joomvision.com/jv_thrina/

Ñuño Martínez 09-06-2010 10:36:50

¿Has probado a activar el doble buffer?

FENIXadr 17-06-2010 18:06:25

Mezclar imagenes
 
Hola JXJ.... existe una rutina muy interesante de un tal Yurii Zhukow que te permite mezclar 2 puntos en RGB mediante un valor de Alpha a una velocidad más que aceptable...
Acá te dejo la rutina con una pequeña modificación porque restaba 1 a cada color cada vez que hacías una mezcla.. mi aporte es nada comparado con lo brillante de la rutina del señor Zhukow

function MixBytes(FG, BG, TRANS: byte): byte;
asm
push bx // push some regs
push cx
push dx
mov DH,TRANS // remembering Transparency value (or Opacity - as you like)
mov BL,FG // filling registers with our values
mov AL,DH // BL = ForeGround (FG)
mov CL,BG // CL = BackGround (BG)
xor AH,AH // Clear High-order parts of regs
xor BH,BH
xor CH,CH
mul BL // AX=AL*BL
mov BX,AX // BX=AX
xor AH,AH
mov AL,DH
xor AL,$FF // AX=(255-TRANS)
mul CL // AX=AL*CL
add AX,BX // AX=AX+BX
and AL, 1 // ----> Agregado por FENIXadr
add AH, AL // ----> Agregado por FENIXadr
shr AX,8 // Fine! Here we have mixed value in AL
pop dx // Hm... No rubbish after us, ok?
pop cx
pop bx // Bye, dear Assembler - we go home to Delphi!
end;


una vez que tengas esta rutina, podrás usarla de la siguiente manera:



type

TRGBTripleArray = array[word] of TRGBTriple; // "TRGBTriple" está en la Unit "Windows"
PRGBTripleArray = ^TRGBTripleArray;
........
.........
.......
Procedure TForm1.Button1Click(Sender: TObject);
var x, y : Integer;
ScanFrom, ScanTo : PRGBTripleArray;
Alpha : Byte;
begin
Img1.PixelFormat := pf24Bit; // MUY IMPORTANTE
Img2.PixelFormat := pf24Bit; // MUY IMPORTANTE
// Img1 e Img2 son de tipo TBitMap

Alpha := 128;

for y := 0 to Img1.Height - 1 do
begin
ScanFrom := Img1.ScanLine[y];
ScanTo := Img2.ScanLine[y];
for x := 0 to Img1.Width - 1 do
begin
ScanTo[x].rgbtBlue := MixBytes (ScanTo[x].rgbtBlue, ScanFrom[x].rgbtBlue, Alpha);
ScanTo[x].rgbtGreen := MixBytes (ScanTo[x].rgbtGreen, ScanFrom[x].rgbtGreen, Alpha);
ScanTo[x].rgbtRed := MixBytes (ScanTo[x].rgbtRed, ScanFrom[x].rgbtRed, Alpha);
end;
end;
end;


De esta manera ya puedes mezclar dos imágenes con solo modificar Alpha de 0 a 255, que las imágenes suban, bajen, se dezplacen hacia un lado u otro dependerá de tu código.
Solo dos cosas hay que tenes en cuenta :
Primero:
Como puse arriba muy importante la propiedad PixelFormat debe ser pf24Bit sino funcionan muy mal los ScanLine`s

Y Segundo :
Que los ScanLine's no salgan fuera de la imagen porque se genera un error..

Espero que esto te ayude, cualquier cosa por aca andamos..

rgstuamigo 17-06-2010 20:42:22

Si de lo que :rolleyes: se trata es de mover con el mouse, imágenes contenidas en un TImage pues puedes utilizar el evento OnMouseMove del TImage y poner el siguiente código:
Código Delphi [-]
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssLeft in Shift then
   begin
    Image1.left := Image1.left+x;
    Image1.Top := Image1.Top+y;
   end;
end;
.
En todo caso si el Componente TImage tuviera la propiedad "Handle" pues sería mas fácil aún ;), pero como no lo tiene ya que es un derivado o descendiente de la clase "TGraphicControl", pues con el anterior código se logra el objetivo.;). En cambio todos aquellos componentes que tienen una propiedad "Handle" pues para poder moverlo con el mouse en tiempo de ejecucion se puede utilizar el mismo evento OnMouseMove del componente en cuestión y poner un código similar al siguiente:
Por ejemplo vamos a mover un Boton en tiempo de ejecucion:
Utilizando su respectivo evento OnMouseMove tenemos:
Código Delphi [-]
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  ReleaseCapture;
  SendMessage(Button1.Handle, WM_SYSCOMMAND, $F012, 0);
end;
.
Eso es todo;).
POSDATA: Ustedes pueden notar la diferencia visual entre ambos ejemplos al mover con el raton.
El primer ejemplo se puede aplicar a cualquier componente visual, pero el segundo sólo a componentes que tienen Handle.;)
Saludos...:)

FENIXadr 21-06-2010 17:32:24

Mover Imagenes
 
1 Archivos Adjunto(s)
Hola JXJ... No se si te sirvió la rutina que puse los otros días.. de todos modos me he tomado un tiempito para hacerte un ejemplo que simula el efecto de la página que mensionaste. El corazón de este ejemplo es la rutina de nuestro amigo Zhukow.
Aqui te dejo los adjuntos...
Saludos.

PD: por cuestion de tamaño solo pude subir los fuentes... las imagenes podes bajarlas directamente de la paguina que mencionaste al principio haciendo click derecho cuando el efecto se termina, para poder bajar las dos imagenes.
El código que te doy las llama "imagen1.jpg" e "imagen2.jpg" respectivamente y deben estar an la carpeta donde estan los fuentes.
Por cualquier duda aqui estamos...


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

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