我试图将图像的红色值提高百分之五十。这是我的代码:
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%,并保持蓝色和绿色不变。但这条线
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?) 我不能把双字节转换成字节?我在做什么看起来很明智,这里有什么问题吗?
谢谢
发布于 2013-10-01 22:37:43
您可以使用它,尽管它不会考虑溢出(任何超过255的结果都会滚到0):
byte increase = (byte)(c.R + c.R / 2);请注意,我使用/2而不是*0.5来使用整数数学,而不是浮点数运算。如果您正在处理大量的大型图像,则性能差异可能很大。
根据您的需求,类似这样的内容可能会奏效:
byte increase = (byte)(Math.Min(c.R + c.R / 2 , 255));发布于 2013-10-01 22:41:31
C#中的算术首先通过从可能的运算符列表中选择来确定要使用的运算符:
int * int --> int
long * long --> long
double * double --> double以此类推;这个名单相当长。
在您的例子中,最好的操作符是double * double --> double,因此字节被转换为double。这是无损的。但结果是一个双倍;它可能有一个小数部分,其大小可能大于最大的字节。转换回字节是有损的。因此,您必须说“我保证我真的想要进行这种有损转换”,方法是插入一个强制转换到字节。
现在,在你这样做之前,你应该确保你在做正确的事情!如果字节已经在200个,那么将其增加50%到double 300.00,然后将其转换回一个只能介于0到255之间的字节,这可能会产生意想不到的结果。在插入那个石膏之前要仔细考虑。
发布于 2013-10-01 22:38:29
问题是,当你取一个字节(如c.R)并乘以一个双(例如0.5),结果是一个双(因为一个字节可能没有精确地保存结果)。然后,您尝试将其分配给一个字节,正如错误消息所述,不存在隐式转换,因此必须显式转换它。
这可以用这样的方法来完成
byte increase = (byte)(c.R + c.R * 0.5);另一个答案提醒我,这不会检查溢出,所以如果c.R超过170个,那么就会出现溢出问题。为了达到这个目的,你会想做一些像D斯坦利的Min技术。
https://stackoverflow.com/questions/19127110
复制相似问题