Итак, я столкнулся со странной проблемой, связанной с тем, как Xcode создает Assets.car в приложении для iOS.Кажется, что процесс сборки добавляет заголовки к каждому PNG, чтобы указать цветовое пространство.У меня есть пример PNG, хранящийся в градациях серого, который составляет 4 байта данных (PNG составляет 68 байтов), но сгенерированный PNG в Assets.car составляет 3395 байтов.Что именно здесь происходит?Ну, pngcheck рассказывает историю:
pngcheck -v test_Normal.png
File: test_Normal.png (3395 bytes)
chunk IHDR at offset 0x0000c, length 13
4 x 1 image, 8-bit grayscale, non-interlaced
chunk iCCP at offset 0x00025, length 3315
profile name = kCGColorSpaceGenericGrayGamma2_2
compression method = 0 (deflate), compressed profile = 3281 bytes
chunk IDAT at offset 0x00d24, length 11
zlib: deflated, 256-byte window, superfast compression
chunk IEND at offset 0x00d3b, length 0
Сравните это с исходным PNG:
pngcheck -v test.png
File: test.png (68 bytes)
chunk IHDR at offset 0x0000c, length 13
4 x 1 image, 8-bit grayscale, non-interlaced
chunk IDAT at offset 0x00025, length 11
zlib: deflated, 256-byte window, fast compression
chunk IEND at offset 0x0003c, length 0
Этот фрагмент PNG iCCP, похоже, соответствует следующему файлу после сжатия zlib.
'/System/Library/ColorSync/Profiles/Generic Gray Gamma 2.2 Profile.icc'
Нет ли способа отключить эту автоматическую модификацию PNG, когда изображения записываются в автомобильный файл?С большим количеством небольших изображений PNG это приведет к увеличению размера установленного приложения.
Я провел дополнительное тестирование 24-битных данных пикселей BPP sRGB, и, хотя в это трудно поверить, процесс кодирования PNG в каталоге активов Apple фактическитихо изменяя входные данные PNG, чтобы они больше не были без потерь.Вот пример изображения
, которое соответствует следующим шестнадцатеричным данным:
0x020100 0x050403 0x080706 0x0B0A09
0x0E0D0C 0x00000F 0x000000 0x000000
0x000000 0x000000 0x000000 0x000000
0x000000 0x000000 0x000000 0x000000
С этими данными изображения все в порядке, пока вы не поместите их в каталог ресурсов, процесс сборки xcodeизменяет данные пикселя PNG следующим образом:
0x020100 0x050403 0x080706 0x0B0A09
0x0E0D0C 0x00010E 0x000000 0x000000
0x000000 0x000000 0x000000 0x000000
0x000000 0x000000 0x000000 0x000000
Обратите внимание, как пиксель в (1,1) был изменен с 0x00000F -> 0x00010E в процессе создания каталога активов.