Устранение пограничного эффекта

Это рабочий проект. Я унаследовал некоторый код, используя SharpDX (уровень DirectX). Одна из моих задач — исправить фрагмент кода, в котором определенные эффекты изображения применяются к геометрической фигуре, содержащей заливку. Если фильтр применяется к самой заливке, она не соответствует краям. Я придумал код для извлечения отрывка с использованием геометрии объекта. По разным причинам они хотят сохранить заливку, существующую за пределами формы (а именно, у нас есть некоторые эффекты искажения, которые вытягивают пиксели за пределы формы), поэтому мне нужно наложить ее на фон. Проблема, с которой я сталкиваюсь, заключается в том, что я получаю эту однопиксельную границу...

Применение фильтра Soft Edge к видимой части
Размытый интерьер

Фон с вырезанной фигурой
Внешнее изображение

В программе они объединены вместе
Composited

Что я на самом деле получаю
Что я на самом деле получаю

Я не могу поделиться значительной частью кода, так как его части являются частными, но маска представляет собой массив байтов. Я строю его, используя следующий код:

SingleChannelBitmap mask = new SingleChannelBitmap(MaxRequiredPixels.Width, MaxRequiredPixels.Height, 255);
mask.FillShape(new RectangleF(new PointF(0,0), mask.Size), this.Geometry, 0);

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

Это должно работать и для фильтра скоса 3D Edge, поэтому создание произвольно больших пробелов, вероятно, тоже не сработает для меня.


person Sean Duggan    schedule 20.01.2017    source источник
comment
Слишком непонятно, что вы делаете. Если вы не можете включить код, то, может быть, формальное описание ваших операций?   -  person Nico Schertler    schedule 20.01.2017


Ответы (1)


То, что вы описываете, по сути, является той же проблемой ореола, которая иногда возникает при отображении изображений PNG. Процесс экспорта PNG из нескольких программ будет сохранять сплошной цвет для любых частей PNG с нулевой альфой вместо фактического цвета в этих пикселях. Это делает их работу похожей на другие форматы изображений (GIF), которые используют определенный цвет для кодирования прозрачных пикселей. Это значительно уменьшает размер файла, однако может вызвать проблемы при выборке изображения.

Ваша ситуация похожа. Хотя замаскированные пиксели имеют нулевую альфу, при выполнении билинейной выборки вы можете производить выборку между пикселями, смешивая значения цвета и альфы (если только центры пикселей и текселей не выровнены идеально). Например, если у вас есть белый пиксель со 100% альфа-каналом рядом с красным пикселем с альфа-каналом 0% и образец между ними, результатом будет розовый пиксель с альфа-каналом 50%.

Есть несколько возможных решений:

  • Вы можете расширить границы цветового слоя, чтобы граница с альфа-каналом 0% имела тот же цвет, что и соседние пиксели с альфа-каналом, отличным от 0%.
  • Намеренно выровняйте центры пикселей и текселей, хотя это может быть сложно и/или невозможно, в зависимости от ваших требований (в основном зависит от разрешения).
  • Используйте «ближайшую» выборку вместо билинейной при отображении изображения. Таким образом, вы никогда не смешаетесь с альфа-пикселем 0%. Однако это также может быть нежелательно, потому что ваше изображение, скорее всего, будет демонстрировать больше эффектов наложения.
person MuertoExcobito    schedule 21.01.2017