2017-01-20 3 views
1

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

Применение мягкого фильтра Грань видимой части
Blurred interior

Фон с разрезом формы из
Outside image

Два скомпонованных вместе в программе
Composited

То, что я на самом деле получить
What I'm actually getting

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

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, поэтому сделать сколь угодно большие пробелы, вероятно, тоже не сработает.

+0

Это слишком непонятно, что вы делаете. Если вы не можете включить код, то, может быть, формальное описание ваших операций? –

ответ

1

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

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

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

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