Es ist wahrscheinlich, das dabei bis zu 60 Bilder bereitgestellt werden, deshalb müssen die Bilder in der Größe reduziert werden.
Meine Rechnung dabei 100 bis 150 kb pro Bild * 60 Bilder = ca. 6000 kb bis 9000 kb für die PDF + ein paar Kilobyte für die E-Mail selbst. Bis max. 12 MB kann die E-Mail direkt versendet werden, darüber wird nur noch ein Link für den Download erzeugt.
Wichtig dabei ist: Die Dateigrößen werden in KB bzw MB festgelegt.
Die nachfolgende Prozedur erfüllt zwar den Zweck und macht genau dieses, ist aber auf Grund der vielen Speicherprüfung vom Prozess her sehr langsam, zumal davon auszugehen ist, dass Benutzer Handyfotos mit 6 - 12 MB einreichen.
Zeitkritisch ist das ganze nicht, da wird dem Benutzer auch mal eine Sanduhr präsentiert, aber es müsste zumindest noch eine Benutzerinfo oder eine Progressbar rein.
Gibt es für diese Zielstellung evt. noch einen besseren Ansatz ?
Code: Alles auswählen
procedure Form1.ScaleImage(SourceFile, DestFile: String; AInterpolationClass: TInterpolationClass);
var
DestImg, SourceImg: TFPCustomImage;
xWidht, xHeight : Integer;
xpWidht, xpHeight : Double;
DestCanvas: TFPCustomCanvas;
R: TFPCustomImageReader;
W: TFPCustomImageWriter;
ext: String;
i : Integer;
begin
// Read image
SourceImg := TFPMemoryImage.Create(0, 0);
try
ext := Lowercase(ExtractFileExt(sourceFile));
if (ext = '.jpg') or (ext = '.jpeg') then
R := TFPReaderJPEG.Create
else
if (ext = '.png') then
R := TFPReaderPNG.Create
else begin
ShowMessage(SourceFile + ': Image format not supported');
Halt;
end;
SourceImg.LoadFromFile(SourceFile, R);
finally
R.Free;
end;
// Höhe und Breite des Orginal bestimmen
xWidht := SourceImg.Width;
xHeight := SourceImg.Height;
// Proportional verkleinern: % : (x/100)*ImgSize
// Ausgehend von 100% in 5% Schritten verkleinern bis Dateigröße erreicht ist
Screen.Cursor := crHourGlass;
for i := 95 downto 1 do begin
if i mod 5 = 0 then
begin
xpWidht := Round((i/100)* xWidht);
xpHeight := Round((i/100) * xHeight);
DestImg := TFPMemoryImage.Create(Round(xpWidht), Round(xpHeight)); // (DestWidth, DestHeight);
try
DestCanvas := TFPImageCanvas.Create(DestImg);
try
// Interpolate
DestCanvas.Interpolation := AInterpolationClass.Create;
try
DestCanvas.StretchDraw(0, 0, Round(xpWidht), Round(xpHeight), SourceImg);
finally
DestCanvas.Interpolation.Free;
end;
finally
DestCanvas.Free;
end;
// Save interpolated image
ext := Lowercase(ExtractFileExt(sourceFile));
if (ext = '.jpg') or (ext = '.jpeg') then
W := TFPWriterJPEG.Create
else
if (ext = '.png') then
W := TFPWriterPNG.Create
else begin
ShowMessage(DestFile + ': Destination image format not supported');
Halt;
end;
DestImg.SaveToFile(DestFile, W);
finally
DestImg.Free;
end;
// Dateigröße <= Zielvorgabe
if GetFileSize(PChar(DestFile)) <= AppConfig.MaxImageSize then
Halt;
end;
end;
Screen.Cursor := crDefault;
end;
Code: Alles auswählen
procedure Form1.Button2Click(Sender: TObject);
var
SRC_File, DEST_File : String;
// zu Testzwecken den Wert ändern zu
// MaxImageSize : Integer;
begin
// MaxImageSize := 100 * 1024; // 100 kb
SRC_File := 'IMG_20220808_162415.jpg'; // 7,8 MB
DEST_File := '____Test14.jpg';
// wenn Bild zu groß so lange verändern - bis max Dateigröße erreicht ist
// Rückmeldung wann erfolgreich - fehlt noch
if GetFileSize(PChar(SRC_File)) > AppConfig.MaxImageSize then
begin
ScaleImage(SRC_File, DEST_File, TCubicInterpolation);
end;
end;
Code: Alles auswählen
// Programmkopf
uses ...
// Image Compress
fpimage, fpcanvas, fpimgcanv,
fpreadjpeg, fpwritejpeg,
fpreadpng, fpwritepng,
extinterpolation
;
type
TInterpolationClass = class of TFPCustomInterpolation;