爲了將文件上傳大小減少到web服務,我們將圖像文件的高度/寬度限制爲最大值。
對於JPG文件,此工作正常:向下調整圖像尺寸會導致文件大小減小。減少PNG存儲大小
並非如此PNG文件,但:在大多數情況下,我們的代碼導致較大文件大小:
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
是從磁盤加載圖像,FEditImageRes.Value
包含了我們降低到最大尺寸。
請注意,我們使用Developer Express組件,並且此代碼維護Alpha通道(透明度)。
我沒有依附任一。
我發佈了一個ticket with DevExpress,但這不是他們的代碼中的問題。
我看着其他什麼軟件做:
在Paint.Net,如果我減少以上890 * 161的屏幕截圖512 * 93我看到這取決於使用的算法混合的結果調整大小:
15.697 Original.png
21.904 Resized_BiCubic.png
19.995 Resized_Bilineair.png
22.905 Resized_Fant.png
6.729 Resized_NearestNeigbour.png
對於本550x386照片減少到512 * 353 ,Paint.Net的結果是:
375.229 Photo.png
419.122 Photo_Bicubic.png
402.277 Photo_Bilineair.png
407.959 Photo_Fant.png
416.619 Photo_NearestNeighbor.png
所以它看起來很不可預測結果會是什麼。
問題:
有什麼我可以做的(改變我的代碼),以確保(大多數)調整大小的PNG文件實際上會減少文件大小?
PNG看起來像那個圖像的錯誤格式,應該是JPG –
壓縮是無損的。當你縮小尺寸時,一個好的算法會保留更多的信息 - 具有更清晰圖像的大文件尺寸。粗略的算法保留較少的信息,較軟的模糊圖像和較小的文件大小。您需要解決一個算法,該算法在視覺上看起來與原始圖像具有相同的銳度,這應該會生成較小的文件大小而不會損壞圖像。如果圖像是混合類型(例如圖形與照片),那是不可能的。 –
將photo.png保存在paint.net中?否則,該比較無效。 –