Kurze Antwort: Alles drei!
1. Threadsicherheit: TWICImage liegt in der
Vcl.Graphics
Unit und damit im
Vcl Namespace -> per se nicht threadsicher.
Benutzt intern TBitmap und TCanvas. Sie Implementierung: Für AssignTo wenn
Dest is TBitmap
, zur Übergabe an die Zwischenablage und zum Zeichnen.
Des Weiteren ist die
class var FImagingFactory: IWICImagingFactory;
nicht darauf ausgelegt bzw. der Getter dazu und ich würde mich nicht darauf verlassen.
2.Overhead. Das was du brauchst ist eine Threadeigene-Instanz der Factory (im Execute erzeugen!) und dann in einer Schleife deine Dateiliste abarbeiten und verkleinern.
Das SetSize führt bspw. bei TWICImage zu einer
Exception, dass das nicht implementiert wurde (
First chance exception at $758B3522. Exception class EInvalidGraphicOperation with message 'Cannot change the size of a WIC Image'. Process Project1.exe (12164))
Also sowas geht halt nicht:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
MyProc: TProc;
begin
MyProc := procedure
var
WicImage: TWICImage;
begin
CoInitializeEx(nil, COINIT_MULTITHREADED);
WicImage := TWICImage.Create;
WicImage.LoadFromFile('C:\Users\Du\Desktop\DeinBild.png');
WicImage.SetSize(WicImage.Width div 2, WicImage.Height div 2);
WicImage.SaveToFile('C:\Users\Du\Desktop\DeinBild2.png');
WicImage.Free;
CoUninitialize;
end;
TThread.CreateAnonymousThread(MyProc).Start;
end;
Dann kannst du dir den Code dafür selber schnell zusammenschreiben:
https://docs.microsoft.com/en-us/win...es-howto-scale
3. Eben, wenn du irgendwelche Sonderlocken hast, dann musst du die eh per Zugriff auf TWicImage.Handle und WicImage.ImagingFactory herzaubern. Dann kann man das auch gleich direkt machen.