최근 IM 6.9.9-3으로 업데이트했는데 매우 일관성 없는 동작을 발견했습니다. 다음은 겉보기에 비슷해 보이는 두 장의 사진입니다.
그림 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
좋습니다. 오류가 없습니다. 그러나 이제 이미지 중 하나는 회색조 이미지이고 다른 하나는 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
컬러맵은 현재 내 썸네일 제작 스크립트 중 일부를 손상시키고 있습니다(제가 사용하는 대부분의 이미지는 실제로 훨씬 더 크지만 이 두 이미지는 제가 가장 많이 실험하고 있는 이미지입니다. 이것은 웹 게임입니다). 그러나 이로 인해 세 가지 질문이 제기됩니다.
IM은 (1) 변환 중에 이미지의 색상 공간을 변경하고 (2) 색상 맵을 추가하기로 한 결정을 어떻게 수행합니까?
IM이 보다 일관된 동작을 수행하도록 하려면 어떻게 해야 합니까(가급적이면 아무 것에도 색상맵을 추가하지 않음)?
컬러맵을 강제로 삭제할 수 있나요? (5시간 동안 시도했지만 성공하지 못했습니다.)
답변1
올바른 방향을 알려준 @WumpusQ.Wumbley에게 감사드립니다.
간단히 말해서:-type TrueColor
PseudoClass 이미지의 팔레트 유형에서 컬러맵을 제거하는 데 사용됩니다 .
컬러맵이 PseudoClass가 아닙니다.
IM 포럼을 읽은 후 마침내 이미지의 컬러맵이 무엇인지, 그리고 이를 처리하는 방법을 (다소간) 이해했습니다. 첫째, 둘 사이에는 차이점이 있다.직접 수업그리고의사 클래스:
- ㅏ직접 수업각 픽셀의 색상 값을 저장합니다.
- ㅏ의사 클래스색상 테이블을 사용한 다음 해당 테이블에 오프셋을 저장합니다.
이것이 내 혼란의 원인입니다.PseudoClass는 컬러맵이 아닙니다., 그것들은 다른 것입니다. IM은 거의 항상 PseudoClass 이미지를 DirectClass 이미지로 변환하기 때문에 혼란스럽습니다.
이미지 수정과 관련된 주요 작업은 일반적으로 작업을 적용하기 전에 PsuedoColor 이미지(색상표를 사용하는 이미지)를 DirectColor(각 픽셀에 대해 별도의 색상 값을 사용하는 이미지)로 업그레이드합니다.
원천 (PS DirectClass 및 PseudoClass는 DirectColor 및 PseudoColor의 동의어입니다.)
그렇다면 컬러맵이란 무엇일까요?
이것컬러맵이미지에 저장된 팔레트의 색상 인덱스입니다. 이것은매우비슷하다의사 클래스컬러맵이기도 하므로 차이점은 다음과 같습니다.의사 클래스이미지에 있는 색상만 포함되며컬러맵팔레트의 모든 색상이 포함됩니다. 참고하시기 바랍니다의사 클래스있을 것이다컬러맵섹션이지만 이것이 컬러맵이 됩니다.의사 클래스하나도 아니야색상 팔레트유형을 입력합니다(예, IM 용어로 보면 매우 혼란스럽습니다).
이것컬러맵-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.
참고하시기 바랍니다,유형와는 다르다색 공간. 대부분의 이미지에는 다음과 같은 내용이 있습니다.유형하나색 공간Type: Grayscale
, 와 같은 Colorspace: Gray
것이지만 반드시 그런 것은 아닙니다. 내 서버에 업로드된 이미지(질문)에는 분명한 내용이 있습니다.유형그리고색 공간.
이것유형위에서부터 다음과 같이 이해할 수 있습니다.
- 더블 레이어: 흑백 (아직도 이걸 쓰는 사람이 없는 것 같아요)
- 그레이스케일:0-255는 회색 음영입니다.
- 색상 팔레트: 이미지에 있는 컬러맵을 사용합니다.
- 트루 컬러: 표준 색 구성표 중 하나를 사용합니다(현재는 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
유형(또는 PaletteMatte
IM 용어로) 이 있으며그림 2유형 이 있습니다 GrayscaleAlpha
.
사실은그림 1.png아니요컬러맵완전히 틀렸어요. 그러므로 결함이 있는 이미지의 작성자는 해당 이미지를 다음과 같이 작성했음이 틀림없습니다.컬러맵하지만 쓰지 마세요컬러맵이미지 속으로.
IM이 이미지를 찾으면 있어야 합니다.컬러맵추측에 기초하여 하나를 할당할 수 있습니다. 추측은 그럴 것 같다.그레이스케일변환 중에 컬러맵이 추가되었습니다.
(추측 변환된 이미지의 출력을 보려면 질문을 참조하세요.)
어떻게 고치나요?
다행스럽게도 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
대신 사용하는 경우의사 클래스, Grayslay, 회색이미지를 사용하면 일부 바이트(일반적인 100-500k 웹 이미지의 경우 10-20k)를 절약할 수 있지만 형식 호환성이 저하됩니다. 예를 들어, 나는 pygtk
가끔 토한다.의사 클래스이미지, 이전 버전과의 호환성이 부족한 것 같습니다.