2016-05-03 48 views
0

ウェブサービスへのファイルアップロードサイズを縮小するために、イメージファイルの高さ/幅を最大値に制限しています。
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コンポーネントを使用しており、このコードはアルファチャンネル(透過性)を維持しています。
私はどちらにも付いていません。

ticket with DevExpressを投稿しましたが、コードに問題はありません。 Paint.Netで

enter image description here

を、I 512 * 93に上記890 * 161のスクリーンショットを減らすかどうかのために使用されるアルゴリズムに応じて、混合の結果を参照してください。私はない他のどのソフトウェアを見

サイズ変更:512 * 353に縮小この550x386の写真を

15.697 Original.png 
21.904 Resized_BiCubic.png 
19.995 Resized_Bilineair.png 
22.905 Resized_Fant.png 
6.729 Resized_NearestNeigbour.png 

enter image description here

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ファイルのファイルサイズが実際に縮小されるようにするには、私のできることはありますか?

+2

PNGはそのイメージの形式が正しくないようです。JPG –

+0

圧縮は可逆です。サイズを小さくすると、細かいアルゴリズムでより多くの情報が保持されます。ファイルサイズが大きいほどシャープなイメージです。粗いアルゴリズムでは情報が少なく、ファイルサイズが小さくてもぼんやりした画像になります。画像を損なうことなく、より小さなファイルサイズを生成するはずの原画像と同じ鮮明さのように視覚的に見えるアルゴリズムを解決する必要があります。イメージが混在している場合(例えば、グラフィックと写真)は不可能です。 –

+0

photo.pngはpaint.netに保存されていますか?一致しない場合、その比較は無効です。 –

答えて

3

いくつかのルールがどのようにまずvcl.imaging.PngImage

からTPngImageで可能な最小の画像サイズを取得するには、それは、あなたが(、9が最高の圧縮である0は、すべてのAR圧縮なし整数値0..9を、CompressionLevelプロパティを設定することができました最も遅いもの)。デフォルトでは7が設定されています。注:PNGは常にロスレスです。この設定はイメージの保存にかかる時間にのみ影響します。

第2に、プロパティがありますが、デフォルトではその値は[pfSub]ですが、最適な圧縮を実現するには[pfNone, pfSub, pfUp, pfAverage, pfPaeth]に設定する必要があります。これらは、より良い圧縮を得るために近傍間の相関を使用するために、画像の各行に適用される予測フィルタである。すべてのフィルタが設定されると、それぞれが試行され、最良のものが使用されます。

InterlaceMethodプロパティがimNoneに設定されていることを確認してください。元の画像がインターレースされている可能性があります。その場合、ファイルサイズはインターレースされていない画像と比較して5..20%増加します。

画像のサイズを小さくする可能性がもう1つあります。これは、MaxIDATSizeプロパティを画像サイズよりも少し大きくすることです。ポイントは、PNGピクセルデータが1つ以上のIDATチャンクに格納され、それぞれが4バイトのサイズを持ち、次に4バイトの名前( 'IDAT')、次にデータ、次に4バイトのCRCを持ちます。デフォルトでは、各チャンクのサイズは65535バイトです。したがって、大きなイメージではたくさんのイメージがあり、1つの廃棄物あたり12バイトです。しかし、ここでの増加は0.2%という非常に小さくない。

実際、このような設定では、PNGImageはかなり小さいファイルを作成します.Paint.NETよりも通常は10..20%小さくなりますが、特殊なプログラムではPNGをさらに良く圧縮できます。

サイズ変更についてスクリーンショットのサイズを変更しようとすると、ファイルサイズが大きくなることがよくあります。オリジナルのスクリーンショットは色がほとんどなく、あなたのケースでは431です。グラデーションのためです。非常によく保存されている同じ色の広い領域があります。サイズを変更すると、ある色から別の色への鋭い移行がぼやけてしまい、より多くの「混合」色が作成されます。圧縮するのが本当に難しくなります。ご覧のように、最近隣は、元のイメージにはまだない新しい色を作成していないため、ファイルサイズが最も小さくなります。

あなたの2番目の例である550x386写真は、サイズ変更後のファイルサイズがより小さくなければならず、実際には512x353の写真を303kBに圧縮して圧縮しました。 Paint.netは予測フィルタをまったく使用しないため、写真やその他の真のカラー画像がひどく圧縮されてしまいます。

1

最適な方法は、専用ツールを使用してpngサイズを小さくすることです。

は非常にうまく機能いくつかのツールがありますが、PNGサイズは

を最適化することができる方法についてのいくつかの技術的な詳細について this pageを見て、私はまた、 this comparison of png optimization tools参照 http://optipng.sourceforge.net

を使用しました。