Image<bgr,byte> WeightedImg;
.
.
double color;
for (int i = 0; i < dataArray.Length; i++){
color = dataArray[i, 2];
WeightedImg.Bitmap.SetPixel(x, y,Color.FromArgb((int)Math.Ceiling(color * R), (int)Math.Ceiling(color * G),(int)Math.Ceiling(color * B)));
}
这一行:
WeightedImg.Bitmap.SetPixel(x, y,Color.FromArgb((int)Math.Ceiling(color * R),
(int)Math.Ceiling(color * G),(int)Math.Ceiling(color * B)));
使程序崩溃..我想根据WeightedImg
值在double
中设置一个像素。这可能吗?
或我可以将Image<bgr,byte>
转换为Bitmap
或double[,]
吗?
答案 0 :(得分:1)
好吧,你的代码在我尝试的时候有效,但是有其他选择。
本规范自然地提供了颜色* N&lt; 255(产生不同的错误):
Image<Bgr, byte> img = new Image<Bgr,byte>(10,10);
double color = 5;
double R = 20, B = 20, G = 20;
img.Bitmap.SetPixel(0,0,Color.FromArgb((int)Math.Ceiling(color * R),(int)Math.Ceiling(color * G), (int)Math.Ceiling(color * B)));
你可以尝试相同的操作的替代方法是直接分配值注意数据属性,如果内存服务我正确的是[高度,宽度,深度]格式,那么:
img.Data[y,x, 0] = (byte)Math.Ceiling(color * R); //Red
img.Data[y,x, 1] = (byte)Math.Ceiling(color * G); //Green
img.Data[y,x, 2] = (byte)Math.Ceiling(color * B); //Blue
或者更直接地你可以使用:
img[0, 0] = new Bgr(Color.FromArgb((int)Math.Ceiling(color * R), (int)Math.Ceiling(color * G), (int)Math.Ceiling(color * B)));
所有这些方法都有效,我已经过测试。
至于你的其他问题,你可以将图像转换为位图
Bitmap x = img.ToBitmap();
你不能显式地将数据转换为双[,,](不是双[,])而不读取每个像素并将图像中的数据带到这个数组,我不建议使用以下格式很好:
Image<Bgr,Double> img = new Image<Bgr,Double>(10,10); //or (filename) of course
并转换
Image<Bgr,Double> img_double = img.Convert<Bgr,Double>();
但请记住,你无法一次转换多个项目,无法直接转换为必须这样做:
Image<Gray,Double> img_gray = img.Convert<Gray,Byte>().Convert<Gray,Double>();
//or alternatively
Image<Gray,Double> img_gray = img.Convert<Bgr,Double>().Convert<Gray,Double>();
答案 1 :(得分:0)
如果我不得不在不知道异常的情况下猜测你是Math.Ceiling调用返回的值小于0或大于255.也许在将值发送到Color.FromArgb之前限制值到该范围。另外,仔细检查x和y值是否实际位于图像内部。考虑上面的代码很难说。