4

私のグレースケール画像では、特定の値を見つけて、黄色などの色に置き換える必要があります。これが私が今持っているコードですが、必要なほど高速ではありません。それを達成するためのより効率的な方法はありますか?私はColorMatrixクラスについて赤字でしたが、画像全体に影響を与えずに単一の値を置き換える方法を見つけることができませんでした。

unsafe
{
    byte stlThres = 115;

    int bytePerPixel = Image.GetPixelFormatSize(kpImageViewer1.Image.PixelFormat) / 8;
    var data = kpImageViewer1.Image.LockBits(new Rectangle(0, 0, kpImageViewer1.Image.Width, kpImageViewer1.Image.Height), ImageLockMode.WriteOnly, kpImageViewer1.Image.PixelFormat);
    for (int y = 0; y < data.Height; y++)
    {
        byte* row = (byte*)data.Scan0 + (y * data.Stride);

        for (int x = 0; x < data.Width; x++, row += bytePerPixel)
        {
            if (row[0] == stlThres)
            {
                row[0] = 0; //b
                row[1] = 255; //g
                row[2] = 255; //r
                if (bytePerPixel == 4)
                {
                    row[3] = 255; //a
                }
            }
        }
    }
    kpImageViewer1.Image.UnlockBits(data);
}
4

1 に答える 1

1

各ピクセルが 4 バイト (チャネルあたり 8 ビット) である 4 チャネル イメージの場合、 によってインデックス付けされた 256 エントリのルックアップ テーブルを使用して、row[0]4 つのチャネルすべてを単一の 32 ビット として同時に割り当てることができますint

于 2013-05-23T18:07:06.067 に答える