3

私が取り組んでいるプログラムの最適化に取り組んでいます。現在、ロック ビットを使用してバイト データを読み取りますが、setPixel を使用してピクセル データを書き込みます。では、読み込んでいるピクセル データを実際に変更するにはどうすればよいでしょうか。pp、cp、または np を設定しようとすると、メソッドが機能しません (ループし、ピクセル データを表すために pp、cp、および np が必要になるため)。ピクセル データを byte[] に書き込んで操作する必要がありますか、それとも何ですか?

コードサンプルは次のとおりです。

BitmapData data = img.LockBits(new Rectangle(0, 0, img.Width, img.Height),
    ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

int scaledPercent = (int)(Math.Round(percentageInt * 255)) - 47;
Debug.WriteLine("percent " + scaledPercent);
unsafe
{
    Debug.WriteLine("Woah there, unsafe stuff");
    byte* prevLine = (byte*)data.Scan0;
    byte* currLine = prevLine + data.Stride;
    byte* nextLine = currLine + data.Stride;

    for (int y = 1; y < img.Height - 1; y++)
    {
        byte* pp = prevLine + 3;
        byte* cp = currLine + 3;
        byte* np = nextLine + 3;
        for (int x = 1; x < img.Width - 1; x++)
        {
            if (IsEdgeOptimized(pp, cp, np, scaledPercent))
            {
                //Debug.WriteLine("x " + x + "y " + y);
                img2.SetPixel(x, y, Color.Black);
            }
            else
            {
                img2.SetPixel(x, y, Color.White);
            }
            pp += 3; cp += 3; np += 3;
        }
        prevLine = currLine;
        currLine = nextLine;
        nextLine += data.Stride;
    }
}
img.UnlockBits(data);
pictureBox2.Image = img2;
4

1 に答える 1