ImageMagicはカラーマップをどのように決定しますか?

ImageMagicはカラーマップをどのように決定しますか?

私は最近IM 6.9.9-3にアップデートしましたが、一貫性のない動作が見つかりました。以下は、見た目に似ている2枚の写真です。

図1.png

ここに画像の説明を入力してください。

図2.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)

convertどちらも色が255個未満なので(グレースケールに必要)JPEGに変換してみましょう。

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

いいですね。エラーはありません。しかし、今、画像の1つはグレースケール画像、もう1つはsRGB画像です。また、IMは画像の1つにカラーマップを追加しました。

[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

カラーマップは現在私のサムネイル作成スクリプトの一部を破損しています(私が使用するほとんどの画像は実際にはるかに大きいですが、これら2つの画像は私が最も実験している画像です。これはWebゲームです)。しかし、これは3つの質問を提起します。

  1. IMは、(1)変換中に画像の色空間を変更し、(2)カラーマップを追加することにした決定をどのように実行しますか?

  2. IMがより一貫した動作を実行できるようにするにはどうすればよいですか(できれば何もカラーマップを追加しません)。

  3. カラーマップを強制的に削除できますか? (5時間試しましたが成功しませんでした。)

ベストアンサー1

正しい方向を教えてくれた@WumpusQ.Wumbleyに感謝します。

簡単に言うと:-type TrueColorPseudoClass画像のパレットタイプからカラーマップを削除するために使用されます。

カラーマップはPseudoClassではありません。

IMフォーラムを読んだ後、ついに画像のカラーマップが何であるか、そしてそれをどのように処理するかを(多少)理解しました。まず、2つの間に違いがあります。直接クラスそして擬似クラス:

  • 直接クラス各ピクセルの色値を保存します。
  • 擬似クラスカラーテーブルを使用して、そのテーブルにオフセットを保存します。

これが私の混乱の原因です。PseudoClassはカラーマップではありません。、それらは別のものです。 IM はほとんど常に PseudoClass イメージを DirectClass イメージに変換するので混乱します。

画像の変更に関連する主なタスクは、通常、タスクを適用する前にPsuedoColor画像(カラーテーブルを使用する画像)をDirectColor(各ピクセルに別々の色値を使用する画像)にアップグレードします。

源泉 (PS DirectClassとPseudoClassはDirectColorとPseudoColorの同義語です。)

それでは、カラーマップとは何ですか?

これカラーマップ画像に保存されているパレットのカラーインデックスです。これは非常に似ている擬似クラスカラーマップでもあるので違いは次のとおりです。擬似クラス画像の色のみが含まれていますカラーマップパレットのすべての色が含まれています。参考にしてください擬似クラスありますカラーマップセクションですが、これがカラーマップになります。擬似クラス一つでもないカラーパレットタイプを入力します(たとえば、IMの用語で見ると非常に混乱しています)。

これカラーマップ-typeIMオプションとして定義されています。

-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.

ご注意ください、タイプとは違う色空間。ほとんどの画像には次の内容があります。タイプ一つ色空間Type: Grayscale、のようなColorspace: Grayものですが必ずしもそうではありません。私のサーバーにアップロードされた画像(質問)には明らかな内容があります。タイプそして色空間

これタイプ上記から次のように理解できます。

  • ダブルレイヤー:白黒(まだこれを書く人がいないと思います)
  • グレースケール:0-255はグレーの色合いです。
  • カラーパレット:画像のカラーマップを使用します。
  • トゥルーカラー:標準のカラースキームの1つを使用します(現在はsRGBである可能性が高い)。
  • 色の分離: わかりませんが、チャンネルを別々に保存していると思います。
  • |上記のいずれか|マット:アルファチャンネルが存在するように強制します。

注:今日の規格によると、グレースケール画像間の違いは次のように記録されています。sRGB色空間またはグレー色空間はほとんど無視できます。 (sRGBの代わりに純粋なRGBを使用する効果も無視することができ、画像が正しく表示されないことがよくあります。純粋なRGBを使用せずにsRGBを使用してください。)

画像を返す

これで、IMが行った決定について説明できます。図1.pngIMではなく問題です。イメージを見てみましょう。

[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)

私たちはそれを見ることができます図1.pngPaletteAlphaタイプ(またはPaletteMatteIM用語で)があります図2タイプがありますGrayscaleAlpha

実は図1.pngいいえカラーマップ完全に間違っています。したがって、欠陥のある画像の作成者は、その画像を次のように作成したに違いありません。カラーマップでも書かないでカラーマップ画像に。

IMが画像を見つけたら必要があります。カラーマップ推測に基づいて1つを割り当てることができます。推測はそうだ。グレースケール変換中にカラーマップが追加されました。

(推測変換された画像の出力については、質問を参照してください。)

どうすれば修正できますか?

幸いなことに、IMに情報を保持したり推測したくないことを知らせることで、IMを助けることができます。タイプビデオ。私たちは、とにかく持っていないパレット(問題の画像作成者が画像にそれを書かないので)ではなく、標準のカラーテーブル(私たちの目的に応じてsRGBまたはグレー)の色を使用する画像を望んでいます。

私たちは使用-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、グレースケール、sRGBイメージ、おそらくほとんどすべての状況で私たちが求めているのはまさにそれでした。

-type Grayscale代わりに使用する場合擬似クラス、グレースレイ、グレーイメージを使用すると、一部のバイト(通常の100-500k Webイメージの場合は10-20k)を節約できますが、フォーマットの互換性が低下します。例えば、私はpygtk時々吐きます。擬似クラス画像、以前のバージョンとの互換性が不足しているようです。

おすすめ記事