Как исправить странные свойства IHDR с помощью Python Wand? - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь создать файл PNG RGBA, формат которого совместим с программным обеспечением RIP, которое я использую.Проблема в том, что ему не нравятся данные о прозрачности, сгенерированные Wand.У меня есть файл примера, который нравится ПО RIP.Я использовал команду Imagemagick «Identify -verbose», чтобы проверить свойства файла с исправной версией.Я обнаружил, что, хотя многие другие свойства соответствуют моему файлу, свойства IHDR сильно отличаются.В файле, который загружается правильно, я вижу:

png:IHDR.bit-depth-orig: 8
png:IHDR.bit_depth: 8
png:IHDR.color-type-orig: 6
png:IHDR.color_type: 6 (RGBA)

Это файл примера, который загружается правильно (в Chrome прозрачный фон выглядит черным)

Когда я проверяюсвойства файла, сгенерированного с помощью Wand, я вижу:

png:IHDR.bit-depth-orig: 4
png:IHDR.bit_depth: 4
png:IHDR.color-type-orig: 3
png:IHDR.color_type: 3 (Indexed)
png:PLTE.number_colors: 8

Это файл примера, который НЕВОЗМОЖНО загрузить правильно (в Chrome прозрачный фон выглядит черным)

Я использую:

ImageMagick 7.0.8-12 Q16 x86_64 2018-10-23
Wand==0.4.4

Код для рисования этого файла создает три цветных прямоугольника на прозрачном фоне для тестового шаблона принтера.Вот это:

from wand.image import Image
from wand.color import Color
from wand.drawing import Drawing

depth   = 32
max_dpi = 300
width   = 600
height  = 600

big_square_color    = Color('blue') #Color('transparent')
med_square_color    = Color('red')
small_square_color  = Color('green')
background_color    = Color('transparent')

# with Image(width=width, height=height, resolution=max_dpi, depth=depth, background=background_color) as source_img:
with Image(width=width, height=height, resolution=max_dpi, background=background_color) as source_img:
    source_img.depth  = 8
    with Drawing() as draw:

        # Draw a big box in the middle
        draw.stroke_color = draw.fill_color = big_square_color
        draw.rectangle(left=(width/16), top=(height/16), right=width-(width/16), bottom=height-(height/16))

        # Draw a smaller box in the middle
        draw.stroke_color = draw.fill_color = med_square_color
        draw.rectangle(left=(width/8), top=(height/8), right=width-(width/8), bottom=height-(height/8))

        # Draw the smallest box in the middle
        draw.stroke_color = draw.fill_color = small_square_color
        draw.rectangle(left=(width/4), top=(height/4), right=width-(width/4), bottom=height-(height/4))

        draw(source_img)

    source_img.format   = 'png'
    source_img.units    = 'pixelspercentimeter'
    source_img.colorspace  = 'srgb'
    source_img.type     = 'truecolor'
    source_img.alpha_channel = True

    source_img.save(filename='output.png')

Просматривая документацию для Imagemagick и Wand, я не вижу способа форсировать значения IHDR.Кто-нибудь знает способ изменить свойства объекта Wand.Image, чтобы получить IHDR.color_type: 6 и png: IHDR.bit_depth: 8?

1 Ответ

0 голосов
/ 29 ноября 2018

Комментарии Марка верны.PNG-кодировщик не считает, что данных изображения достаточно для обоснования типа цвета RBGA, поэтому он оптимизировал изображение с цветовой палитрой INDEXED.Префикс протокола PNG32: к имени файла исходящего файла или настройка source_img.format = 'PNG32' должны работать.

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

Энтони Документы по использованию покрывают это, но читают больше в комментарии "Кстати" . документация Wand недавно начала намекать на протоколы делегатов, но я согласен, что это могло бы также использовать более подробную информацию / освещение этой темы.Ни один документ не привлекает большого внимания к IHDR (заголовок изображения), так что, возможно, это не лучший ключевой термин для поиска.

...