1

ひどい品質ではないサムネイルを作成するのに苦労しています。これまでのところ、私が思いついた最高のコードは次のとおりです。

Bitmap bmp = new Bitmap(width, height);
Graphics graphic = Graphics.FromImage(bmp);
graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphic.SmoothingMode = SmoothingMode.HighQuality;
graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphic.CompositingQuality = CompositingQuality.HighQuality;
graphic.DrawImage(photo, 0, 0, width, height);
return imageToByteArray(bmp);

この宝石を生成するもの:

ここに画像の説明を入力

Paint.NET で同じ画像のサイズを変更すると、次のようになります。

ここに画像の説明を入力

どちらがはるかに優れています。私がオンラインで見つけたものはすべて、上記のコードのバリエーションを示しています。Paint.NET がオープン ソースだったことは知っています。このような優れたサイズ変更機能を作成するために彼らが行っていた魔法と、その機能を C# で再現できるかどうかを知っている人はいますか?

アップデート:

この例の元の画像は jpg でした

4

2 に答える 2

2

GIF

.NET には、GIF などのパレット ベースの形式に問題があることを読んだことを思い出したので、いくつかの記事を掘り下げました。

この記事では、クォンタイズ (最適なパレットを選択) して品質を向上させる方法について説明しています: http://msdn.microsoft.com/en-us/library/aa479306.aspx、およびこの (不適切な形式の) 記事.

簡単に言うと、GDI+ はサイズ変更の実行時に最適でないパレットを選択すると思います。

PNG

PNG はパレットベースであるため、GIF と同じ問題が発生する可能性があります。パレットがはるかに大きくなることが重要かどうかはわかりません。

JPEG に適した例

このコードは JPEG で正常に動作するはずです (ただし、GIF はスムーズにレンダリングされません)。試してみて JPEG をピクセル化する場合は、おそらく別のことが起こっています。

private static byte[] GetScaledImage( byte[] inputBytes, int width, int height ) {
    Image img = null;

    using( MemoryStream ms = new MemoryStream() ) {
        ms.Write( inputBytes, 0, inputBytes.Length );
        img = Image.FromStream( ms );
    }

    using( MemoryStream ms = new MemoryStream() ) {
        using( Image newImg = new Bitmap( width, height ) ) {
            using( Graphics g = Graphics.FromImage( newImg ) ) {
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.DrawImage( img, 0, 0, width, height );

                newImg.Save( ms, img.RawFormat );
                return ms.GetBuffer();
            }
        }
    }
}
于 2012-09-06T04:27:13.830 に答える
0

Bitmap(int,int)事実上、Bitmap(int,int,PixelFormat.Format32bppArgb)問題はソース画像にあると思います。パレットを使用している場合は、ソース画像と同じサイズの画像の別の中間コピーを作成してから、その32bppArgb画像ソースをサイズ変更関数に使用してください。

于 2012-09-06T04:31:53.217 に答える