私は8ビットのビットマップカラー画像を持っています。私はC#印刷画素値
Color pixelcolor = b.GetPixel(j,i);
Console.Write(pixelcolor.ToString() + " ");
を行うとき、私は私が唯一の8ビットの値を取得する必要があり
Color [A=255, R=255, G=255, B=255]
を取得します。 R、G、B、Aの24ビットの値ではありません。あなたが欲しい
私は8ビットのビットマップカラー画像を持っています。私はC#印刷画素値
Color pixelcolor = b.GetPixel(j,i);
Console.Write(pixelcolor.ToString() + " ");
を行うとき、私は私が唯一の8ビットの値を取得する必要があり
Color [A=255, R=255, G=255, B=255]
を取得します。 R、G、B、Aの24ビットの値ではありません。あなたが欲しい
Bitmap
クラスを直接使用する方法はありません。最初のプロジェクトでenable unsafe codeに思い出してくれる:
注:しかし、あなたが直接このようなunsafeコードを使用して、ピクセルにアクセスするためのLockBits
メソッドを使用することができます。
private static unsafe byte GetIndexedPixel(Bitmap b, int x, int y)
{
if (x < 0 || x >= b.Width) throw new ArgumentOutOfRangeException("x", string.Format("x should be in 0-{0}", b.Width));
if (y < 0 || y >= b.Height) throw new ArgumentOutOfRangeException("y", string.Format("y should be in 0-{0}", b.Height));
var data = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly, PixelFormat.Indexed);
try
{
var scan0 = (byte*) data.Scan0;
return scan0[x + y*data.Stride];
}
finally
{
if (data != null) b.UnlockBits(data);
}
}
'Marshal.Copy'を使用してバイトを取得することで、安全でないことを避けることができます。 – Nyerguds
ええ、1ピクセルを照会するだけでバッファ全体をコピーするのは面倒です。しかし、通常はほとんどすべてのピクセルが読み取られていない場合は、この場合Marshal.Copyは最適な方法です。 – vidstige
うん...このコードをそのまま使用すると、通常のGetPixelと同じ問題が発生することがよくあります。すべてのコンテンツをループして、各ピクセルをロックしたりアンロックしたりすると、数千から数千万ピクセルの画像にバイト配列の内容をチェックするだけでは猛烈です。 – Nyerguds
Bitmap
クラスのメソッドでは、パレットインデックスを直接取得することはできません。
Palette
プロパティを使用して画像のパレットを取得し、その色を探しますが、これは回避策です。
パレットインデックスを直接取得するには、LockBits
メソッドを使用してイメージデータに直接アクセスします。データを配列にコピーするにはマーシャリングを使用するか、安全でないモードのポインターを使用してアクセスしなければなりません。
Color
値A
プロパティは、アルファ成分です。 0〜255の値を持つことができます.0は完全に透明、255は完全にソリッドです。
あなたがするLockBitsを使用したくない場合は、あなたがこれを行うことができます:
/// <summary>
/// Gets the pixel value in bytes. Uses Bitmap GetPixel method.
/// </summary>
/// <param name="bmp">Bitmap</param>
/// <param name="location">Pixel location</param>
/// <returns>Pixel value</returns>
public static byte Get8bppImagePixel(Bitmap bmp, Point location)
{
Color pixelRGB = bmp.GetPixel(location.X, location.Y);
int pixel8bpp = Array.IndexOf(bmp.Palette.Entries, pixelRGB);
return (byte)pixel8bpp;
}
パレットに重複がある場合、これは信頼できません。 – Nyerguds
が画像8ビットのインデックスまたは非インデックス付きのですか? –
@ErnodeWeerd私は正直なところインデックスされていない8bppフォーマットに遭遇したことはありません。これは、意味のある色情報を格納するには小さすぎる各色成分に対して2または3ビットしか持たないことを意味する。 – Nyerguds
@ニーアードーズ - それが遭遇しても、それは仕様によると不可能ではありません。単色または4色の画像は、まったく遠くに取り込まれません。 –