Newsgroup: it.comp.lang.delphi
Titolo: velocizzare caricamento Immagini

come fare per velocizzare il caricamento di un'immagine  Delphi 10.3.3
 
var  pic: TBitmap32;
   sFile: String;
   jpg : TJpegImage;
 
begin
   try
     sFile := 'D:/__dreams_and_mistakes.JPG';  // pixel 3456x4234 - 96dpi
     jpg := TJpegImage.Create;
     jpg.Loadfromfile(sFile);     //il caricamento su jpeg e' veloce
     Image1.Picture.Assign(jpg);  //assegnare jpeg a TImage e' lento
 
     //usando TImage32 -- graphics32 , cambia molto poco sempre 3-4 sec.
     Image321.Bitmap.LoadFromFile(sFile);
   except
     //
    end;
end;
 
usando TMemoryStream puo' migliorare ?
da un po' non uso Delphi ,  sono a diri poco arrugginito ...
 
sarebbe comodo usare GDI come in C#
- non so come dichiarare i riferimenti in Delphi -
 
[DllImport("gdiplus.dll", ExactSpelling = true, CharSet = CharSet.Unicode)]
 
private static extern int GdipLoadImageFromFile(string filename, out 
IntPtr image);
 
e usare (ImageFast = nome della classe)
TImage imgPhoto = ImageFast.FromFile(NomeFile);
 
grazie

 
 
 
provato con D7 e si carica in 3 secondi un immagine di 3400x4540, quanto 
tempo impieghi?
 
Hai provato con altre immagini?
 
-- 
-------------------------------
per scrivere in privato
togliere "1975nosp"
 
to reply remove "1975nosp"

> 
La particolarita' e' che l'immagine ha 96dpi
(a parita' di risoluzione a 96 impiega piu' tempo)
- scalato immagine tramite Photoshop a 72 dpi per avere confronto
 
//Image1 = TImage
//versione con TWicImage - impiega < 1 sec a 72dpi
//versione con TWicImage - impiega   1 sec a 96dpi
 
procedure TForm1.Button1Click(Sender: TObject);
var  pic: TBitmap32;
   lWICImage: TWICImage;
   sFile: String;
   tempo, tempo1, tempo3: TDateTime;
begin
   //da file
   Timer1.Enabled:= true;
   tempo := now();
 
   sFile := <PATH>;
   lWICImage:= TWICImage.Create;
   lWICImage.LoadFromFile(sFile);
   Image1.Picture.Assign(lWICImage);
 
   Timer1.Enabled := false;
   tempo1 := now();
   lWICImage:= nil;
 
   tempo3 := tempo1 - tempo;
   Label1.caption := formatdatetime('hh:nn:ss', tempo3);
end;
 
 
//versione Stream -- impiega 12 sec (*)
procedure TForm1.Button2Click(Sender: TObject);
var path : string;
     Stream: TStream;
begin
   Timer1.Enabled := true;
   tempo := now();
   path := <Path>;
 
   Stream := TStream.Create();
   Stream := TFileStream.Create(path, fmOpenRead or fmShareDenyNone);
   Stream.Position := 0;
   Image1.Picture.LoadFromStream(Stream);
 
   tempo1 := now();
   Timer1.Enabled := false;
 
   tempo3 := tempo1 - tempo;
 
   (*) con breakPoint leggo meno di 1 sec
 
   Label1.caption := formatdatetime('hh:nn:ss:mm', tempo3);
end;
 

 - non so come dichiarare i riferimenti in Delphi - 
Hai visto "external" nella guida in linea?
 
 
Ma, a parte tutto, è così importante che il caricamento sia piu' veloce?
 
A.
 

> 
si che lo e', se una funzione di  importazione deve leggere immagini da 
una directory; ridotte, visulizzate come Miniautra (nRighe x nColonne) e 
salvate su Blob, mi sembra ovvio che il tempo sia tutto.
 
(lato reale .. 100 immagini a 3 sec => 300 sec , chi aspetta questo 
tempo per solo 100 immagini ???? nessuno).
 
 

 salvate su Blob, mi sembra ovvio che il tempo sia tutto. 
 
Quello che per è ovvio non lo è per coloro che, come me, non conoscono il dominio del problema.
Comunque, io valuterei un approccio multithread.
 
A.