WriteableBitmapEx GetPixel() возвращает неправильное значение

Мне нужно объединить два значения цвета из двух объектов WriteableBitmap и что-то с ними вычислить. Поэтому я запускаю цикл ForEach для первого объекта и анализирую его значение цвета и значение цвета второго объекта в методе.

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

Первое значение я получаю непосредственно от делегата, но для доступа ко второму значению цвета я использую метод GetPixel из расширения WriteableBitmap.

На самом деле это должно работать именно так, но кажется, что метод GetPixel возвращает неверные данные (цвета почему-то неправильно "желтоватые" или "красноватые").

Я поискал и нашел следующую статью:

http://forums.silverlight.net/t/250392.aspx/1?WriteableBitmap+GetPixel+

Там упоминается, что может быть проблема с форматом изображения. Моя проблема в том, что у меня нет прямого доступа к точке, где генерируются изображения. Я извлекаю их из веб-сервиса и не знаю, можно ли адаптировать эту часть (по крайней мере, не от меня).

Теперь мой вопрос: есть ли какой-либо другой способ или обходной путь для решения этой проблемы? У тебя есть идеи?


person Thomas Mondel    schedule 15.08.2012    source источник
comment
Вы уверены, что это не просто побочный эффект попытки слияния двух цветов? Это целая наука, чтобы сделать правильно, простое сочетание красного, зеленого и синего часто не выглядит хорошо. Человеческий глаз имеет очень нелинейное цветовосприятие.   -  person Hans Passant    schedule 15.08.2012
comment
Да, я уверен, потому что я проверил эту проблему, исключив все функции в методе MergePixelColor. В целях тестирования я просто вернул цвета, которые были введены в метод, и первое значение цвета было правильным, а второе — ложным. Он должен что-то делать с методом GetPixel, извлекающим данные из WriteableBitmap.   -  person Thomas Mondel    schedule 15.08.2012
comment
@ThomasMondel Кажется, проблема с компонентом A. (Я использовал версию 1.0.2 для Silverlight). Например, если я установил цвет заливки прямоугольника на #c3bcbcbc, фактический цвет прямоугольника будет #c38f8f8f. Не удалось рассмотреть это поближе, но, возможно, было бы целесообразно также опубликовать свою проблему на сайте Writeablebitmapex Codeplex (если вы еще этого не сделали).   -  person Anders Gustafsson    schedule 16.08.2012
comment
Убедитесь, что вы используете последний исходный код WBX, а не бинарную версию. Если проблема не устранена, опубликуйте ее с образцом по адресу writeablebitmapex.codeplex.com/workitem/list/. базовый   -  person Rene Schulte    schedule 16.08.2012


Ответы (1)


Это решение может быть просто обходным путем, но я не мог придумать что-то лучшее в свое время. Я просто заранее зацикливаю mergedWriteableBitmap и сохраняю его значения цвета в словаре:

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)]));
person Thomas Mondel    schedule 16.08.2012