Newsgroup: it.comp.lang.delphi
Titolo: Dissolvenza fra immagini jpeg

Ciao a tutti,
ho pescato da internet e leggermente modificato il seguente codice per 
realizzare una dissolvenza fra immagini.
Uso Delphi 2005 Win32 sotto XP e con immagini 800x600 funziona sempre 
correttamente finchè lo eseguo all'interno dell'ambiente Delphi.
Viceversa se lancio direttamente l'eseguible ottengo, soprattutto su PC un 
pò datati, dopo un certo numero di frame intermedi la visualizzazione della 
finestra completamente bianca fino al termine della transizione.
Il problema sembra legato in qualche modo al numero di frame intermedi (se 
sono pochi su un PC veloce non capita, se sono tanti es 50 e il PC è lento 
capita sempre) inoltre, in certi casi, il problema si pone solo la prima 
volta che attivo la dissolvenza e se la rilancio senza uscire dal programma 
non ricapita.
Perchè fuori da Delphi da problemi? Cosa cosa c'è di sbagliato?
Esistono metodi più efficienti di ottenere lo stesso risultato sfruttando le 
caratteristiche delle schede video?
Grazie mille
                                         Alessandro
Procedure 
Dissolvi(Immagine1:string;Immagine2:string;Passi:byte;Attesa:integer);
var
    ImmagineJpeg:TJPEGImage;
    img1,img2:TBitmap;
    x,y,height,width:integer;
    NPasso:byte;
    pimg1,pimg2,pres:PByteArray;
begin
   img1 := TBitmap.Create;
   img2 := TBitmap.Create;
   try
      ImmagineJpeg := TJPEGImage.Create;
      ImmagineJpeg.LoadFromFile(Immagine1);
      img1.Width:=ImmagineJpeg.Width;
      img1.Height:=ImmagineJpeg.Height;
      img1.Canvas.Draw(0,0, ImmagineJpeg); // conversione prima immagine in 
bitmap
      ImmagineJpeg.LoadFromFile(Immagine2);
      img2.Width:=ImmagineJpeg.Width;
      img2.Height:=ImmagineJpeg.Height;
      img2.Canvas.Draw(0,0, ImmagineJpeg); // conversione seconda immagine 
in bitmap
      ImmagineJpeg.Free;
      if img1.Height > img2.Height then
         height := img2.Height
      else
         height := img1.Height;
      if img1.Width > img2.Width then
         width := img2.Width
      else
         width := img1.Width;
      img1.PixelFormat := pf24bit;
      img2.PixelFormat := pf24bit;
      Form1.Immagine.Picture.Bitmap.PixelFormat  := pf24bit;
      Form1.Immagine.Picture.Bitmap.Width := width;
      Form1.Immagine.Picture.Bitmap.Height := height;
      for NPasso:=1 to Passi do begin      // ciclo creazione immagini 
intermedie
         for y := 0 to height - 1 do begin
            pimg1 := img1.ScanLine[y];
            pimg2 := img2.ScanLine[y];
            pres  := Form1.Immagine.Picture.Bitmap.ScanLine[y];
            for x := 0 to width - 1 do begin
               pres[x*3]:=pimg1[x*3]*(Passi-NPasso) div 
Passi+pimg2[x*3]*NPasso div Passi;
               pres[x*3+1]:=pimg1[x*3+1]*(Passi-NPasso) div 
Passi+pimg2[x*3+1]*NPasso div Passi;
               pres[x*3+2]:=pimg1[x*3+2]*(Passi-NPasso) div 
Passi+pimg2[x*3+2]*NPasso div Passi;
            end;
         end;
            Form1.Immagine.Refresh;
            sleep(Attesa);
         end;
   finally
      img1.Free;
      img2.Free;
   end;
end;

 realizzare una dissolvenza fra immagini.
posta il codice originale.
magari le tue modifiche hanno introdotto un bug..
A.

 ha scritto nel messaggio 
news:1169032608.2...@q2g2000cwa.googlegroups.com...
