我不知道如何从“浮动”转换为“ int”

时间:2019-11-06 10:04:11

标签: c# visual-studio

我正在学习编程,而我在这个错误上停留了很长时间

我尝试将变量更改为浮点数

{{1}}

我希望输出是将普通照片转换为亮度背景

2 个答案:

答案 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位。


注释1. bytesfloatsdoublesints

您将redgreenblue声明为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

注意2。减少变量

您可以通过直接在公式中使用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);