Каждый пиксель изображения может находиться только в двух состояниях: прозрачный цвет и непрозрачный

Обновлено: 21.11.2024

У меня есть несколько изображений PNG с прозрачностью, и мне нужно создать версии со слоем изображения, наложенным на белый фон. Я пробовал разные вещи с операциями «конвертирования» Image Magick, но либо вообще ничего не происходит, либо я получаю сообщение об ошибке. Я не хочу переходить к промежуточной форме JPG, потому что мне не нужны артефакты. Конечно, это легко сделать в Gimp или Photoshop или где-то еще, но я бы предпочел написать сценарий из командной строки, потому что таких вещей много.

Пример неработающей команды Image Magick:

Это приводит к ошибке.

В моем конкретном случае слой прозрачности в PNG конфликтовал при прохождении процессора (Apache) FO для создания PDF/A. PDF/A не допускает прозрачности. Хитрость, которую я использовал, заключается в том, чтобы вместо этого обратиться к JPG.

Эта команда должна работать нормально. Если это не так, возможно, у вас возникла ошибка при установке Imagemagick или libpng, или ваши версии слишком устарели. Какая у вас версия Imagemagick и libpng?

16 ответов 16

Пример:

Вы можете заменить белый на любой другой цвет. В документации Imagemagick говорится об операции удаления -alpha:

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

Полученное изображение по-прежнему будет иметь альфа-канал. Он будет пуст, но все равно будет там. Чтобы полностью удалить канал, добавьте -alpha off .

Это работает для меня:

Ссылки на документацию:

Оказывается, мне также нужно установить -background в белый цвет. Мне также пришлось загрузить файл colors.xml, который отсутствовал.

Выровнять изображение и применить фоновое изображение в ImageMagick очень просто

Однако порядок команд очень важен

Чтобы применить любой фон к прозрачному изображению и свести его, сначала нанесите фон, а затем сведите его. Обратное не работает.

Единственный, который сработал для меня, это сочетание всех ответов:

вот как заменить одно и то же изображение во всех папках каталога mogrify -background white -flatten */*.jpg

вот как заменить одно и то же изображение во всех папках каталога белым вместо прозрачного:

mogrify -фон белый -flatten */*.jpg

Использование -flatten привело меня в бешенство, потому что -flatten в сочетании с mogrify кадрированием и изменением размера просто не работает. Официальный и единственно правильный для меня способ - "удалить" альфа-канал.

-alpha remove -alpha off (не требуется для JPG)

Это единственное решение из вышеперечисленного, которое сработало для меня. Теперь магазин iTunes доволен моим изображением.

В разделе Alpha Remove Руководства по использованию ImageMagick предлагается использовать параметр -alpha remove, например:

<р>. используя цвет фона по вашему выбору.

В руководстве говорится:

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

Дополнительно добавляет примечание:

Обратите внимание, что несмотря на то, что прозрачность удалена, альфа-канал останется включенным, но теперь он будет полностью непрозрачным. Если вам больше не нужен альфа-канал, вы можете отключить его с помощью команды Alpha Off.

Таким образом, если вам не нужен альфа-канал, вы можете уменьшить размер выходного изображения, добавив параметр -alpha off, например:

Более подробная информация о других часто используемых методах удаления прозрачности описана в разделе "Удаление прозрачности с изображений".

В этот раздел включено важное предостережение относительно использования -flatten как метода удаления прозрачности:

Однако это не будет работать с "mogrify" или с последовательностью нескольких изображений, в основном потому, что оператор "-flatten" действительно предназначен для объединения нескольких изображений в одно изображение.

Когда вы вставляете изображение в презентацию Microsoft PowerPoint и используете инструмент «Установить прозрачный цвет», чтобы сделать фон изображения прозрачным, вокруг изображения на переднем плане может появиться тонкая рваная рамка, как если бы цвет изображение на переднем плане слегка переходит на задний план.

Причина

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

Поскольку инструмент "Установить прозрачный цвет" может рассматривать только один цвет как прозрачный, эти граничные (или граничные) пиксели, которые кажутся того же цвета, что и фон, не становятся прозрачными.

Это также может произойти, если фоновый цвет на самом деле не один цвет, а смесь двух или более цветов.

Временное решение

Чтобы обойти эту проблему, используйте графическую программу, например Microsoft PhotoDraw, чтобы сохранить изображение в формате, специально предназначенном для использования в презентации Microsoft PowerPoint. PhotoDraw использует формат Portable Network Graphics (PNG), но другие подобные программы могут иметь другие параметры, позволяющие вам устанавливать свойства прозрачности при создании или редактировании изображения.

Однако, если вы используете растровое изображение Windows, необходимо установить прозрачность фона вручную, прежде чем сохранять изображение в формате, подходящем для использования в презентации PowerPoint.

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

Чтобы использовать PhotoDraw для сохранения изображения для использования в презентации PowerPoint, выполните следующие действия:

Запустите PhotoDraw и откройте изображение, которое хотите использовать в презентации PowerPoint.

В меню "Файл" выберите "Сохранить для использования в".

На первом шаге мастера нажмите В презентации Microsoft PowerPoint или аналогичной слайдовой презентации, а затем нажмите Сохранить.

В диалоговом окне "Сохранить как" назовите изображение и нажмите "Сохранить".

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

Статус

Microsoft подтвердила, что это проблема продуктов Microsoft, перечисленных в начале этой статьи.

Части изображения можно сделать прозрачными, включив четвертый выходной канал, также известный как канал альфа. Значение 0 делает пиксель полностью прозрачным, а максимальное значение делает его полностью непрозрачным (непрозрачным).

Примечание: максимальное значение зависит от sampleType, как описано выше: 1 в случае AUTO или FLOAT32, 255 в случае UINT8 и 65535 в случае UINT16.

Альтернативный подход к маркировке пикселей — использование цвета фона или сочетание прозрачности и цвета фона. Обратите внимание, что формат JPEG не поддерживает альфа-канал, поэтому для вывода JPEG можно использовать только цвет фона.

Прозрачные пиксели без данных

Во многих коллекциях пиксели без данных отмечены значением 0 в dataMask . Таким образом, мы можем просто использовать эту полосу как четвертый канал в функции AssessmentPixel(samples, scenes), чтобы возвращать пиксели без данных как прозрачные. В input:bands нужно добавить бэнд dataMask и вывести четыре бэнда в output:bands функции setup() . В следующем примере использовался Sentinel-2 L2A, возвращающий изображение в истинном цвете.

Прозрачные пиксели данных

Чтобы использовать какое-либо другое условие для прозрачности пикселей, просто верните условие в четвертом канале, а также выведите четыре полосы в функции setup() . В приведенном ниже примере мы возвращаем индекс Sentinel-2 L1C NDVI больше 0,6 как прозрачный. Мы также оставляем пиксели без данных непрозрачными, поэтому нам не нужно использовать полосу ввода dataMask.

Прозрачность с другими типами SampleType

Для типов выборки, отличных от AUTO и FLOAT32, необходимо масштабировать и четвертый канал. Приведенный выше пример при использовании UINT8 будет таким:

И пиксели данных, и пиксели без данных прозрачны

В следующем примере мы вернули пиксели OLCI Sentinel-3 со значениями индекса OTCI больше 1 как прозрачные, что сделало прозрачными большинство морских пикселей. Кроме того, мы также умножили условие для прозрачных пикселей с данными в четвертом канале с помощью dataMask , что также сделало прозрачными значения без данных.

Цвет фона для пикселей без данных

Чтобы отобразить пиксели без данных в качестве выбранного цвета фона вместо прозрачного, AssessmentPixel просто возвращает цвет фона, если условие выполнено. В этом примере мы используем Sentinel-1, создавая выход RGB VV, VH * 5, VH * 5 , но возвращая пиксели без данных как синие.

Цвет фона для пикселей без данных с прозрачностью для пикселей с данными

В этом примере мы хотим вернуть пиксели без данных как серые, а пиксели поляризации VH Sentinel-1 ниже 0,01 как прозрачные. Для этого настраиваем условие возврата серого цвета, если dataMask равно 0, а для пикселей с данными возвращаем условие прозрачности в четвертом канале.Поскольку мы производим четырехполосный вывод, серый цвет, возвращаемый для пикселей без данных, также должен иметь четыре канала, а значение четвертого канала должно быть равно 1.

Переключение между прозрачностью и цветом фона с несколькими условиями

Простой способ контролировать, какие части являются прозрачными, — использовать либо 1 (непрозрачный), либо 0 (прозрачный) в четвертом канале. В приведенном ниже примере с использованием Landsat 8 мы разделили оценку пикселей на 3 части: первое выражение «если» включает все пиксели с индексом NDMI > 0,5, второе выражение «если» включает пиксели без данных (со значением 0 в бэнде dataMask). Окончательный результат дает полосы истинного цвета для всех остальных пикселей. В настоящее время все они имеют 1 в четвертом канале, что делает их видимыми.

Мы можем мгновенно сделать любой из них прозрачным, изменив 1 в четвертом канале на 0. В приведенном ниже примере мы оставили NDMI > 0,5 пикселей синим, а пиксели без данных — серыми, а все остальные пиксели вернули прозрачным. , просто изменив четвертый канал на 0.

Прозрачность коммерческих данных Planet

Прозрачность можно использовать со всеми доступными коллекциями EO, включая коммерческие данные Planet и Pleiades. Значения планет необходимо масштабировать, чтобы преобразовать их в значения отражательной способности (нам не нужно преобразовывать пиксели без данных). Чтобы узнать больше, посетите нашу документацию на Planet.

Сочетание прозрачности и sampleType для коммерческих спутников

В этом примере Pleiades показано, как обрабатывать коммерческие данные с прозрачностью и пользовательскими форматами sampleType. Во-первых, данные Pleiades требуют, чтобы мы разделили значения на коэффициент масштабирования, чтобы привести их к значениям отражательной способности. Чтобы узнать больше, посетите нашу документацию Pleiades. Обратите внимание, что пиксели без данных не нуждаются в таком масштабировании. Чтобы вернуть изображение в формате UINT16, нам нужно дополнительно умножить значения на 65535, чтобы привести их к 16-битному диапазону, и это также относится к значениям без данных. Узнайте больше о форматах и ​​преобразованиях sampleType здесь.

Несколько месяцев назад мы с Кеном представили объединенную группу пользователей Tableau из Австралии и Новой Зеландии. Во время этой презентации я привел кучу примеров того, как я использую прозрачные фигуры в каждой создаваемой визуализации. каждый! (Я не могу начать рассказывать вам, насколько это удобно — посмотрите мой пост в блоге «Прозрачные фигуры» для получения дополнительной информации). Во время этой презентации в окне чата было много разговоров (это была замечательная группа), и пока я говорил о прозрачных фигурах, Фи Гордон упомянул прозрачный шестнадцатеричный код. Какой. Это, конечно же, заинтересовало нас с Кеном, и мы начали копаться.

Проведя некоторые исследования, я узнал, что прозрачный шестнадцатеричный код на самом деле довольно распространен в таких инструментах дизайна, как Illustrator. На самом деле вы можете применить цвет шестнадцатеричного кода, который является прозрачным. Шестнадцатеричный код для прозрачного белого (не то, чтобы цвет имел значение, когда он полностью прозрачен) состоит из двух нулей, за которыми следует шестнадцатеричный код белого FFFFFF или 00FFFFFF. Честно говоря, я попробовал это в Illustrator (в котором я не эксперт) и не смог заставить его работать. Однако насколько я понимаю, существуют дополнительные уровни прозрачности, так как вы можете установить для них прозрачность 10 %, 20 %, 30 % и т. д., и каждый уровень имеет собственный шестнадцатеричный код.

ДОСТУП К НИМ В TABLEAU

Стремясь узнать больше, я сразу же зашел в Tableau, открыл палитру цветов и начал вводить код в поле шестнадцатеричного кода. К сожалению, это остановило меня на 6 символах. потому что это шестнадцатеричные коды, а не восьмеричные!

Хорошо, мы говорили о том, что через файл настроек можно добавить прозрачный цвет в Tableau, но как мы можем его использовать? Как это может нам помочь? В конце концов, если мы хотим, чтобы что-то было прозрачным, почему бы нам просто не использовать ползунок «Непрозрачность» в таблице цветов?

Это действительно отличный вопрос, и он в значительной степени сводится к следующему. Что, если бы у вас было два типа меток на одной диаграмме и вы хотели бы, чтобы одна метка была со 100%-ной непрозрачностью (нулевой прозрачностью) красного цвета, а другая — с 0%-ной непрозрачностью (100%-ная прозрачность), как бы вы это сделали? Ну, я знаю один способ! Шестнадцатеричный код прозрачного цвета!

Итак, мы поговорили о предыстории и концептуально о том, что он может делать, как насчет того, чтобы разобрать пару вариантов использования.(Правда в том, что я не думаю, что даже коснулся поверхности его потенциала, и я очень рад видеть, что придумает это удивительное сообщество). Если вы хотите продолжить или просто использовать в качестве справочного материала, все следующие варианты использования можно найти в моей рабочей книге «Введение в шестнадцатеричный код прозрачного цвета в Tableau» на Tableau Public.

Выше я упомянул свой пост в блоге с прозрачными фигурами. Правда в том, что шестнадцатеричный код прозрачного цвета часто можно использовать в качестве замены прозрачной формы. (Я должен упомянуть, что некоторые из этих проблем могут быть решены с помощью «скрыть», как показывает Кен в своем видео TUG для Австралии/Новой Зеландии на 22:20. Обратите внимание, что если вы скроете метку, вы не сможете взаимодействовать с ней, вот почему Я предпочитаю прозрачную форму или цвет скрытым меткам).

Несмотря на то, что следующего нет в сообщении блога о прозрачных фигурах, его версия обсуждается в презентации, которую я провел относительно прозрачной формы. (Вы можете проверить это в нашем видео TUG Австралии/Новой Зеландии на 51:25. Раздел о прозрачных формах в целом начинается на 45:27). Представьте, что у нас есть диаграмма с двумя осями (линия и круги), на которой показаны продажи по месяцам.

Однако мы предполагаем, что наша работа связана с Хэллоуином, и мы хотим выделить октябрьские распродажи, например:

Я думаю, что большинство людей создали бы расчет, который определяет, равен ли месяц на диаграмме октябрю, и если это так, то получают продажи (обратите внимание, что всем моим расчетам предшествует символ @):

// Если октябрь, то доходность продаж

IF DATEPART('месяц', [Дата заказа]) = 10

Затем вы замените одну из таблеток на полке строк этим расчетом.

Но правда в том, что вам не нужно заменять одну из двухосевых таблеток на новую, и вам вообще не нужно записывать этот расчет! Давайте сначала сделаем это с прозрачной формой.

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

Это будет работать точно так же с прозрачным цветом, но на один шаг меньше. Оставьте отметку в виде круга, как это было раньше, переместите дату заказа на карточку цвета. Измените дату заказа, чтобы отразить месяц (без года). Затем просто измените цвет October на синий, а все остальное на прозрачный цвет. Ваш результат выглядит следующим образом и будет динамическим.

Ранее в этом году я поделился своим Datafam Finder. Datafam Finder позволял людям в сообществе Tableau регистрировать свое имя и общее местоположение. Затем они появятся в виде отметки на карте мира. На сегодняшний день более 400 человек зарегистрировались по всему миру. Цель Datafam Finder состояла в том, чтобы позволить людям находить других в выбранной области. Например, предположим, что я еду в командировку в Феникс, штат Аризона. Я мог бы установить радиус, скажем, 200 км, щелкнуть на Фениксе или рядом с ним на карте, он нарисовал бы буферный круг и перечислил бы всех в пределах 200 км от того места, где я щелкнул.

Большой трюк в том, что я настроил его так, чтобы вы могли буквально щелкнуть В ЛЮБОМ МЕСТЕ на карте, чтобы выбрать это место. Как это работает? Предположим, у вас есть набор данных, включающий двух клиентов, одного из Чикаго, штат Иллинойс, США, и одного из Токио, Япония. Это означает, что есть две метки, и я могу нажать на любую из них. Но что, если я нажму на Лондон, Англия? Что случилось бы? Ну, абсолютно ничего бы не случилось, потому что нет ни отметки, ни данных, связанных с Лондоном, Англия. Но в Datafam Finder вы можете абсолютно точно щелкнуть Лондон, Англию или любое другое место в этом отношении. Как я это сделал? Ну, я нашел список всех городов мира, загрузил его в таблицу Google, а затем, по сути, объединил его со списком людей, которые зарегистрировались. Так что теперь у каждого города мира всегда есть отметка.

Но я не хотел, чтобы отображались все города, иначе вы не сможете увидеть, где фактически находятся более 400 зарегистрировавшихся, как показано ниже:

Я решил эту проблему, используя прозрачную форму. ну, около 26 000 прозрачных форм.Я просто создал вычисление, которое определило, кто является регистрантом, а что городом из таблицы Google. Я поместил этот расчет на карту формы, а затем применил прозрачную форму к городам из листа Google (которую я назвал «Прозрачной» в расчете).

Я говорю все это, потому что мы можем использовать прозрачный цвет для той же цели. (Опять же, вы можете проверить мою рабочую книгу «Прозрачный цвет» на Tableau Public, если хотите следовать за ней).

Чтобы продолжить, загрузите оригинальную версию Datafam Finder. Перейдите к карте, перейдите к оси формы, щелкните значок рядом с «Изменить форму выделения» и измените его на «Цвет» (а не «Форма»), как показано ниже. Мы должны сделать это таким образом, потому что уже есть другая таблетка от цвета. Сделав это таким образом, мы получим две пилюли цвета — по сути, комбинацию двух из них.

Теперь просто обновите цвета. Мы хотим, чтобы город, по которому щелкнули, был черным, как и любой другой зарегистрированный город в пределах выбранного расстояния. Мы хотим, чтобы все остальные зарегистрированные пользователи отображались красным цветом. И тогда все, что указано как «прозрачное», является городом, который был из листа Google и не выбран. Это должен быть прозрачный цвет.

Несколько недель назад я поделился визуализацией под названием "О, куда мы пошли". Он был вдохновлен моей невесткой, у которой в гостиной висит деревянная карта, на которой она нарисовала каждый штат США, который они посетили всей семьей. Поэтому мне, конечно же, пришлось построить его в Tableau. Я решил сделать это индивидуально для каждого члена семьи, а также всей нашей семьи вместе взятых. Первоначально я просто показывал штаты, которые мы посетили, одним цветом, а штаты, которые мы не посещали, другим цветом. но это было скучно. Мне пришла в голову идея показать реальное изображение члена семьи, стоящего за ним, и этот человек как бы раскрывался по мере посещения большего количества штатов. (Создание изображения потребовало немного графической работы. Я создал карту США, используя альтернативный шейп-файл проекции — тот же, который я использовал бы для своей карты, я экспортировал его как изображение, я сделал его центр прозрачным, а внешнюю часть он белый, я наложил его на фотографию, затем немного обрезал, чтобы в итоге фотографии выглядели так). Затем эти изображения будут размещены за каждой картой:

Именно в этот момент я понял, что у меня проблема. Я намеревался наложить реальную карту, показывающую места, где мы были (в приведенном выше случае, места, где была моя дочь Эддисон). Я хотел, чтобы все было полупрозрачно, чтобы вы могли видеть ее во всех тогдашних состояниях, но я хотел, чтобы состояния, в которых она была, были полностью прозрачными. Я хотел, чтобы они открыли карту. Ну, как, черт возьми, я мог дать некоторым состояниям непрозрачность 80%, а другим состояниям 0% непрозрачность? Непрозрачность нельзя контролировать с помощью вычислений.

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

И тут меня осенило! Прозрачный цвет подойдет идеально! Все, что я сделал, это применил белый цвет (с непрозрачностью 75/%) к непосещенным состояниям и полностью прозрачный цвет к состояниям, которые она посетила. Это было просто, и результат был ТОЧНО, что я хотел. и всего на одном листе. Опять же, вы можете проверить окончательную визуализацию здесь .

Хорошо, теперь мой любимый пример из всех. Когда в версии 2019.2 были выпущены действия с параметрами, я создал кучу примеров в своем блоге «Игра с действиями с параметрами». Одним из таких примеров была скользящая опорная линия. Это была двухосевая линейная диаграмма / диаграмма с областями, где действие параметра вводило дату в параметр. При расчете этот параметр сравнивался с фактической датой в визуализации и окрашивал диаграмму с областями в синий цвет, если он был до даты, и в серый, если он был после даты (см. номер 8 в этом сообщении в блоге для полной сборки). Ниже приведен оригинальный GIF-файл, показанный в этом сообщении блога.

Размышляя о прозрачном шестнадцатеричном цвете, я понял, что это можно сделать немного по-другому. Мы могли бы заменить серый цвет на полностью прозрачный цвет, обеспечивающий действительно чистый и четкий дизайн (который также мог бы показать что-либо за ним, если это необходимо). Используя диаграмму в приведенном выше примере, по существу замените серый цвет прозрачным шестнадцатеричным кодом цвета, и все! Он показан ниже на несколько иной диаграмме, но он был построен с использованием тех же общих шагов. Я просто обожаю это!

И это все мои примеры, но с тех пор, как я написал этот пост в блоге, я использовал этот трюк по крайней мере дюжину раз, в том числе в моей недавней а именно Mario Kart (чтобы изменить шаблон coxcomb Кена для транспортных средств, шин, и планеры)! Как я упоминал выше, многие варианты использования из моего поста в блоге «Прозрачные фигуры» также могут быть реализованы с использованием прозрачного цвета. Но в целом я думаю, что возможностей для этого трюка гораздо больше. Я очень рад видеть все различные варианты использования, которые предлагает это замечательное сообщество. Я уверен, вы взорвете людям мозги!

Прежде чем мы пойдем. ОГРОМНОЕ спасибо Fi Gordon, которая рассказала нам об этом в первую очередь. Спасибо, Фи.

Спасибо за чтение!


Кевин Флерлаге, 10 января 2022 г.

Представление шестнадцатеричного кода прозрачного цвета в Tableau. Отзыв Кевина Флерлаге от 10 января 2022 г. Рейтинг: 5

Читайте также: