как изменить белый фон на прозрачный в Голанге? - PullRequest
0 голосов
/ 11 января 2019

как изменить белый фон на прозрачный в Голанге?

Я хочу поместить белый фон в полупрозрачный цвет, у вас есть предложения?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

пакет "изображение" имеет функцию декодирования

func Decode(r io.Reader) (Image, string, error)

изображение. Изображение интерфейса

type Image interface {
        // ColorModel returns the Image's color model.
        ColorModel() color.Model
        // Bounds returns the domain for which At can return non-zero color.
        // The bounds do not necessarily contain the point (0, 0).
        Bounds() Rectangle
        // At returns the color of the pixel at (x, y).
        // At(Bounds().Min.X, Bounds().Min.Y) returns the upper-left pixel of the grid.
        // At(Bounds().Max.X-1, Bounds().Max.Y-1) returns the lower-right one.
        At(x, y int) color.Color
}

после того, как вы расшифруете свой файл в изображение. Изображение, вы можете получить Высота и Ширина из Bounds (), а цвет из At (x, y).

Итак, что делать дальше:

  • сделать другое изображение с альфа-каналом,
  • Повторить, бросить все изображение один пиксель за другим,
  • проверьте цвет, скопируйте цвет на новое изображение после того, как вы делаете все, что хотите.
0 голосов
/ 16 января 2019

Это вообще невозможно, но есть эвристические подходы, чтобы попытаться это сделать.

Почему это невозможно?

Если исходное изображение имело несколько прозрачных пикселей и отображалось на простом белом фоне (или на любом известном фоне), то в результирующем изображении теряется информация. Например, розовый пиксель создан из красного пикселя с некоторой прозрачностью или действительно розовый пиксель без прозрачности?

Даже чисто белый пиксель изначально мог быть полностью белым, или полностью прозрачным, или где-то посередине.

Эвристические подходы

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

Далее вы можете вывести цвета граничных пикселей вокруг объектов одного цвета (при условии, что для сглаживания использовалась прозрачность). Например, для красного круга с розовыми пикселями по окружности, скорее всего, они изначально были красными с некоторой прозрачностью, что приводило к их визуализации в различных оттенках розового. Для более сложных, разноцветных форм вы можете получить разумный результат, отредактировав изображение вручную, используя суждения, знания / догадки исходного изображения и знание того, как выполнялось сглаживание.

Я написал плагин Paint.Net (C #), чтобы автоматизировать подобные вещи много лет назад, и иногда он давал разумные результаты, но часто вам нужно делать это вручную.

...