3

画像からすべての画像ピクセル RGB カラー コードを取得するプログラムを作成しました。基本的には、y 位置を定数に設定し、x 位置 0 を width に変更し、ループによって y も変更します。

うまくいきましたが、問題は、偶数 (高さ 1000*幅 604) の画像からすべてのピクセルを取得するのに 20 分以上かかることです。誰か助けてください?

こんなに時間がかかるのに、画像からバーコードリーダーのようなプログラムを作るにはどうすればよいのか、不思議です。画像からすべてのピクセル値を取得したいのですが、これが私のC#コードです。

私のプログラムもここにアップロードしました。同意しない場合はチェックしてください。

    void myimage() {

        mypic = new Bitmap(pathname);
        int imwid = mypic.Width;
        int imhei = mypic.Height;
        int total=imwid*imhei;

        for (int z = 0; z <imhei;z++ )
        {
            for (int i = 0; i < imwid; i++)
            {
                Color pixelColor = mypic.GetPixel(i, z);

                textBox2.AppendText("  " + pixelColor.R + 
                    "     " + pixelColor.G + 
                    "     " + pixelColor.B + "     " + 
                    pixelColor.A + 
                    Environment.NewLine);
            }
        }
    }
4

2 に答える 2

3

これを見てください:

var data = mypic.LockBits(
    new Rectangle(Point.Empty, mypic.Size),
    ImageLockMode.ReadWrite, mypic.PixelFormat);
var pixelSize = data.PixelFormat == PixelFormat.Format32bppArgb ? 4 : 3; // only works with 32 or 24 pixel-size bitmap!
var padding = data.Stride - (data.Width * pixelSize);
var bytes = new byte[data.Height * data.Stride];

// copy the bytes from bitmap to array
Marshal.Copy(data.Scan0, bytes, 0, bytes.Length);

var index = 0;
var builder = new StringBuilder();

for (var y = 0; y < data.Height; y++)
{
    for (var x = 0; x < data.Width; x++)
    {
        Color pixelColor = Color.FromArgb(
            pixelSize == 3 ? 255 : bytes[index + 3], // A component if present
            bytes[index + 2], // R component
            bytes[index + 1], // G component
            bytes[index]      // B component
            );

        builder
            .Append("  ")
            .Append(pixelColor.R)
            .Append("     ")
            .Append(pixelColor.G)
            .Append("     ")
            .Append(pixelColor.B)
            .Append("     ")
            .Append(pixelColor.A)
            .AppendLine();

        index += pixelSize;
    }

    index += padding;
}

// copy back the bytes from array to the bitmap
Marshal.Copy(bytes, 0, data.Scan0, bytes.Length);

textBox2.Text = builder.ToString();

単なる例LockBitsです。何が起こるかを明確に理解するために、イメージング全般に関するいくつかの優れたチュートリアルを読んでください。

于 2013-10-25T10:05:56.373 に答える
1

ピクセル情報の取得にそれほど時間はかかりません。実行にかかる時間を記録できますmyimage()か? 遅さは別のところにあるのかもしれません。textBox2.AppendTextまた、 inで始まる行を削除してみて、myimage()実行速度を確認してください。

于 2013-10-25T09:55:29.693 に答える