web-dev-qa-db-ja.com

インデックス付き画像のグラフィックス

エラーが発生しています:

「インデックス付きピクセル形式の画像からグラフィックスオブジェクトを作成することはできません。」

機能内:

public static void AdjustImage(ImageAttributes imageAttributes, Image image)
{
        Rectangle rect = new Rectangle(0, 0, image.Width, image.Height);

        Graphics g = Graphics.FromImage(image);       
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, imageAttributes);
        g.Dispose();
}

質問したいのですが、どうすれば修正できますか?

25
Krivers

this を参照すると、同じサイズの空のビットマップと正しいPixelFormatを作成し、そのビットマップに描画することで解決できます。

// The original bitmap with the wrong pixel format. 
// You can check the pixel format with originalBmp.PixelFormat
Bitmap originalBmp = new (Bitmap)Image.FromFile("YourFileName.gif");

// Create a blank bitmap with the same dimensions
Bitmap tempBitmap = new Bitmap(originalBmp.Width, originalBmp.Height);

// From this bitmap, the graphics can be obtained, because it has the right PixelFormat
using(Graphics g = Graphics.FromImage(tempBitmap))
{
    // Draw the original bitmap onto the graphics of the new bitmap
    g.DrawImage(originalBmp, 0, 0);
    // Use g to do whatever you like
    g.DrawLine(...);
}

// Use tempBitmap as you would have used originalBmp
return tempBitmap;
33
Microsoft DN

最も簡単な方法は、次のような新しい画像を作成することです。

Bitmap EditableImg = new Bitmap(IndexedImg);

元の画像がすべてのコンテンツとまったく同じように新しい画像を作成します。

6
Bart Vanseer

全体として、インデックス付きイメージを使用し、実際に色深度とパレットを保持する場合、これは常に明示的なチェックと特別なコードを記述することを意味します。 Graphicsは単に色を操作できず、インデックス付き画像の実際のピクセルには色が含まれず、インデックスのみが含まれるため、単にそれらを使用することはできません。

この数年後もまだこれを見ている人にとっては、既存の(8ビット)インデックス付きイメージにイメージをペイントする有効な方法は次のとおりです。

  • 貼り付けたい画像のすべてのピクセルに移動し、各色について ターゲット画像のカラーパレットに最も近いものを見つけます に移動し、そのインデックスをバイト配列に保存します。
  • LockBitsを使用してインデックス付き画像のバッキングバイト配列を開き、高さと画像ストライドを使用して関連するインデックスをループすることにより、一致するバイトを希望する場所に貼り付けます。

簡単な作業ではありませんが、確かに可能です。貼り付けた画像にもインデックスが付けられ、256ピクセルを超える場合、実際の画像データではなくパレットでカラーマッチングを行い、他のインデックス付き画像からバッキングバイトを取得し、再マッピングすることでプロセスを高速化できます作成されたマッピングを使用します。

このすべてが8ビットにのみ適用されることに注意してください。画像が4ビットまたは1ビットの場合、最も簡単な処理方法は、最初に8ビットに変換して、ピクセルごとに1バイトとして処理し、後で元に戻すことです。

詳細については、 1ビットおよび4ビットのイメージを使用するにはどうすればよいですか? を参照してください。

1
Nyerguds