Каждый пиксель обычного изображения описывается тремя числами: сколько в нём красного, зелёного и синего. Этого хватает, чтобы сказать, какого пиксель цвета, но не то, видно ли сквозь него. Альфа-канал представляет собой четвёртое число в каждом пикселе, которое отвечает как раз за это: в нём хранится непрозрачность, от полностью прозрачного до полностью непрозрачного.
Когда говорят о «PNG с прозрачным фоном», имеют в виду изображение с альфа-каналом, в котором у пикселей фона альфа равна нулю. В этом руководстве объясняется, как работает это число, два способа, которыми программы его хранят, почему портятся края и как проверить, что на самом деле лежит в файле.
RGBA: четыре канала на пиксель
MDN определяет альфа-канал просто: цвета состоят из каналов (красного, зелёного и синего), а чтобы описать цвет, «сквозь который в какой-то мере виден фон», добавляют четвёртый канал. Изображение со всеми четырьмя называют RGBA.
Значение можно записать по-разному, и все записи означают одно и то же:
| Запись | Полностью прозрачный | Наполовину прозрачный | Полностью непрозрачный |
|---|---|---|---|
| 8-битное целое (большинство файлов) | 0 | 128 | 255 |
| 16-битное целое (16-битный PNG) | 0 | 32768 | 65535 |
| Дробь (математика наложения, CSS) | 0 | 0.5 | 1 |
| Проценты (CSS) | 0% | 50% | 100% |
Шестнадцатеричный суффикс (CSS #rrggbbaa) | 00 | 80 | ff |
Спецификация PNG формулирует точно: значение альфы ноль означает полную прозрачность, максимальное значение для данной разрядности означает полную непрозрачность, а промежуточные значения задают частично прозрачные пиксели, «которые можно наложить на фоновое изображение».
Именно промежуточные значения важны. Хорошая вырезка не сводится к схеме «объект непрозрачный, фон прозрачный». Пиксели вдоль края, особенно в волосах, шерсти, ткани, стекле и смазе от движения, частично прозрачны, и благодаря им объект выглядит на новом фоне естественно, а не вырезанным ножницами.
Как рисуется прозрачный пиксель
Когда приложение кладёт ваше изображение поверх чего-то ещё, оно смешивает каждый пиксель с тем, что под ним. Спецификация W3C Compositing and Blending даёт базовую формулу:
result = Cs x as + Cb x ab x (1 - as)
Cs, as = color and alpha of your image (the source)
Cb, ab = color and alpha of what is behind it (the backdrop)В частом случае непрозрачного фона это превращается во взвешенное среднее. Пиксель с альфой 0.3 даёт 30% своего цвета и пропускает 70% фона.
Прямая и premultiplied альфа
Цвет частично прозрачного пикселя можно хранить двумя способами, и путаница между ними становится классическим источником тёмной или светлой каймы.
Прямая альфа (straight, её также называют несвязанной или не premultiplied) хранит цвет так, будто пиксель полностью непрозрачен, а непрозрачность отдельно. Наполовину прозрачный чисто красный пиксель хранится как красный 255, зелёный 0, синий 0, альфа 128.
Premultiplied альфа (предумноженная, или связанная) хранит цвет, уже умноженный на альфу. Тот же пиксель хранится как красный 128, зелёный 0, синий 0, альфа 128. Как сказано в спецификации PNG, такое изображение «уже наложено на чёрный фон».
Какой способ использует файл, зависит от формата и программы:
- PNG всегда использует прямую альфу. Спецификация говорит это прямо и отмечает, что так редактору проще менять прозрачность изображения.
- Графические конвейеры, игровые движки и программы для видеокомпозитинга внутри часто работают с premultiplied альфой, потому что математика смешивания проще, а фильтрация ведёт себя лучше.
Проблемы начинаются, когда одна программа пишет premultiplied значения, а другая читает их как прямые. Цвета вдоль краёв выходят слишком тёмными, и появляется тонкий чёрный контур. В обратную сторону края получаются слишком светлыми. Если у всех вырезок из одного инструмента стабильно тёмный ободок, первым делом подозревайте несовпадение premultiplied и прямой альфы.
Почему у вырезок появляется ореол
Ореолом называют видимый ободок вокруг объекта, который ему не принадлежит. Есть четыре частые причины, и у каждой своё решение.
1. Старый фон впитался в краевые пиксели
Камера никогда не снимает чистую границу. Прядь волос на фоне зелёной живой изгороди даёт пиксели, которые частично волосы и частично изгородь. Если вырезка сохраняет исходные цвета этих пикселей и только делает их полупрозрачными, зелёный остаётся подмешанным. На белом фоне у объекта появляется слабое зелёное свечение.
Решение: очистка цвета, то есть оценка настоящего цвета переднего плана для каждого краевого пикселя и запись именно его. В Photoshop это называется «Очистить цвета» в рабочей среде «Выделение и маска», а у открытой библиотеки rembg есть параметр decontaminate, который делает то же самое. Он меняет цвета краёв, но никогда не форму маски.
2. Маска слишком жёсткая
Если в маске есть только полностью непрозрачные и полностью прозрачные пиксели, края выглядят зубчатыми, а сглаживание в исходном фото оставляет вокруг объекта линию цвета фона толщиной в пиксель. Мягким объектам вроде волос нужна мягкая маска с настоящими промежуточными значениями.
3. Скрытые цвета в прозрачных пикселях
В файле с прямой альфой у пикселя с альфой ноль всё равно есть значения красного, зелёного и синего. Их не видно, но при изменении размера или размытии соседние пиксели смешиваются, и если скрытые цвета белые или чёрные, они просачиваются в видимый край. Хорошие библиотеки обработки изображений избегают этого: перед изменением размера переводят в premultiplied, а после конвертируют обратно.
4. Изображение свели на цвет
GIF и PNG с палитрой часто поддерживают только прозрачность «да или нет», поэтому программы перед сохранением сглаживают край относительно цвета подложки, обычно белого. Такое изображение выглядит нормально на белом и показывает белую кайму на всём, что темнее. Если вырезка будет лежать на тёмном фоне, экспортируйте её с полной альфой.
Маски, матты и альфа: словарь
Эти слова пересекаются и употребляются вольно. Вот что они обычно означают:
- Альфа-канал: значения непрозрачности, хранящиеся внутри файла изображения, по одному на пиксель.
- Маска: изображение в оттенках серого, которое управляет тем, какие части другого изображения видны. В слоях-масках Photoshop белый показывает, чёрный скрывает, а серый виден частично. Маску можно редактировать, не трогая исходные пиксели, поэтому профессионалы удаляют фон масками, а не ластиком.
- Матт (matte): термин из кино и композитинга для той же идеи, изображение в оттенках серого, которое определяет, что остаётся. «Мэттингом» (matting) называют задачу вычисления мягких точных маттов для сложных краёв вроде волос.
- Тримап (trimap): грубая карта из трёх зон (точно передний план, точно фон, неясно), с которой начинают некоторые алгоритмы мэттинга.
- Бинарная или жёсткая маска: только чёрный и белый, без серого. Годится для коробок и логотипов, плохо для волос.
- Вырезка: готовый результат, цвета объекта плюс альфа-канал.
Маска и альфа-канал хранят одну и ту же информацию. Многие инструменты позволяют экспортировать и то, и другое: прозрачный PNG со встроенной альфой или отдельное чёрно-белое изображение маски, которое можно применить самостоятельно в редакторе или видеопрограмме.
Какие форматы хранят альфу
| Формат | Поддержка альфы |
|---|---|
| PNG | Полная альфа (8 или 16 бит) или один прозрачный цвет палитры |
| WebP | Полная альфа, в режимах без потерь и с потерями |
| AVIF | Полная альфа |
| GIF | Только «да или нет»: один цвет палитры помечен прозрачным |
| JPEG | Нет |
Полное сравнение этих форматов есть в статье PNG, JPEG или WebP.
Как проверить, есть ли у изображения прозрачность
Расширение .png не доказывает прозрачность. Многие PNG полностью непрозрачны, а некоторые «прозрачные» картинки из интернета на деле оказываются JPEG с нарисованной в пикселях серо-белой клеткой. Вот надёжные способы проверить.
На глаз
Положите изображение на тёмный и на светлый фон, например в слайде или в графическом редакторе. У настоящей вырезки в обоих случаях вокруг объекта виден цвет фона. Если клетка всё ещё видна, она часть картинки, а не прозрачность.
С помощью ImageMagick
# Does the file have an alpha channel at all?
identify -format "%A\n" photo.png
# Is it fully opaque anyway? (true means no visible transparency)
identify -format "%[opaque]\n" photo.png%A сообщает о канале прозрачности (точное выводимое слово различается в ImageMagick 6 и 7), а %[opaque] вычисляет, все ли пиксели полностью непрозрачны. Вам нужен альфа-канал и false.
С помощью Python и Pillow
from PIL import Image
im = Image.open("photo.png")
print(im.mode) # RGBA or LA means an alpha channel
print(im.has_transparency_data) # True if the file carries any transparency info
if "A" in im.getbands():
lo, hi = im.getchannel("A").getextrema()
print("alpha range:", lo, hi) # lo == 255 means nothing is transparentПроверка экстремумов ловит частый случай: файл RGBA, в котором каждый пиксель непрозрачен.
Когда платформа игнорирует альфу
Некоторые площадки убирают или игнорируют прозрачность. Etsy пишет, что прозрачные PNG не поддерживаются и прозрачные области могут стать чёрными, а маркетплейсы вроде Amazon и Walmart и так требуют главные фото на чисто белом. В таких случаях сводите вырезку на цвет фона сами, чтобы контролировать результат. На своём сайте, в слайдах и графических редакторах сохраняйте альфу.
Как быстро получить чистый альфа-канал
Если нужны вырезки с мягкими краями, а не жёсткие маски, removebackground.dev создаёт прозрачные файлы PNG или WebP с полным альфа-каналом, а его API может отдельно вернуть и маску в оттенках серого.
Вопросы
Что означает RGBA?
Красный, зелёный, синий и альфа. Первые три описывают цвет пикселя, четвёртый его непрозрачность, от 0 (полностью прозрачный) до максимального значения (255 в 8-битных изображениях) для полностью непрозрачного.
Чем прямая альфа отличается от premultiplied?
Прямая альфа хранит полный цвет пикселя и его непрозрачность отдельно. Premultiplied альфа хранит цвет, уже умноженный на непрозрачность, как будто он наложен на чёрный. PNG всегда использует прямую альфу; многие программы рендеринга и видео внутри используют premultiplied.
Почему у моей вырезки белый или цветной контур?
Обычно в краевых пикселях всё ещё подмешан старый фон или изображение перед сохранением сгладили относительно белого. Большинство случаев решают очистка цветов края, мягкая маска и экспорт с полной альфой вместо цвета подложки.
Маска и альфа-канал: одно и то же?
В них одна и та же информация: значение серого для каждого пикселя, которое говорит, насколько он виден. Альфа-канал хранится внутри файла изображения; маска обычно представляет собой отдельное изображение в оттенках серого или слой-маску в редакторе.
Как узнать, действительно ли PNG прозрачный?
Положите его на тёмный и на светлый фон и проверьте, что фон просвечивает. Или запустите identify из ImageMagick с %[opaque] либо проверьте минимальное значение альфа-канала в Pillow; минимум 255 означает, что прозрачного ничего нет.
Попробуйте на своём изображении
Новые аккаунты получают 50 бесплатных кредитов. Один кредит за изображение, без подписки, кредиты не сгорают.
Удалить фонИсточники
- MDN: Alpha (alpha channel) glossary entry
- W3C: Portable Network Graphics (PNG) Specification (Third Edition)
- W3C: Compositing and Blending Level 1, simple alpha compositing
- MDN: Image file type and format guide
- Adobe Help: Select and Mask in Photoshop
- Adobe: Remove background with AI in Photoshop (layer masks)
- rembg README: color decontamination and edge modes
- ImageMagick: Format and print image properties (escapes)
- Pillow: Image module reference
- Etsy Help: Requirements and best practices for images in your Etsy shop