Discussione:
velocizzare caricamento Immagini
(troppo vecchio per rispondere)
Maurizio
2021-01-23 17:55:25 UTC
Permalink
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
ca75
2021-01-23 21:00:38 UTC
Permalink
Post by Maurizio
come fare per velocizzare il caricamento di un'immagine Delphi 10.3.3
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"
Maurizio
2021-01-24 10:01:50 UTC
Permalink
Post by ca75
come fare per velocizzare il caricamento di un'immagine  Delphi 10.3.3
provato con D7 e si carica in 3 secondi un immagine di 3400x4540, quanto
tempo impieghi?
Hai provato con altre immagini?
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;
Alberto Salvati
2021-01-25 10:56:45 UTC
Permalink
Il tuo codice, volendo essere educati, è lassativo:

var
pic: TBitmap32;
sFile: String;
jpg : TJpegImage;

begin
sFile := 'D:/__dreams_and_mistakes.JPG'; // pixel 3456x4234 - 96dpi
jpg := TJpegImage.Create;
try
try
jpg.Loadfromfile(sFile); //il caricamento su jpeg e' veloce
Image1.Picture.Assign(jpg); //assegnare jpeg a TImage e' lento


Image321.Bitmap.LoadFromFile(sFile);
except
on E:Exception do begin
ShowMessage('exception in method blablabla:' + E.classname + ' ' + E.Message)
end;
end;

finally
FreeAndNil(jpg )
end;
Post by Maurizio
sarebbe comodo usare GDI come in C#
GDI non è c#: è WINDOWS.
C#, tramite il framework .net, mappa la chiamata di cui parli.
Post by Maurizio
- 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.
Maurizio
2021-01-25 14:10:27 UTC
Permalink
.. almeno serve a qualcosa ...
Post by Alberto Salvati
Post by Maurizio
sarebbe comodo usare GDI come in C#
GDI non è c#: è WINDOWS.
C#, tramite il framework .net, mappa la chiamata di cui parli.
ho scritto come in c# non che e' c#
Post by Alberto Salvati
- non so come dichiarare i riferimenti in Delphi -
Hai visto "external" nella guida in linea?
function GdipLoadImageFromFile(string filename):FT_result; stdcall;
external 'gdiplus.dll';
Post by Alberto Salvati
Ma, a parte tutto, è così importante che il caricamento sia piu' veloce?
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).
Alberto Salvati
2021-01-25 14:32:50 UTC
Permalink
Il primo passo per evitare di avere problemi strani consiste nello scrivere codice come si deve.
Ad esempio, nel tuo codice c'è una bestemmia: un blocco except vuoto.
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.
Quello che per è ovvio non lo è per coloro che, come me, non conoscono il dominio del problema.
Comunque, io valuterei un approccio multithread.

A.

Continua a leggere su narkive:
Loading...