我正在学习编程,而我在这个错误上停留了很长时间
我尝试将变量更改为浮点数
{{1}}
我希望输出是将普通照片转换为亮度背景
答案 0 :(得分:4)
替换
gray = red*0.21 + green*0.72 + blue*0.07;
....
oImage.SetPixel(i, j, Color.FromArgb(gray, gray, gray));
使用
gray = red * 0.21f + green * 0.72f + blue * 0.07f;
...
oImage.SetPixel(i, j, Color.FromArgb((int)gray, (int)gray, (int)gray));
0.21
被识别为double。如果添加f
,它将标记为float
Reference: 不带后缀或带d或D后缀的文字类型为double
带f或F后缀的文字的类型为float
后缀为m或M的文字的类型为小数
int
中,因此(int)myFloatValue
可以正常工作答案 1 :(得分:0)
您应将gray
设为byte
,并将公式明确地转换为byte
。
byte gray = (byte) (red*0.21 + green*0.72 + blue*0.07);
请注意传递给FromArgb(Int32, Int32, Int32)
的值的限制
(...)尽管此方法允许为每个颜色分量传递32位值,但每个分量的值限制为8位。
bytes
,floats
,doubles
和ints
您将red
,green
,blue
声明为float
,而实际上它们是bytes
。
它们不必是floats
,因为float
/ double
*一个byte
变成了float
/ double
。< / p>
请考虑以下代码段。
Color col = Color.FromKnownColor(KnownColor.Salmon);
var red = col.R;
var xR = 0.21;
var grayR = col.R*xR;
此打印
'red' is System.Byte: 250
'xR' is System.Double: 0.21
'grayR' is System.Double: 52.5
您可以通过直接在公式中使用RGB值来简化代码。
Color col = Color.FromKnownColor(KnownColor.Salmon);
byte gray = (byte) (col.R*0.21 + col.G*0.72 + col.B*0.07);
Color c2 = Color.FromArgb(gray, gray, gray);