1

Graphics.DrawImage メソッドを使用して jpeg のサイズを変更しています (以下のコード フラグメントを参照)。これが新しい画像の圧縮に影響しないことを誰かが確認できますか? このスレッドを見たことがありますが、具体的には jpeg の圧縮について話しているのです。

    private byte[] getResizedImage(String url, int newWidth)
    {
        Bitmap bmpOut = null;
        System.IO.MemoryStream outStream = new System.IO.MemoryStream();

        //input image is disposable
        using (Bitmap inputImage = LoadImageFromURL(url))
        {
            ImageFormat format = inputImage.RawFormat;
            decimal ratio;  //ratio old width:new width
            int newHeight = 0;

            //*** If the image is smaller than a thumbnail just return it
            if (inputImage.Width < newWidth)
                return null;

            ratio = (decimal)newWidth / inputImage.Width;
            decimal h = inputImage.Height * ratio;
            newHeight = (int)h;

            bmpOut = new Bitmap(newWidth, newHeight);
            Graphics g = Graphics.FromImage(bmpOut);
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            // try testing with following options:
            //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            //g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
            //g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;

            g.FillRectangle(Brushes.White, 0, 0, newWidth, newHeight);
            g.DrawImage(inputImage, 0, 0, newWidth, newHeight);
            bmpOut.Save(outStream, getImageFormat(url));
        }

        return outStream.ToArray();

    }
4

7 に答える 7

6

JPEG には「圧縮」値が保存されていません。サイズを変更して保存すると、保存関数に使用するように指定した値で圧縮されます。値を渡さないため、ライブラリのデフォルトが何であれ使用されます。

于 2009-02-06T15:29:51.383 に答える
4

画像のサイズを変更すると、圧縮に影響します。「圧縮」とは、ピクセル数にどれだけの詳細を収めることができるかを指す場合です。

JPEG 圧縮アルゴリズムは、グラデーションやフラットな色のパッチを含む、ぼやけた画像や均質な画像を優先します。したがって、画像のサイズと結果のファイル サイズの間に直接的な相関関係はありません。最も重要なのは、画像の細部の量です (すべての画像は 80% の損失係数で JPEG として保存されました)。

  1. 元の SO ロゴ:

    オリジナル http://magnetiq.com/exports/sologo/original.jpg

    File size: 4,483 bytes

  2. 寸法を維持し、重いガウス ブラーを適用します。

    ぼやけた http://magnetiq.com/exports/sologo/blurred.jpg

    File size: 1,578 bytes

  3. 元のサイズを 1/4 に変更します。

    縮小 http://magnetiq.com/exports/sologo/shrunk.jpg

    File size: 2,063 bytes

ぼやけた画像 (2) は、縮小した画像 (3) の 4 倍の大きさですが、(1) と (2) の両方よりもファイル サイズが小さいことに注意してください。ぼかしは素敵なグラデーションを追加し、JPEG 圧縮を快適にします。

小さな画像 (3) は、元の画像 (1) の 1/4 のピクセルしかありませんが、ファイル サイズの 1/4 ではありません。これは、画像を縮小すると細部が細かくなり、JPEG 圧縮がそれを好まないためです。

于 2009-02-06T17:05:22.907 に答える
3

「bmpOut.Save」を呼び出すときは、いくつかの EncoderParameters を渡して、保存する品質レベルをメソッドに伝える必要があります。

http://msdn.microsoft.com/en-us/library/system.drawing.imaging.encoderparameters(VS.80).aspx

于 2009-02-06T15:35:53.230 に答える
0

既に見つけたものと同じですが、これはCircumventing GDI+ default image compressionの VB.NET バージョンです。

個人的には90LのJPEG品質設定をお勧めします。

于 2009-02-06T16:29:12.933 に答える
0

コードの " HighQualityBicubic" は、使用している圧縮です。小さいサイズにサイズ変更すると詳細が削除されますが、それは圧縮とは関係なく、ピクセル数が少なくなるだけです。

于 2009-02-06T15:34:58.583 に答える