2013-10-01 78 views
0

我试图将图像的红色值增加50%。这里是我的代码:”不能隐式地将类型'double'转换为'byte'“

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

这里是我做的:我读了图像的所有像素,并且由百分之五十增加红色值,并保持蓝色和绿色是相同的。但线

byte increase = c.R + c.R * 0.5; //This line gives error 

给我一个错误说

Cannot implicitly convert type 'double' to 'byte'. An explicit conversion exists (are you missing  
a cast?)  

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

感谢

+0

只有一行甚至很重要 - 最后一行。 '字节b = somedouble;'无效。你必须明确地将* double *转换回* byte *(例如'(byte)somedouble')。该错误消息表示没有隐式转换(如从字节 - > double)。 – user2246674

+0

只是使用'字节增加=(字节)(c.R + c.R * 0.5);' –

+0

感谢您的答案,我这样做,但它似乎不像红色增加。我如何检查我的代码是否正在做我真正想要的?我试图使用一些图像查看器来增加红色并比较图片,但我无法做到。任何诉讼l,请检查一些程序吗? – yrazlik

回答

5

你可以用这个代替,虽然它不会占溢(超过255的任何结果将翻转至0):

byte increase = (byte)(c.R + c.R/2); 

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

根据您的要求,这样的事情可能工作:

byte increase = (byte)(Math.Min(c.R + c.R/2 , 255)); 
+0

感谢溢出检查建议,我会用if-else语句处理它 – yrazlik

+0

'Math.Min'应该可以正常工作。 –

+0

哦谢谢,我现在就试试吧 – yrazlik

1

的问题是,当你把一个字节(如c.R)和由双乘(如0.5),那么结果为双(因为一个字节可能没有精度来保存结果)。然后,您尝试将此分配给一个字节,并且由于错误消息表明不存在隐式转换,因此您必须将其明确转换。

这可以用的东西做类似

byte increase = (byte)(c.R + c.R * 0.5); 

而且我已经被另外一个答案,这将不会检查溢出,所以如果c.R超过170,那么你会得到溢出的问题提醒。为此,你会想要做一些像斯坦利最小技巧的东西。

8

算术在C#是通过首先确定通过从可能的运算符的列表中选择要使用的操作者执行的:

int * int --> int 
long * long --> long 
double * double --> double 

等;该名单很长。

在你的情况下,最好的运算符是double * double --> double,所以字节被转换为double。这是无损。但结果是双重的;它可能有一个小数部分,其大小可能比最大可能的字节大。转换回字节是有损。因此,您需要通过将转换插入字节来说“我确保我真的想要进行这种有损转换”。

现在,在你这样做之前,你应该确保你实际上做的是正确的事情!如果字节已经达到200,那么将其增加50%到300.00,然后将其转换为只能在0和255之间的字节,这可能会产生意想不到的结果。在插入演员之前仔细考虑。

+0

谢谢,Math.min函数帮助检查溢出 – yrazlik

相关问题