0

重複の可能性:
品質を損なうことなく画像のサイズを変更する

ユーザーがFileUploadから画像をアップロードし、サーバーに保存してサイズを縮小した後、アプリケーションで常に使用するコードは適切です。しかし、私がフォトショップで(手動で)同じことを行い、Facebookにファイルをアップロードすると、品質が向上し、サイズの縮小は非常に公平になります。

サーバーにアップロードした画像の品質をどのように改善できるかわかりません。別のアプローチを使用している人はいますか?

以下のコードを参照してください。

        private static byte[] ReturnReducedImage(byte[] original, int width, int height)
    {
        Image img = RezizeImage(Image.FromStream(BytearrayToStream(original)), width, height);
        MemoryStream ms = new MemoryStream();
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        return ms.ToArray();
    }


    private static Image RezizeImage(Image img, int maxWidth, int maxHeight)
    {
        if (img.Height < maxHeight && img.Width < maxWidth) return img;
        Bitmap cpy = null;
        using (img)
        {
            Double xRatio = (double)img.Width / maxWidth;
            Double yRatio = (double)img.Height / maxHeight;
            Double ratio = Math.Max(xRatio, yRatio);
            int nnx = (int)Math.Floor(img.Width / ratio);
            int nny = (int)Math.Floor(img.Height / ratio);
            cpy = new Bitmap(nnx, nny);
            using (Graphics gr = Graphics.FromImage(cpy))
            {
                gr.Clear(Color.Transparent);
                gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                gr.DrawImage(img, new Rectangle(0, 0, nnx, nny), new Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel);
            }
        }
        return cpy;
    }
4

1 に答える 1

2

私はこれが質問に答えると信じています:https ://stackoverflow.com/a/87786/910348 。

これを置き換える必要があります:

using (Graphics gr = Graphics.FromImage(cpy))
{
    gr.Clear(Color.Transparent);
    gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
    gr.DrawImage(img, new Rectangle(0, 0, nnx, nny), new Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel);
}

このようなもので:

using (Graphics gr = Graphics.FromImage(cpy))
{
    gr.Clear(Color.Transparent);
    gr.SmoothingMode = SmoothingMode.AntiAlias;
    gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
    gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
    gr.DrawImage(img, new Rectangle(0, 0, nnx, nny));
}

乾杯。

于 2012-05-13T23:17:34.120 に答える