2

スクリーンショットのビットマップから 4 ピクセルごとに R、G、B の値を返す C# 関数を作成しようとしています。これは私のコードの一部です。

for (int ix = 4; ix < 1366; ix = ix + 4)
{
    x = x + 4;

    for (int iy = 3; iy < 768; iy = iy + 4)
    {
        y = y + 4;
                      
        System.Drawing.Color pixelcolor = screenshot.GetPixel(x,y);
        red = kolorpiksela.R;
        green = kolorpiksela.G;
        blue = kolorpiksela.B;

        sumR = sumR + red;
        sumG = sumG + green;
        sumB = sumB + blue;                
    }
}

screenshotビットマップはどこにありますか。最後に、「合計」値がピクセル数で除算されます。私の問題は、それが機能しないことです。私が得るエラーは次のとおりです。

System.Drawing.dll で 'System.ArgumentOutOfRangeException' 型の未処理の例外が発生しました

追加情報: パラメーターは正で < 高さでなければなりません。

エラーの理由は、すべてのステップをリセットする必要があるためだと思いますがpixelcolor、過去 2 日間はそうしようとしました。失敗。

4

3 に答える 3

0

これを試して:

for (int x = 0; x < screenshot.Width; x += 4)
{
    for (int y = 0; y < screenshot.Height; y += 4)
    {
        Color pixelcolor = screenshot.GetPixel(x, y);
        sumR += pixelcolor.R;
        sumG += pixelcolor.G;
        sumB += pixelcolor.B;
    }
}
于 2012-10-30T20:31:23.293 に答える
0

Bitmap が 1366 x 768 であると想定しています。

あなたの ix ループでは、最初の反復で ix = 4. 431 番目の反復で ix = 1364 なので、ループに入ります。

問題は、x に 4 を追加することです (つまり、x = 1368)。これは、1366 の境界を超えます。

ビットマップの寸法をハードコーディングするのは最善の方法ではありませんが、x = x + 4 が 1366 の境界を超えているかどうかを確認するために簡単な if チェックインを行うことができます。

768 の iy ループもほぼ同じです。

于 2012-10-30T20:30:24.150 に答える
0

ここで何が起こっているのかわかりません:

for (int ix = 4; ix < 1366; ix = ix +4 )
{
    x = x + 4;

    for (int iy = 3; iy < 768; iy = iy + 4)
    {
        y = y + 4;

私の推測では、次のようになります。

for (int x = 0; x < screenshot.Width; x += 4 )
{
    for (int y = 0; y < screenshot.Height; y += 4)
    {
        System.Drawing.Color pixelcolor = screenshot.GetPixel(x,y);

必要がないときは、値をハードタイプしないようにしてください。おそらく、その「4」をどこかの const またはプロパティに変えることさえあるでしょう。

于 2012-10-30T20:26:12.990 に答える