Что может привести к тому, что цветной значок приложения ma c будет отображаться в оттенках серого? - PullRequest
7 голосов
/ 28 марта 2020

Примечание: MCVE в конце

Я обновил значок AppIcon и Document для моего приложения ma c. Значки изменились, но они также отображаются в оттенках серого. Исходные файлы (PNG) окрашены. Значки внутри XCode выглядят цветными, но в контексте (значки AppIcon в доке и значки документов в Finder) отображаются в оттенках серого. Я пробовал очевидные вещи, такие как очистка папки сборки, перезапуск Xcode и перезапуск Finder, но я не знаю, что еще попробовать.

Вот как иконки выглядят в контексте:

Icon in the dock Icon on desktop

Так выглядят значки в Xcode:

Icon in Xcode

Все, что я сделал, это обновил некоторые PNG! Все по-прежнему работает правильно. Приложение по-прежнему запускается, и двойной щелчок по документу открывает приложение. Проблема в том, что значки серые.


В коммите git, который меняет значки, изменяются только некоторые PNG и несколько файлов документации (ссылка в README, скриншот и некоторые другие вещи). Если я проверяю коммит перед сменой иконок, все в порядке. Если я извлекаю коммит, который меняет иконки, они серые.

Я смотрю на сами PNG, чтобы попытаться выяснить это. Я использую pngcheck для проверки файлов.

Старый (рабочий) значок 16x16:

chunk IHDR at offset 0x0000c, length 13
  16 x 16 image, 32-bit RGB+alpha, non-interlaced
chunk bKGD at offset 0x00025, length 6
  red = 0x00ff, green = 0x00ff, blue = 0x00ff
chunk IDAT at offset 0x00037, length 142
  zlib: deflated, 2K window, maximum compression
  row filters (0 none, 1 sub, 2 up, 3 avg, 4 paeth):
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (16 out of 16)
chunk IEND at offset 0x000d1, length 0

Новый (сломанный) значок 16x16:

chunk IHDR at offset 0x0000c, length 13
  16 x 16 image, 32-bit RGB+alpha, non-interlaced
chunk IDAT at offset 0x00025, length 109
  zlib: deflated, 2K window, default compression
  row filters (0 none, 1 sub, 2 up, 3 avg, 4 paeth):
    0 1 1 1 2 2 4 1 1 4 2 2 1 1 0 0 (16 out of 16)
chunk IEND at offset 0x0009e, length 0

Хорошо, так что, возможно, требуется блок bKGD? Нет. Я пропустил изображение через gm convert (без аргументов), которое добавляет bKGD, а также меняет уровень сжатия, и оно по-прежнему отображается в оттенках серого.

Новый (сломанный) значок 16x16 после gm convert:

chunk IHDR at offset 0x0000c, length 13
  16 x 16 image, 32-bit RGB+alpha, non-interlaced
chunk bKGD at offset 0x00025, length 6
  red = 0x00ff, green = 0x00ff, blue = 0x00ff
chunk IDAT at offset 0x00037, length 106
  zlib: deflated, 2K window, maximum compression
  row filters (0 none, 1 sub, 2 up, 3 avg, 4 paeth):
    0 1 1 1 2 2 4 1 1 4 2 2 1 1 0 0 (16 out of 16)
chunk IEND at offset 0x000ad, length 0

Так что теперь похоже, что единственное различие между сломанными PNG и рабочими - это фильтры строк (и, конечно, сами данные изображения). ПОЧЕМУ НА ЗЕМЛЕ ЭТО ПРИЧИНА ПРОБЛЕМА ?! Я не знаю, как установить фильтры строк, используя только командную строку. Это вообще возможно сделать с libpng? Всякий раз, когда я использую libpng, я просто позволяю библиотеке выбирать фильтры. Должен ли я написать свой собственный png-кодировщик, чтобы решить эту проблему?

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


Я немного поигрался с этим и обнаружил, что значок 128@2x (а не значок 256!) - тот, который имеет значение. Замена этого изображения старым значком приводит к тому, что старый значок отображается в цвете. Замена этого изображения новым значком приводит к отображению нового значка в оттенках серого. Разница между этими двумя файлами PNG заключается в том, что является причиной проблемы. Это самая нелепая проблема, с которой я когда-либо сталкивался.

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

Старый (рабочий) 128x128@2x значок после анимеры:

chunk IHDR at offset 0x0000c, length 13
  256 x 256 image, 32-bit RGB+alpha, non-interlaced
chunk IDAT at offset 0x00025, length 965
  zlib: deflated, 32K window, default compression
  row filters (0 none, 1 sub, 2 up, 3 avg, 4 paeth):
    1 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
    2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2
    2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2
    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 2 2
    2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2
    2 2 2 4 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 4 2 2 2 2 2
    2 2 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
    2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
    1 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 (256 out of 256)
chunk IEND at offset 0x003f6, length 0

Новый (сломанный) 128x128@2x значок после анимеры:

chunk IHDR at offset 0x0000c, length 13
  256 x 256 image, 32-bit RGB+alpha, non-interlaced
chunk IDAT at offset 0x00025, length 830
  zlib: deflated, 32K window, default compression
  row filters (0 none, 1 sub, 2 up, 3 avg, 4 paeth):
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 2 2 2 2 2 2 2
    2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2
    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 2 2
    2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2
    2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 2 2 2 2
    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2
    2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 (256 out of 256)
chunk IEND at offset 0x0036f, length 0

Это смешно! Я начинаю задумываться, не нашел ли я очень странную ошибку в macOS.


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

Старый (рабочий) 128x128@2x значок после анимеры:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAADxUlEQVR4nO3dQW6kMBRAQRjl/ldmbgALx7KdV7XNIg7debL0DdzPdd3Xi/u6nrefA+f6t3oBwDoCAGECAGECAGECAGECAGECAAAAAAAAAAAAAAAAAAAAAAAbeX0nAOs9h7+X4fYd25onAkGYAECYAECYAECYAECYAECYAECYGe1kp8/xV3OOYC47AAgTAAgTAAgTAAgTAAgTAAgTAAgzYx1kzr+WcwJj7AAgTAAgTAAgTAAgTAAgTAAgTAAgzAz1gzn/2ZwTeGcHAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGH5e6Xd799Wf16AHQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCECQCE/axewHTP9axewpDj316//eX/WOB9/Cfwxg4AwgQAwgQAwgQAwgQAwgQAwgQAwvafcU6e428/pR41/An/7Ss0/x9g73MEdgAQJgAQJgAQJgAQJgAQJgAQJgAQtn5Gufn9+lsv7jfcf/svXP8F/7L2nIAdAIQJAIQJAIQJAIQJAIQJAIQJAITNn0FuPuf/cvTir+sa/gv2H6S/Onz51+xzAnYAECYAECYAECYAECYAECYAECYAEPazegG7+xrCnn9O4Gznz/nXsgOAMAGAMAGAMAGAMAGAMAGAMAGAsPEx6uH3+882/+IsvvyTB/Hm/F/GnhdgBwBhAgBhAgBhAgBhAgBhAgBhAgBhngcw2egc+/RDFub4e7MDgDABgDABgDABgDABgDABgDABgDDnADZnjs5MdgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQNv/188/1TP8dvBi8/PO/Iby6p34CdgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQtv5ub88LWOt2+deae7//FzsACBMACBMACBMACBMACBMACBMACFt/DuCLcwJj7tHP+HH9h6yd83+xA4AwAYAwAYAwAYAwAYAwAYAwAYCwrWeUv+L0cwTDc/zVTj9HsPccf5QdAIQJAIQJAIQJAIQJAIQJAIQJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvPgPQZExnSU6E9oAAAAASUVORK5CYII=

Новый (неработающий) 128x128@2x значок после анимеры:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAADPklEQVR4nO3cwZEDIQwAQbhy/injDO7DQ6amOwJ5dz3FR6wFAAAAAAAAAAAAAAAAAAAA/Jo9PUDdWetMzzBp+wZH/U0PAMwRAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAizi32pvs8/zX0Cd5wAIEwAIEwAIEwAIEwAIEwAIEwAIEwAIEwAIEwAIEwAIEwAIEwAIEwAIEwAICy/S22fv61+n4ATAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIQJAIR9pge4dtaZHmHUnh7g+cd/+QP2+Bu44QQAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYfO7zI/v8z89/Fpr7bd/wfwHfGv2PgEnAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAi730V+fJ9/2v3DG378l1/Q+/v80+7uE3ACgDABgDABgDABgDABgDABgDABgDABgDABgDABgDABgDABgDABgDABgDABgLDP9AB19uGZ5AQAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYQIAYXt6gHXWmR4hbXv8s/bof9AJAMIEAMIEAMIEAMIEAMIEAMIEAMIEAMIEAMIEAMIEAMIEAMIEAMIEAMIEAMLm7wO4Vb9PYE+/w9N+/sP7/LecACBMACBMACBMACBMACBMACBMACBMACBMACBMACBMACBMACBMACBMACBMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4B9fjX8anopwslQAAAAASUVORK5CYII=

Я действительно надеюсь, что кто-то сможет это выяснить!


Я создал MCVE для этой проблемы (на github ). Я создал новое приложение ma c. Все, что я сделал, это установил значок 128@2x, и я могу воспроизвести эту проблему. «Рабочий» значок цветной. Значок «неработающий» имеет серый цвет (см. URI данных из предыдущего раздела). Вы можете отредактировать имя файла в файле Contents.json (с последующей чистой сборкой) для переключения между ними. Кажется, я обнаружил ошибку в macOS! Хотя, если это ошибка, то, вероятно, она не будет исправлена ​​в Мохаве.


Я отправил отчет об ошибке в Apple. Я все еще хотел бы обходной путь для этого, поскольку я не смог найти тот.

1 Ответ

5 голосов
/ 05 апреля 2020

Проблема может быть воспроизведена на macOS Catalina с Xcode 11.3.1.

Сужение проблемы

Каталог активов (.xcassets) составлен Xcode в файл Asset.car.

Чтобы взглянуть на скомпилированный Asset.car и даже извлечь из него ресурс изображения, вам понадобится дополнительный инструмент, например Tinkerer каталога активов .

Установка этого инструмента может быть достигнута:

brew cask install asset-catalog-tinkerer 

С помощью инструмента изображение можно извлечь из Asset.car. Он называется 256_broken_Normal@2x.png и представляет собой изображение в градациях серого.

Это можно проверить визуально или с помощью вызова командной строки:

sips -g all 256_broken_Normal@2x.png    

Вывод инструмента:

/Users/stephan/tmp/256_broken_Normal@2x.png
  pixelWidth: 256
  pixelHeight: 256
  typeIdentifier: public.png
  format: png
  formatOptions: default
  dpiWidth: 72.000
  dpiHeight: 72.000
  samplesPerPixel: 2
  bitsPerSample: 8
  hasAlpha: yes
  space: Gray
  profile: Generic Gray Gamma 2.2 Profile

Итак, вы можете видеть, что это уже не RGBA32, а полутоновое изображение с альфа-каналом (см. SamplesPerPixel, hasAlpha и свойства цветового пространства).

Первый результат

Так что, вероятно, это не ошибка в macOS, а создание файла Asset.car.

Анализ содержимого I

Интересно, что вы можете Не устраните проблему, удалив и повторно добавив цветовые профили, ни загрузив изображение в процессор изображений и переписав его.

Так что же это могут быть значения содержимого пикселя изображения?

Следующая попытка: изменить один пиксель в красной области программного обеспечения для редактирования изображений с # 0xff0000ff на # 0xff0100ff. Таким образом, это изменение, которое человеческий глаз не должен видеть визуально, но в этом случае вы можете видеть его: изображение больше не в оттенках серого, а в цвете.

Давайте проанализируем цвета дальше и поинтереснее: каждое значение в 4 каналах имеет значение 0x00 или 0xff, что дает 16 различных комбинаций.

Создать случайное изображение

Звучит как отведение. Итак, следующая попытка: создайте небольшую программу, которая случайным образом использует один из 8 возможных непрозрачных цветов (все комбинации 0x00 или 0xff на канал rgb, alpha = 0xff).

Результатом является цветное изображение.

Анализ содержимого II

Давайте еще раз посмотрим на картинку. Может быть, цвета распределяются равномерно?

Теперь давайте проанализируем с помощью небольшой программы, которая подсчитывает, как часто встречаются значения RGBA 0xff, результат:

   R     G      B      A
212992 212992 212992 540672

Это действительно тот случай, когда R, G и B с значение 0xff встречается в одном и том же числе.

Гипотеза

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

И действительно, с этим изображением мы видим изображение в градациях серого в Dock и в App Switcher, видим на скриншоте ресурсы в фоновом режиме и значок приложения в градациях серого при использовании App Switcher через CMD + TAB на переднем плане.

stripe pattern

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

semi-random image

Test

Всякий раз, когда вы меняете изображение, первое, что вам нужно сделать в XCode, это (Shift-CMD-К).

Если вы хотите проверить это самостоятельно, вот изображения:

https://www.software7.biz/iertzzlmbkjdkjrk/256_randomWorking.png (рабочий -> цвет) https://www.software7.biz/iertzzlmbkjdkjrk/256_brokenStripes.png (ломаная -> шкала серого) https://www.software7.biz/iertzzlmbkjdkjrk/256_semiRandomBroken.png (боркен -> шкала серого)

Сводка

Так что, похоже, ошибка в macOS, но во время компиляции / оптимизации ресурсов в файл Asset.car. Кажется, это происходит, когда число значений R, G, B, равное 0xff, одинаково. Могут быть и другие случаи.

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

...