Um Datei-Upload-Größen auf einen Webservice zu reduzieren, begrenzen wir die Höhe/Breite von Bilddateien auf einen maximalen Wert.
Für JPG-Dateien funktioniert das gut: eine (nach unten) Bildgrößenänderung führt zu einer reduzierten Dateigröße.Größe des PNG-Speichers reduzieren
Nicht so für PNG-Dateien, aber: in den meisten Fällen unseres Code führt größere Dateigrößen:
procedure TFrmImageCheckAndResize.ResizePNGImage;
var
lSrcPNGImage, lTrgPNGImage: TdxPNGImage;
lSrcBitmap,lDestBitMap: TcxAlphaBitmap;
lNewWidth,lNewHeight: Integer;
lFactor: Real;
begin
lSrcPNGImage := TdxPNGImage.Create;
lSrcPNGImage.LoadFromFile(FFileName);
lSrcBitmap := TcxAlphaBitmap.CreateSize(lSrcPNGImage.Width, lSrcPNGImage.Height, True);
lSrcBitmap.Canvas.Draw(0, 0, lSrcPNGImage);
if lSrcPNGImage.Width > lSrcPNGImage.Height then
if lSrcPNGImage.Width > FEditImageRes.Value then
lFactor := lSrcPNGImage.Width
else
lFactor := 0
else
if lSrcPNGImage.Height > FEditImageRes.Value then
lFactor := lSrcPNGImage.Height
else
lFactor := 0;
if lFactor <> 0 then
begin
lFactor := lFactor/FEditImageRes.Value;
lNewWidth := Trunc(lSrcPNGImage.Width/lFactor);
lNewHeight := Trunc(lSrcPNGImage.Height/lFactor);
lDestBitMap := TcxAlphaBitmap.CreateSize(lNewWidth,lNewHeight, True);
cxSmoothResizeBitmap(lSrcBitMap, lDestBitMap, true);
lTrgPNGImage := TdxPNGImage.CreateFromBitmap(lDestBitmap);
end
else
begin
lDestBitmap := nil; // Silence the compiler
lTrgPNGImage := TdxPNGImage.CreateFromBitmap(lSrcBitmap);
end;
lTrgPNGImage.SaveToFile(StringReplace(FFileName,'.','_' + IntToStr(FEditImageRes.Value) + '.',[]));
lSrcBitmap.Free;
lDestBitmap.Free;
lTrgPNGImage.Free;
lSrcPNGImage.Free;
end;
FFileName
ist das Bild von der Festplatte geladen, FEditImageRes.Value
enthält die größte Dimension, die wir zu reduzieren.
Beachten Sie, dass wir Developer Express-Komponenten verwenden und dass dieser Code Alphakanal (Transparenz) beibehält.
Ich bin nicht an beides gebunden.
Ich habe eine ticket with DevExpress gepostet, aber es ist kein Problem in ihrem Code.
Ich sah, was andere Software tut:
In Paint.Net, wenn ich die oben 890 * 161 Screenshot 512 * 93 reduziere ich gemischte Ergebnisse sehen auf dem Algorithmus in Abhängigkeit verwendet für die Größe ändern:
15.697 Original.png
21.904 Resized_BiCubic.png
19.995 Resized_Bilineair.png
22.905 Resized_Fant.png
6.729 Resized_NearestNeigbour.png
Für dieses Foto 550x386 auf 512 reduziert * 353 die Paint.Net Ergebnisse sind:
375.229 Photo.png
419.122 Photo_Bicubic.png
402.277 Photo_Bilineair.png
407.959 Photo_Fant.png
416.619 Photo_NearestNeighbor.png
So ist es ziemlich unvorhersehbar sieht, was die Ergebnisse sein werden.
Frage:
Gibt es etwas, was ich tun kann (Änderung an meinem Code), um sicherzustellen, dass (am meisten) resized PNG-Dateien tatsächlich eine reduzierte Dateigröße haben?
PNG sieht wie das falsche Format für das Bild aus, sollte JPG –
sein Die Komprimierung ist verlustfrei. Wenn Sie die Größe reduzieren, behält ein feiner Algorithmus mehr Informationen bei - eine große Dateigröße mit einem schärferen Bild. Ein grober Algorithmus behält weniger Informationen bei, ein weicheres - verschwommenes Bild mit geringerer Dateigröße. Sie müssen sich auf einen Algorithmus festlegen, der visuell ungefähr die gleiche Schärfe wie das Originalbild aufweist, das eine kleinere Dateigröße erzeugen sollte, ohne das Bild zu beschädigen. Wenn die Bilder vom gemischten Typ sind (z. B. Grafik gegen Foto), wäre dies unmöglich. –
Wird photo.png in paint.net gespeichert? Wenn nicht, ist dieser Vergleich nicht gültig. –