WriteableBitmapEx的GetPixel()方法返回错误值

3

我需要将两个WriteableBitmap对象的两个颜色值合并并进行计算。因此,我在第一个对象上运行ForEach循环,并将其颜色值和第二个对象的颜色值解析到一个方法中。

writeableBitmap.ForEach((x, y, color) => 
    MergePixelColor(color, mergedWriteableBitmap.GetPixel(x, y)));

我直接从委托中获取第一个值,但要访问第二个颜色值,我使用WriteableBitmap扩展的GetPixel方法。实际上应该可以这样工作,但似乎GetPixel方法返回错误数据(颜色有些不正确,偏向于“黄色”或“红色”)。
我查阅了以下文章:http://forums.silverlight.net/t/250392.aspx/1?WriteableBitmap+GetPixel+,其中提到可能存在图像格式问题。我的问题是,我没有直接访问生成图像的地方。我从webservice中提取它们,而且我不知道那部分能否适应(至少我不知道如何适应)。
现在我的问题是,是否有其他方法或解决此问题的变通方法?你有什么想法吗?

1
你确定这不只是尝试合并两种颜色的副作用吗?这是一门需要正确操作的科学,简单地组合红、绿和蓝通常看起来并不好。人眼对颜色有非常非线性的感知。 - Hans Passant
是的,我确定,因为我通过在MergePixelColor方法中排除所有功能来测试了这个问题。为了测试目的,我只返回放入该方法的颜色,第一个颜色值是正确的,第二个颜色值是错误的。这与GetPixel方法从WriteableBitmap中提取数据有关。 - Thomas Mondel
@ThomasMondel,A组件似乎存在问题(我已经在Silverlight中使用了1.0.2版本)。例如,如果我将矩形的填充颜色设置为#c3bcbcbc,则矩形的实际颜色为#c38f8f8f。我还没有能够仔细研究这个问题,但也许在Writeablebitmapex Codeplex网站上发布您的关注点也是值得的(如果您还没有这样做的话)。 - Anders Gustafsson
请确保您正在使用WBX的最新源代码,而不是二进制发布版本。如果问题仍然存在,请在http://writeablebitmapex.codeplex.com/workitem/list/basic上发布一个带有示例的帖子。 - Rene Schulte
1个回答

0

这个解决方案可能只是一个权宜之计,但在我给定的时间内,我想不出更好的方法。我只是事先循环合并的WriteableBitmap,并将其颜色值保存到字典中:

IDictionary<int, Color> mergedWriteableBitmapMapping = new Dictionary<int, Color>();
mergedWriteableBitmap.ForEach((x, y, color) =>
{
    int index = GetIndex(x, y, mergedWriteableBitmap.PixelWidth);
    mergedWriteableBitmapMapping.Add(index, color);
    return color;
});

随后我使用该字典的值将正确的颜色值解析到方法中:
writeableBitmap.ForEach((x, y, color) => 
    MergePixelColor(color, mergedWriteableBitmapMapping[GetIndex(x, y, mergedWriteableBitmap.PixelWidth)]));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接