2

Format24bppRgb としてメモリに作成したイメージがあります。

これを PNG として保存すると、24kb になります。

Photoshop で同じ画像を 24 ビット PNG として保存すると、ほぼ同じサイズになりますが、32 色のみの 8 ビット PNG として保存すると、5kb になります。

C# / GDI+ / System.Drawing を使用して PNG ファイルのインデックス付きバージョンを作成するにはどうすればよいですか?

グレースケール画像だけに適用されない、または外部ライブラリを必要としない、この質問に対する答えを見つけるのに苦労しています。そのままGDI +内では不可能ですか?

4

3 に答える 3

2

C# ラッパーを使用してFreeImageAPI DLLを使用することになりました。サードパーティのライブラリは避けようとしていますが、他に選択肢はないと思います。それはかなり標準的でよく使われているライブラリのようです。

私の場合、動的に作成されたSystem.Drawing.Imageオブジェクトがあります'image'。これを HttpContext 出力ストリームに圧縮画像として保存したいと考えています。必要なメソッドImageはありませんが、あることに注意してください。GetHbitmap()Bitmap

// convert image to a 'FreeImageAPI' image
var fiBitmap = FreeImageAPI.FreeImageBitmap.FromHbitmap((image as Bitmap).GetHbitmap());
fiBitmap.ConvertColorDepth(FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_08_BPP);

// see http://stackoverflow.com/questions/582766
MemoryStream ms = new MemoryStream();
fiBitmap.Save(ms, FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PNG, FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.PNG_Z_BEST_COMPRESSION);
context.HttpContext.Response.OutputStream.Write(ms.ToArray(), 0, (int)ms.Length);

私の 24kb のビットマップは現在 9kb です :-)

ヒント:ビンを実行するときは、'FreeImageNET' と 'FreeImage' dll の両方をビンで使用できるようにしてください。現時点では、C# サンプル プロジェクトには、zip ファイルに存在しないように見える「Library.DLL」への参照が含まれています。使用FreeImageNET.dllしてもFreeImage.dll機能します。FreeImageNet!= FreeImage!を認識しないと、迷惑なファイルが見つからないというエラーが表示されます。

于 2009-04-08T23:46:26.470 に答える
1

これはnQuantで行うことができます(nuget でインストールするか、以下の参照を参照してください)。次の例は、ディスク上のイメージを変換するもので、ニーズに合わせて簡単に変更できます。

    public static bool TryNQuantify(string inputFilename, string outputFilename)
    {
        var quantizer = new nQuant.WuQuantizer();
        var bitmap = new Bitmap(inputFilename);
        if (bitmap.PixelFormat != System.Drawing.Imaging.PixelFormat.Format32bppArgb)
        {
            ConvertTo32bppAndDisposeOriginal(ref bitmap);
        }

        try
        {
            using (var quantized = quantizer.QuantizeImage(bitmap))
            {
                quantized.Save(outputFilename, System.Drawing.Imaging.ImageFormat.Png);
            }
        }
        catch
        {
            return false;
        }
        finally
        {
            bitmap.Dispose();
        }
        return true;
    }

    private static void ConvertTo32bppAndDisposeOriginal(ref Bitmap img)
    {
        var bmp = new Bitmap(img.Width, img.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        using (var gr = Graphics.FromImage(bmp))
            gr.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height));
        img.Dispose();
        img = bmp;
    }

詳細については、次を参照してください。

于 2015-03-20T02:49:06.647 に答える
0

16777216 色を 32 色に変換しようとしています。これは重要な問題であり、それを行うには多くの方法があり、すべてに長所と短所があります。特にフルカラーディスプレイが普及したため、これは頻繁に行う必要があることではありません。

この Microsoft の記事には、PNG にも関連するはずの GIF ファイルに関する情報が含まれています。

http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q319061

于 2009-04-08T21:45:49.427 に答える