首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“不能隐式地将类型'double‘转换为’字节‘”

“不能隐式地将类型'double‘转换为’字节‘”
EN

Stack Overflow用户
提问于 2013-10-01 22:30:49
回答 3查看 2.8K关注 0票数 0

我试图将图像的红色值提高百分之五十。这是我的代码:

代码语言:javascript
运行
复制
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%,并保持蓝色和绿色不变。但这条线

代码语言:javascript
运行
复制
byte increase = c.R + c.R * 0.5;  //This line gives error

给了我一个错误说

代码语言:javascript
运行
复制
Cannot implicitly convert type 'double' to 'byte'. An explicit conversion exists (are you missing     
a cast?)    

我不能把双字节转换成字节?我在做什么看起来很明智,这里有什么问题吗?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-01 22:37:43

您可以使用它,尽管它不会考虑溢出(任何超过255的结果都会滚到0):

代码语言:javascript
运行
复制
byte increase = (byte)(c.R + c.R / 2);

请注意,我使用/2而不是*0.5来使用整数数学,而不是浮点数运算。如果您正在处理大量的大型图像,则性能差异可能很大。

根据您的需求,类似这样的内容可能会奏效:

代码语言:javascript
运行
复制
byte increase = (byte)(Math.Min(c.R + c.R / 2 , 255));
票数 5
EN

Stack Overflow用户

发布于 2013-10-01 22:41:31

C#中的算术首先通过从可能的运算符列表中选择来确定要使用的运算符:

代码语言:javascript
运行
复制
int * int --> int
long * long --> long
double * double --> double

以此类推;这个名单相当长。

在您的例子中,最好的操作符是double * double --> double,因此字节被转换为double。这是无损的。但结果是一个双倍;它可能有一个小数部分,其大小可能大于最大的字节。转换回字节是有损的。因此,您必须说“我保证我真的想要进行这种有损转换”,方法是插入一个强制转换到字节。

现在,在你这样做之前,你应该确保你在做正确的事情!如果字节已经在200个,那么将其增加50%到double 300.00,然后将其转换回一个只能介于0到255之间的字节,这可能会产生意想不到的结果。在插入那个石膏之前要仔细考虑。

票数 8
EN

Stack Overflow用户

发布于 2013-10-01 22:38:29

问题是,当你取一个字节(如c.R)并乘以一个双(例如0.5),结果是一个双(因为一个字节可能没有精确地保存结果)。然后,您尝试将其分配给一个字节,正如错误消息所述,不存在隐式转换,因此必须显式转换它。

这可以用这样的方法来完成

代码语言:javascript
运行
复制
byte increase = (byte)(c.R + c.R * 0.5);

另一个答案提醒我,这不会检查溢出,所以如果c.R超过170个,那么就会出现溢出问题。为了达到这个目的,你会想做一些像D斯坦利的Min技术。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19127110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档