6

了解しました。外部アプリケーションから8ビットのインデックス形式で画像が届きました。この画像をまったく同じサイズの24ビット形式に変換する必要があります。

同じサイズでタイプFormat24bppRgbの新しいビットマップを作成し、Graphicsオブジェクトを使用して8ビット画像を描画してからBmpとして保存してみました。このアプローチはエラーになりませんが、結果の画像を開くと、BMPヘッダーにはあらゆる種類のファンキーな値が含まれています。高さと幅は非常に大きく、さらに、圧縮フラグやその他のいくつかの面白い(そして大きな)値があります。残念ながら、私の特定の要件は、このファイルを特定のヘッダー値を持つ24ビットイメージを要求する特定のプリンタードライバーに渡すことです(これはGDI +を介して達成しようとしています)

インデックス付きファイルをインデックスなしの24ビットファイルに「アップコンバート」する例を知っている人はいますか?例ではない場合、自分で書くためにどのパスから始めるべきですか?

-Kevin Grossnicklaus kvgros@sseinc.com

4

4 に答える 4

11

以下のコードを使用して、画像を 8bpp から 24bpp に「アップコンバート」しました。生成された 24bpp ファイルを 16 進エディターで検査し、8bpp ファイルと比較すると、2 つのファイルの高さと幅に違いはありません。つまり、8bpp のイメージは 1600x1200 で、24bpp のイメージは同じ値です。

    private static void ConvertTo24(string inputFileName, string outputFileName)
    {
        Bitmap bmpIn = (Bitmap)Bitmap.FromFile(inputFileName);

        Bitmap converted = new Bitmap(bmpIn.Width, bmpIn.Height, PixelFormat.Format24bppRgb);
        using (Graphics g = Graphics.FromImage(converted))
        {
            // Prevent DPI conversion
            g.PageUnit = GraphicsUnit.Pixel
            // Draw the image
            g.DrawImageUnscaled(bmpIn, 0, 0);
        }
        converted.Save(outputFileName, ImageFormat.Bmp);
    }

ヘッダーの他のすべては適切に見え、画像は私のシステムで同じように表示されます。どのような「ファンキーな価値観」を見ていますか?

于 2009-03-23T03:46:17.850 に答える
4

これは私の変換コードです。ソース画像と結果画像の解像度が一致していることに注意してください。

    private void ConvertTo24bppPNG(Stream imageDataAsStream, out byte[] data)
    {
        using ( Image img = Image.FromStream(imageDataAsStream) )
        {
            using ( Bitmap bmp = new Bitmap(img.Width, img.Height, PixelFormat.Format24bppRgb) )
            {
                // ensure resulting image has same resolution as source image
                // otherwise resulting image will appear scaled
                bmp.SetResolution(img.HorizontalResolution, img.VerticalResolution);

                using ( Graphics gfx = Graphics.FromImage(bmp) )
                {
                    gfx.DrawImage(img, 0, 0);
                }

                using ( MemoryStream ms = new MemoryStream() )
                {
                    bmp.Save(ms, ImageFormat.Png);
                    data = new byte[ms.Length];
                    ms.Position = 0;
                    ms.Read(data, 0, (int) ms.Length);
                }
            }
        }
    }
于 2011-06-07T22:36:08.480 に答える
0

問題はおそらく、ソース画像と出力画像の Vertical-Resolution と Horizo​​ntalResolution の違いです。72 DPI の解像度で 8bpp のインデックス付きビットマップをロードし、新しい 24bpp ビットマップを作成すると (デフォルトの解像度は 96 DPI になります...少なくとも私のシステムではそうです)、Graphics.DrawImage を使用して新しいビットマップにブリットします。ビットマップの場合、画像はわずかにズームインされ、トリミングされて表示されます。

そうは言っても、出力ビットマップおよび/またはグラフィックスオブジェクトを適切に作成して、保存時に適切にスケーリングする方法を頭の中で知りません。ピクセルではなくインチなどの一般的なスケールを使用して画像を作成することに関係があると思います。

于 2009-03-23T03:35:34.130 に答える
0

入力と同じ幅と高さのビットマップを作成しているのに、生成された BMP がはるかに大きいのは奇妙に思えます。コードを投稿できますか?

于 2009-03-23T02:39:14.750 に答える