Как ImageMagic решает цветные карты?

Недавно я обновился до версии 6.9.9-3 и обнаружил некоторое непоследовательное поведение. Вот два, казалось бы, похожих изображения:

image1.png

введите описание изображения здесь

image2.png

введите описание изображения здесь

Давайте посмотрим, что IM думает о своих цветовых пространствах:

[grochmal@phoenix]$ identify * image1.png PNG 95x74 95x74+0+0 8-bit sRGB 1230B 0.000u 0:00.000 image2.png PNG 69x102 69x102+0+0 8-bit sRGB 2040B 0.000u 0:00.000 [grochmal@phoenix]$ identify -verbose image1.png | grep -A 2 Color Colorspace: sRGB Depth: 8-bit Channel depth: -- Colors: 96 Histogram: 1357: (217,217,217,255) #D9D9D9FF grey85 [grochmal@phoenix]$ identify -verbose image2.png | grep -A 2 Color Colorspace: sRGB Depth: 8-bit Channel depth: -- Colors: 188 Histogram: 1: ( 26, 26, 26,255) #1A1A1AFF graya(26,1) 

Оба имеют менее 255 цветов (необходимо для оттенков серого), поэтому давайте попробуем их convert в JPEG:

 [grochmal@phoenix]$ convert image1.png -strip -quality 80 image1.jpg [grochmal@phoenix]$ convert image2.png -strip -quality 80 image2.jpg 

Хорошо, никаких ошибок. Но одно из изображений теперь находится в оттенках серого, а другое – в sRGB, более того, IM добавил цветовую рамку для изображений:

 [grochmal@phoenix]$ identify -verbose image1.jpg | grep -A 2 Color Colorspace: sRGB Depth: 8-bit Channel depth: -- Colors: 37 Histogram: 1520: (217,217,217) #D9D9D9 gray(217) [grochmal@phoenix]$ identify -verbose image2.jpg | grep -A 2 Color Colorspace: Gray Depth: 8-bit Channel depth: -- Colors: 195 Histogram: 1: ( 14, 14, 14) #0E0E0E gray(14) -- Colormap entries: 256 Colormap: 0: ( 0, 0, 0) #000000 gray(0) 1: ( 1, 1, 1) #010101 gray(1) [grochmal@phoenix]$ identify * image1.jpg JPEG 95x74 95x74+0+0 8-bit sRGB 397B 0.000u 0:00.000 image1.png PNG 95x74 95x74+0+0 8-bit sRGB 1230B 0.000u 0:00.000 image2.jpg JPEG 69x102 69x102+0+0 8-bit Gray 256c 687B 0.000u 0:00.000 image2.png PNG 69x102 69x102+0+0 8-bit sRGB 2040B 0.000u 0:00.000 

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

  1. Как IM выполняет решения (1) изменение цветового пространства изображения во время конвертирования и (2) решение добавить цветную карту?

  2. Как заставить IM выполнять более последовательное поведение (желательно, не добавляя colourmaps ко всему)?

  3. Могу ли я принудительно удалить цветную карту? (Я пробую в течение 5 часов без успеха.)

One Solution collect form web for “Как ImageMagic решает цветные карты?”

Спасибо @ WumpusQ.Wumbley за то, что указали мне в правильном направлении.

TL; DR: Используйте -type -type TrueColor для удаления цветовых карт, либо из типов палитр изображений PseudoClass.

Colourmap не является PseudoClass

Читая форумы IM, я наконец (более или менее) понял, что такое изображение в изображении и как справиться с ним. Прежде всего, существует разница между DirectClass и PseudoClass :

  • DirectClass сохраняет значения цвета для каждого пикселя.
  • PseudoClass использует таблицу цветов, а затем сохраняет смещения в этой таблице.

Это стало причиной моей путаницы: PseudoClass не является colourmap , они разные. И поскольку IM почти всегда конвертирует изображение PseudoClass в изображение DirectClass, я был озадачен.

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

source (PS DirectClass и PseudoClass являются синонимами DirectColor и PseudoColor)

Итак, что такое Colourmap?

Цветовая палитра – это указатель цветов на палитру, которая хранится на изображении. Это очень похоже на PseudoClass, так как это также таблица цветов, разница в том, что PseudoClass будет включать только цвета, присутствующие в изображении, а цветовая палитра будет включать все цвета в палитру. Обратите внимание, что PseudoClass будет иметь раздел colourmap, но это будет таблица цветов PseudoClass, а не тип палитры (да, это очень запутанно на стороне IM).

Colourmap определяется опцией -type для IM:

 -type type the image type. Choose from: Bilevel, Grayscale, GrayscaleMatte, Palette, PaletteMatte, TrueColor, TrueColorMatte, ColorSeparation, or ColorSeparationMatte. Normally, when a format supports different subformats such as grayscale and truecolor, the encoder will try to choose an efficient subformat. The -type option can be used to override this behavior. For example, to prevent a JPEG from being written in grayscale format even though only gray pixels are present, use. convert bird.png -type TrueColor bird.jpg Similarly, use -type TrueColorMatte to force the encoder to write an alpha channel even though the image is opaque, if the output format supports transparency. Use -type optimize to ensure the image is written in the smallest possible file size. 

Обратите внимание, что этот тип отличается от цвета . Большинство изображений будут иметь аналогичный тип colourspace , например Type: Grayscale и Colorspace: Gray , но это не обязательно. Изображение (в вопросе), которое было загружено на мой сервер, имеет отдельный тип и цветное пространство .

Типы от человека выше можно понимать как:

  • Bilevel : черно-белый (я не думаю, что кто-то все еще использует это)
  • Оттенки серого : 0-255 – оттенки серого
  • Палитра : используется цветная картинка, присутствующая на изображении
  • TrueColor : Использует одну из стандартных цветовых схем (сегодня, скорее всего, sRGB)
  • ColorSeparation : Не уверен, но я думаю, что он хранит каналы отдельно
  • | один из приведенных выше | Матовый : Заставляет существовать альфа-канал.

Примечание. По сегодняшним меркам разница между написанием изображения в оттенках серого в цветовом пространстве sRGB или в цветовом пространстве Grey должна быть почти незначительной. (И использование простой RGB вместо sRGB также будет незначительным, и изображение часто будет плохо работать. Не используйте простой RGB, используйте sRGB.)

Вернуться к изображениям

Теперь мы можем объяснить решения, принятые IM, и мы можем утверждать, что это ошибка image1.png , а не IM. Давайте снова посмотрим на изображения:

 [grochmal@phoenix so]$ identify -verbose image1.png | grep -A 3 -e 'Color\|Type\|Class' Class: DirectClass Geometry: 95x74+0+0 Resolution: 28.35x28.35 Print size: 3.35097x2.61023 -- Type: PaletteAlpha Endianess: Undefined Colorspace: sRGB Depth: 8-bit Channel depth: red: 8-bit -- Colors: 96 Histogram: 1357: (217,217,217,255) #D9D9D9FF grey85 16: (217,217,218,255) #D9D9DAFF srgba(217,217,218,1) [grochmal@phoenix so]$ identify -verbose image2.png | grep -A 3 -e 'Color\|Type\|Class' Class: DirectClass Geometry: 69x102+0+0 Resolution: 28.35x28.35 Print size: 2.43386x3.59788 -- Type: GrayscaleAlpha Endianess: Undefined Colorspace: sRGB Depth: 8-bit Channel depth: gray: 8-bit -- Colors: 188 Histogram: 1: ( 26, 26, 26,255) #1A1A1AFF graya(26,1) 1: ( 35, 35, 35,255) #232323FF graya(35,1) 

Мы можем видеть, что image1.png имеет тип PaletteAlpha (или PaletteMatte в условиях IM), а у изображения2 есть тип GrayscaleAlpha .

Тот факт, что image1.png не имеет colourmap, является неправильным. Такой ошибочный автор изображений должен был записать это изображение как имеющее colourmap, но не записывая colourmap в изображение.

Когда IM видит, что изображение должно иметь цветовую палитру, оно назначает один, на основе предположения, вероятно. Предполагается, что это цветовая диаграмма в оттенках серого, которая добавляется во время преобразования.

(См. Вопрос, чтобы увидеть, что изображения изображений преобразуются с ошибкой)

Как это исправить?

К счастью, мы можем помочь IM, сказав, что мы не хотим сохранять или угадывать тип изображения. Мы просто хотим, чтобы изображение, которое будет использовать цвета из стандартного colourmap (sRGB или Gray для наших целей) вместо палитры, которой у нас нет, (так как искатель изображения с ошибками не записывал его в изображение).

Мы используем -type TrueColor :

 [grochmal@phoenix so]$ convert image1.png -strip -quality 80 -type TrueColor image1.jpg [grochmal@phoenix so]$ convert image2.png -strip -quality 80 -type TrueColor image2.jpg 

И изображения выглядят так, как мы ожидаем:

 [grochmal@phoenix so]$ identify -verbose image1.jpg | grep -A 3 -e 'Color\|Type\|Class' Class: DirectClass Geometry: 95x74+0+0 Resolution: 28x28 Print size: 3.39286x2.64286 -- Type: Grayscale Endianess: Undefined Colorspace: sRGB Depth: 8-bit Channel depth: gray: 8-bit -- Colors: 37 Histogram: 1520: (217,217,217) #D9D9D9 gray(217) 95: (219,219,219) #DBDBDB gray(219) [grochmal@phoenix so]$ identify -verbose image2.jpg | grep -A 3 -e 'Color\|Type\|Class' Class: DirectClass Geometry: 69x102+0+0 Resolution: 28x28 Print size: 2.46429x3.64286 -- Type: Grayscale Endianess: Undefined Colorspace: sRGB Depth: 8-bit Channel depth: gray: 8-bit -- Colors: 195 Histogram: 1: ( 14, 14, 14) #0E0E0E gray(14) 1: ( 37, 37, 37) #252525 gray(37) 

Обратите внимание, что IM выяснил, что изображения используют оттенки серого в пикселях и выдают изображение DirectClass, Grayscale, sRGB , которое, вероятно, будет тем, что мы делаем почти во всех случаях.

Если вы вместо этого используете -type Grayscale вы получите изображение PseudoClass, Graysclae, Gray , которое может сэкономить вам несколько байтов (возможно, 10-20 тыс. На типичном веб-изображении 100-500 тыс.) За счет менее совместимого формата. Например, мой pygtk иногда зашифровывает изображения PseudoClass , недостаток обратной совместимости, я думаю.

  • Как сохранить четкость при преобразовании jpg в pdf-файл?
  • Использовать преобразование для захвата определенной страницы из файла PDF?
  • Как изменить размер только пропущенных изображений?
  • Массовое переименование и изменение размера с помощью Imagemagick
  • различия между -resize и -size, а также между -repage и -page для преобразования?
  • ImageMagick (или другое) для текста в формате UTF-8
  • Кажется, не может заставить делегата jp2 работать в ImageMagick на Ubuntu 15.10
  • ImageMagick + ruTorrent-статистика (Github repo)
  • записывать эффекты изображения в виде анимаций
  • Доступ к справочной странице ImageMagick
  • Как сделать снимок экрана моего буфера Xvfb?
  • Linux и Unix - лучшая ОС в мире.