【问题标题】:i do not know how to convert from 'float' to 'int'我不知道如何从 'float' 转换为 'int'
【发布时间】:2019-11-06 10:04:11
【问题描述】:

我正在学习编程,我被这个错误卡了很长时间

我尝试将变量更改为浮动

        Color col;
        float red, green, blue,gray;

        for (int i = 0; i < oImage.Width; i++)
            for (int j = 0; j < oImage.Height; j++)
            {
                col = oImage.GetPixel(i, j);
                red = col.R;
                green = col.G;
                blue = col.B;
                gray = red*0.21 + green*0.72 + blue*0.07;


             oImage.SetPixel(i, j, Color.FromArgb(gray, gray, gray));

            }

        picImage.Refresh();

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

【问题讨论】:

  • 对于普通读者来说,知道出了什么问题会很高兴:您是否遇到编译器错误?您是否收到运行时错误?还是程序编译运行但没有产生预期的结果?
  • 我也对很容易用谷歌搜索的问题不屑一顾。当我用谷歌搜索“c# convert float to int”时,我得到了许多有用的答案。其中(当然排在第 12 位)是canonical documentation from microsoft.:“任何两种数字类型之间都存在转换,无论是隐式还是显式。您必须使用强制转换运算符 () 来调用显式转换。” ... "显式数字转换: ... 从浮点数到 sbyte、byte、short、ushort、int、uint、long、ulong 或 decimal"。

标签: c# visual-studio


【解决方案1】:

替换

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 被识别为双精度。如果您添加f,它将将该值标记为float Reference:

不带后缀或带 d 或 D 后缀的字面量是 double 类型

后缀为 f 或 F 的字面量是浮点型

带有 m 或 M 后缀的字面量是十进制类型

  • float 可以转换成 int 所以 (int)myFloatValue 可以工作

【讨论】:

  • @tymtam 为此我在调用FromArgb 时将gray 转换为int - green*0.72 也给出了编译器错误,这就是我提到这两个错误的原因
  • 为什么要让文字浮动?有什么好处?
【解决方案2】:

您应该将gray 设为byte 并将公式显式转换为byte

byte gray = (byte) (red*0.21 + green*0.72 + blue*0.07);

请注意传递给FromArgb(Int32, Int32, Int32)的值的限制

(...) 虽然此方法允许为每个颜色分量传递一个 32 位的值,但每个分量的值限制为 8 位。


注意 1.bytesfloatsdoublesints

您将redgreenblue 声明为floats,而实际上它们是bytes

他们不需要是floats,因为float/double * byte 变成了float/double

考虑以下 sn-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);

【讨论】:

  • 非常感谢。我的错误是“无法将类型'double'隐式转换为'float'。”。我将变量更改为double而不是float。我这样做“oImage.SetPixel( i, j, Color.FromArgb((int)gray, (int)gray, (int)gray));"它有效,谢谢解决我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
相关资源
最近更新 更多