4

画像が着色されているかどうかを把握しようとしています。このStackOverflow の質問では、の列挙型を確認する必要があるという返信があります。残念ながら、答えは私にはあまり明確ではありません。カラー画像と考えるのと違うのか確認してみてはいかがでしょうか?列挙の他の値はどうですか? MSDNのドキュメントはあまり明確ではありません...PixelFormatImageimage.PixelFormatPixelFormat.Format16bppGrayScale

4

3 に答える 3

14

Color.FromArgb を回避し、int ではなくバイトを反復することでこれを改善できますが、これは読みやすく、アプローチとして理解しやすいと思いました。

一般的な考え方は、画像を既知の形式 (32bpp ARGB) のビットマップに描画し、そのビットマップに色が含まれているかどうかを確認することです。

ビットマップのビットをロックすると、安全でないコードを使用して、GetPixel を使用するよりも何倍も速くそのカラー データを反復処理できます。

ピクセルのアルファが 0 の場合、アルファ 0 は完全に不透明であることを意味するため、明らかに GrayScale です。それ以外の場合 - R = G = B の場合はグレーです (they = 255 の場合は黒)。

private static unsafe bool IsGrayScale(Image image)
{
    using (var bmp = new Bitmap(image.Width, image.Height, PixelFormat.Format32bppArgb))
    {
        using (var g = Graphics.FromImage(bmp))
        {
            g.DrawImage(image, 0, 0);
        }

        var data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat);

        var pt = (int*)data.Scan0;
        var res = true;

        for (var i = 0; i < data.Height * data.Width; i++)
        {
            var color = Color.FromArgb(pt[i]);

            if (color.A != 0 && (color.R != color.G || color.G != color.B))
            {
                res = false;
                break;
            }
        }

        bmp.UnlockBits(data);

        return res;
    }
}
于 2012-04-26T13:21:33.110 に答える