0

画像の赤の値を 50% 上げようとしています。これが私のコードです:

public static Bitmap IncreaseRedFiftyPercent(Bitmap b)
    {
        Bitmap temp = (Bitmap) b;
        Bitmap bmap = (Bitmap)temp.Clone();
        Color c;
        for (int i = 0; i < bmap.Width; i++)
        {
            for (int j = 0; j < bmap.Height; j++)
            {
                c = bmap.GetPixel(i, j);
                byte increase = c.R + c.R * 0.5;  //This line gives error

                bmap.SetPixel(i, j, Color.FromArgb(increase, c.G, c.B));
            }
        }
        b = (Bitmap)bmap.Clone();
        return b;
    }

これが私がすることです: 私は画像のすべてのピクセルを読み取り、赤の値を 50% 増やし、青と緑を同じに保ちます。しかし、ライン

byte increase = c.R + c.R * 0.5;  //This line gives error

と言うエラーが表示されます

Cannot implicitly convert type 'double' to 'byte'. An explicit conversion exists (are you missing     
a cast?)    

そして、私はダブルをバイトに変換できませんか? 私がやっていることは理にかなっているように見えますが、ここで何が悪いのですか?

ありがとう

4

3 に答える 3

5

代わりにこれを使用できますが、オーバーフローは考慮されません (255 を超える結果は 0 にロールオーバーされます)。

byte increase = (byte)(c.R + c.R / 2);

浮動小数点演算の代わりに整数演算を使用する/2代わりに使用することに注意してください。*0.5大量の大きな画像を処理している場合、パフォーマンスの差が大きくなる可能性があります。

要件に基づいて、次のようなものが機能する場合があります。

byte increase = (byte)(Math.Min(c.R + c.R / 2 , 255));
于 2013-10-01T22:37:43.450 に答える
1

問題は、バイト (例: c.R) を double で乗算すると (例: 0.5)、結果が double になることです (バイトには結果を保持する精度がないため)。次に、これをバイトに割り当てようとしていますが、エラーメッセージに暗黙的な変換が存在しないことが示されているため、明示的に変換する必要があります。

これは次のようなもので行うことができます

byte increase = (byte)(c.R + c.R * 0.5);

そして、これはオーバーフローをチェックしないという別の回答で思い出したのでc.R、170を超えるとオーバーフローの問題が発生します。この目的のために、D Stanley の Min テクニックのようなことをしたくなるでしょう。

于 2013-10-01T22:38:29.437 に答える