我正在尝试将图像的红色值增加百分之五十。这是我的代码:
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?)
我无法将双转换为字节?我在做什么看起来很明智,这里有什么不对?
由于
答案 0 :(得分:8)
C#中的算术是通过首先从可能的运算符列表中选择要确定使用哪个运算符来执行的:
int * int --> int
long * long --> long
double * double --> double
等等;这个清单很长。
在您的情况下,最佳运算符为double * double --> double
,因此字节将转换为double。这是无损。但结果却是双重的;它可能有一个小数部分,其幅度可能大于最大可能字节。转换回字节是有损。因此,您需要通过向字节插入强制转换来说“我保证我真的想要进行这种有损转换”。
现在,在你这样做之前,你应该确保你确实在做正确的事情!如果该字节已经在200,那么将它增加50%到双300.00然后将其转换回只能在0到255之间的字节可能会产生意外结果。在插入该演员表之前请仔细考虑。
答案 1 :(得分: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));
答案 2 :(得分:1)
问题是当你取一个字节(例如c.R
)并乘以一个double(例如0.5
)时,结果是一个double(因为一个字节可能没有精度来保持结果)。然后,您尝试将其分配给一个字节,并且错误消息显示不存在隐式转换,因此您必须显式转换它。
这可以通过类似
的方式完成byte increase = (byte)(c.R + c.R * 0.5);
我已经被其他答案提醒,这不会检查溢出,所以如果c.R
超过170则会出现溢出问题。为此,你会想要做一些像D Stanley的Min技术。