Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我不知道如何从';浮动';至';int';_C#_Visual Studio - Fatal编程技术网

C# 我不知道如何从';浮动';至';int';

C# 我不知道如何从';浮动';至';int';,c#,visual-studio,C#,Visual Studio,我正在学习编程,我被这个错误困扰了很长时间 我试着把变量改成浮动 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,

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

我试着把变量改成浮动

        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();
Color;
漂浮着红、绿、蓝、灰;
对于(int i=0;i
我希望输出是将普通照片转换为亮度背景

gray = red*0.21 + green*0.72 + blue*0.07;
....
oImage.SetPixel(i, j, Color.FromArgb(gray, gray, gray));

  • 0.21
    被识别为双精度。如果添加一个
    f
    ,它会将该值标记为
    float
不带后缀或带d或d后缀的文字为double类型

带有f或f后缀的文本为float类型

带有m或m后缀的文字类型为decimal

  • float可以转换为
    int
    ,因此
    (int)myFloatValue
    起作用

您应该将
设置为灰色
a
字节
,并将公式显式转换为
字节

byte gray = (byte) (red*0.21 + green*0.72 + blue*0.07);
请注意对传递给的值的限制

(…)尽管此方法允许为每个颜色分量传递32位值,但每个分量的值限制为8位


注1<代码>字节
浮动
双倍
,和
整数
您将
红色
绿色
蓝色
声明为
浮动
s,实际上它们是
字节

它们不需要是
浮点数
,因为
浮点数
/
双精度
*一个
字节
变成
浮点数
/
双精度

考虑以下代码段

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);

可能的重复对于不经意的读者来说,最好知道哪里出了问题:你有没有遇到编译器错误?你有运行时错误吗?还是程序编译并运行但没有产生预期的结果?我也不赞成那些容易被谷歌搜索到的问题。当我在谷歌上搜索“c#convert float to int”时,我得到了许多有用的答案。其中(公认排名12)是:“任何两种数值类型之间都存在转换,无论是隐式还是显式。必须使用cast运算符()来调用显式转换。”。。。“显式数字转换:…从浮点到sbyte、byte、short、ushort、int、uint、long、ulong或decimal”。@tymtam在调用
FromArgb
时,我将
灰色
转换为
int
绿色*0.72
也会给出一个编译器错误,这就是我提到这两个错误的原因。为什么要使文本浮动?好处是什么?非常感谢。我的错误是“无法隐式地将类型‘double’转换为‘float’”。我将变量改为double而不是float。我这样做是“oImage.SetPixel(i,j,Color.FromArgb((int)gray,(int)gray,(int)gray,(int)gray));”它可以解决我的问题,谢谢
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);