계속해서 실험을 반복하여 무슨 일이 일어나고 있는지 알아낼 수 있는지 확인했습니다.
순서
김프의 "솔리드 노이즈"필터 (필터> 렌더> 클라우드> 솔리드 노이즈 ...)를 사용하여 임의의 256 x 256 픽셀 RGB 이미지를 기본 설정 (아래 그림 참조)을 사용하여 생성했습니다.
그리고 결과 :
그런 다음 기본 설정을 사용하여 이미지를 JPEG로 저장했습니다.
그런 다음 이미지를 Windows로 전송하고 파일 탐색기에서 이미지를 마우스 오른쪽 단추로 클릭 하고 메뉴에서 미리보기 를 선택하여 Windows 사진 뷰어로 이미지를 열었습니다 . 그런 다음 하단의 버튼을 사용하여 이미지를 회전시키고 화살표 키를 사용하여 다음 이미지로 이동하여 이미지를 저장했습니다.
아래의 각 테스트마다 원본 이미지의 복사본으로 시작하여 저장하기 전에 해당 횟수만큼 회전 (회전 버튼 클릭)했습니다. 크기 조정 ( ls -l -r
) 은 다음과 같습니다 .
size in bytes last-modified date
VVVVV VVVVV
-rwxrwx--- 1 root vboxsf 6258 Nov 8 11:24 original.jpg
-rwxrwx--- 1 root vboxsf 23645 Nov 8 11:30 cw.jpg
-rwxrwx--- 1 root vboxsf 23636 Nov 8 11:30 cw-cw.jpg
-rwxrwx--- 1 root vboxsf 23649 Nov 8 11:30 cw-cw-cw.jpg
-rwxrwx--- 1 root vboxsf 6258 Nov 8 11:27 cw-cw-cw-cw.jpg
-rwxrwx--- 1 root vboxsf 23649 Nov 8 11:31 cw-cw-cw-cw-cw.jpg
-rwxrwx--- 1 root vboxsf 23649 Nov 8 11:29 ccw.jpg
-rwxrwx--- 1 root vboxsf 23636 Nov 8 11:29 ccw-ccw.jpg
-rwxrwx--- 1 root vboxsf 23645 Nov 8 11:29 ccw-ccw-ccw.jpg
-rwxrwx--- 1 root vboxsf 6258 Nov 8 11:27 ccw-ccw-ccw-ccw.jpg
-rwxrwx--- 1 root vboxsf 23649 Nov 8 11:30 ccw-ccw-ccw-ccw-ccw.jpg
즉각적인 관찰
- WPV (Windows 사진 뷰어)는 크기를 크게 늘립니다. 이 테스트에서 증가량은 약 4 배입니다!
- 모든 새로운 이미지는 거의 같은 크기로 증가하지만 동일하지는 않습니다.
- WPV는 이미지를 360 도의 배수로 회전 할 때 이미지를 다시 인코딩하거나 다시 저장하지 않습니다. (타임 스탬프 11:27은 파일이 처음 복사 된 시점입니다.)
cmp -l
동일한 내용을 가져야하는 파일을 사용 하면 파일의 차이점을 알 수 있습니다.
robert@unity ../jpeg-rotate-test % cmp -l cw.jpg ccw-ccw-ccw.jpg
2223 63 62
2224 60 71
2226 60 64
2227 60 66
robert@unity ../jpeg-rotate-test % cmp -l cw-cw.jpg ccw-ccw.jpg
2223 63 62
2224 60 71
2226 60 64
2227 62 64
robert@unity ..jpeg-rotate-test % cmp -l ccw.jpg cw-cw-cw.jpg
2223 62 63
2224 71 60
2226 64 60
2227 61 64
robert@unity ../jpeg-rotate-test % cmp -l cw.jpg cw-cw-cw-cw-cw.jpg
2221 60 61
2223 63 61
2224 60 66
2226 60 61
2227 60 61
robert@unity ../jpeg-rotate-test % cmp -l ccw.jpg ccw-ccw-ccw-ccw-ccw.jpg
2223 62 63
2224 71 60
2226 64 65
2227 61 64
이 파일들은 단지 4 바이트 (실제로 타임 스탬프) 만 다릅니다. 이는 WPV가 매번 같은 일을한다는 것을 의미합니다. 이제 우리는 그것이 무엇인지 알아 내면됩니다.
자세한 관찰
이를 위해 JPEGsnoop 을 사용 하여 이미지의 내용이 정확히 무엇인지 확인했습니다.
출력이 상당히 길기 때문에 gist로 연결했습니다 . 차이점에 대한 요약은 다음과 같습니다.
김프는 메타 데이터에 APP0
(JFIF) 및 COM
(코멘트) 세그먼트 만 사용합니다 . WPV는 APP0
세그먼트를 건드리지 않지만 주석에 널 바이트를 흥미롭게 추가하여 널로 종료합니다.
WPV는 APP1
Exif와 XMP 메타 데이터 인 두 개의 세그먼트를 추가합니다 . 이 세그먼트는 각각 4286 및 12726 바이트입니다. 그들은 함께 파일 크기의 거의 모든 증가를 설명합니다.
김프는 프로그레시브 JPEG를, WPV는베이스 라인 (비 프로그레시브) JPEG를 생성합니다. 이러한 이유로 김프의 이미지에는 여러 스캔 세그먼트가 있지만 WPV 이미지에는 하나의 스캔 세그먼트 만 있습니다. 내 경험상 프로그레시브 이미지는 때때로 약간 작습니다.
김프는 1 × 1 크로마 서브 샘플링을 사용했고 WPV는 2 × 2 서브 샘플링을 사용했습니다. 이것은 WPV가 흑백 이미지임을 감지 할 수 없다면 "진정한"무손실 회전을 사용하지 않는다고 믿게합니다.
이 문제를 해결하기 위해 두 번째 테스트를 실행했습니다.
순서
첫 번째 테스트와 비슷한 단계를 수행했습니다. 다음 설정을 사용하여 RGB 노이즈 필터 (필터> 코> RGB 코 ...)를 사용하여 임의 256 × 256 RGB 이미지를 만들었습니다.
결과는 다음과 같습니다.
다음 설정을 사용하여 파일을 JPEG로 내보냈습니다.
프로그레시브 가 꺼져 있지만 서브 샘플링 은 여전히 4 : 4 : 4 ( 1x1 서브 샘플링의 다른 이름)로 설정되어 있습니다. 품질이 98로 향상되었습니다.
이미지를 복사하고 사본을 시계 방향으로 회전했습니다. 그런 다음 회전 된 버전을 복사하고 해당 사본을 시계 반대 방향으로 회전하여 원본과 WPV 처리 사본 간의 품질을 직접 비교할 수 있습니다.
결과
-rwxrwx--- 1 root vboxsf 159774 Nov 8 16:21 original-random.jpg
-rwxrwx--- 1 root vboxsf 222404 Nov 8 16:24 cw-random.jpg
-rwxrwx--- 1 root vboxsf 222467 Nov 8 16:24 cw-ccw-random.jpg
이 시간의 증가는 상대적인 측면 (약 40 %)에서 더 작지만 절대 증가는 62kB 정도입니다. 이는 WMV가 덜 효율적인 인코딩을 사용하고 있음을 나타냅니다.
ImageMagick 을 사용하여 두 이미지를 비교 하겠습니다 .
robert@unity ../jpeg-rotate-test % compare -verbose -metric AE original-random.jpg cw-ccw-random.jpg null:
original-random.jpg JPEG 256x256 256x256+0+0 8-bit sRGB 160KB 0.000u 0:00.009
cw-ccw-random.jpg JPEG 256x256 256x256+0+0 8-bit sRGB 222KB 0.010u 0:00.010
Image: original-random.jpg
Channel distortion: AE
red: 0
green: 0
blue: 0
all: 0
original-random.jpg=> JPEG 256x256 256x256+0+0 8-bit sRGB 0.050u 0:00.020
있다 다른 제로 픽셀 원본과 회전 사본 사이는. 따라서 WPV가 "실제"무손실 회전을 사용하지 않더라도 충분한 작업을 수행하고 있습니다. 나는 무슨 일이 일어나고 있는지 알고 있으며 JPEG 압축의 수학에 약간의 전환을 설명 할 것이라고 생각합니다.
JPEG 압축 알고리즘은 이미지를 8 × 8 픽셀 블록으로 나눕니다. 이 블록들 각각은 이산 코사인 변환 (DCT) 을 받는다 . 결과 DCT 계수는 블록을 다른 주파수 파의 합으로 설명합니다. 그런 다음이 알고리즘은 노이즈와 매우 작은 세부 사항에 해당하는 고주파 파의 일부 정보를 "버립니다". 디코딩 과정은 DCT를 반대로하여 저장된 파동을 합쳐서 블록을 되 찾는다.
실제로 변환을 취소하고 다시 실행하지 않고 DCT "파동"을 회전 할 수 있습니다 (기본적으로 모든 수평 파를 수직 파로 또는 그 반대로 전환). WPV에서 내가 생각하는 것은 이미지가 실제로 디코딩되고 회전 된 다음 다시 인코딩된다는 것입니다. 재 인코딩 과정에서 이미지의 크기는 두 차원 모두에서 8의 배수이기 때문에 각각의 새로운 블록은 원래 블록 중 하나에 해당합니다. 중요하게, 각 블록에는 고주파수 성분이 없기 때문에 알고리즘은 어떠한 정보도 버리지 않으며 "진정한"무손실 회전이 가질 수있는 올바른 DCT 성분을 정확하게 찾습니다.
마지막으로 JPEG 파일의 구성 요소를 다시 살펴 보겠습니다. 결과는 다시 요점으로 연결됩니다 . 두 비교 :
WPV 이미지에는 추가 4286 + 2 바이트의 Exif 메타 데이터, 주석에 1 개의 추가 바이트 및 12,726 + 2 바이트의 XMP 메타 데이터가 포함되어 있습니다. 총 17,017 바이트의 추가 메타 데이터입니다. 그 데이터는 무엇에 사용됩니까? 나는 신뢰할 수있는 16 진수 편집기와 관련 표준 사본을 사용하여 파일을 들여다 보았습니다.
Exif 메타 데이터는 많은 태그를 포함하는 TIFF 이미지와 같이 구조화되어 있습니다 ( 더 복잡한 방법이 있지만 바로 건너 뜁니다). Exif 세그먼트의 대부분의 바이트는 태그 번호 EA1C
(십진수 59,932)의 두 개의 동일한 태그에 포함됩니다 . 그 태그 번호는 내가 찾을 수있는 곳 어디에도 문서화되어 있지 않습니다. 두 태그 모두 "정의되지 않은"유형의 2060 바이트를 포함하며 처음 6 개 ( 1C EA 00 00 00 08
)를 제외한 모두 널 바이트 입니다. 이 태그가 무엇인지, 왜 태그가 2 개 있는지, 왜 각각 2kB가되어야하는지 모르겠습니다.
XMP 메타 데이터는 실제로 이름 공간이 있고 긴 UUID가 포함 된 전체 임베디드 XML 문서이며 WPV 버전 문자열 (Exif 메타 데이터에 이미 있음) 만 포함합니다. 그러나 약 400 바이트 만 차지합니다. 세그먼트의 나머지 부분은 100 개의 공백을 122 번 반복 한 다음 줄 바꿈 입니다. 총 12,000 바이트가 넘는 공간이 낭비되었습니다.
이전 테스트와 마찬가지로 김프와 WPV는 동일한 DCT 양자화 테이블을 사용합니다. 이것은 그들이 정확히 동일한 DCT 계수를 계산해야 함을 의미하므로 이미지가 정확히 동일합니다. WPV가 동일한 양자화 테이블을 사용하고 있는지 또는 입력에서 테이블을 복사하는지 확실하지 않습니다.
이전 테스트와 달리 이번에는 WPV에서 1x1 서브 샘플링을 사용하므로 실제로 이것이 컬러 이미지임을 감지 할 수 있습니다 (또는 이미지를 손실없이 다시 인코딩하려면 최소한 더 높은 샘플이 필요함).
김프와 WPV는 다른 허프만 테이블 (엔트로피 코딩 단계의 일부)을 사용합니다. WPV에 대한 테이블은 총 279 바이트로 더 크며, 어떤 경우에는 7 배 많은 코드가 포함됩니다.
JPEGsnoop의 통계를 보면 이러한 코드 중 일부가 거의 사용되지 않음을 알 수 있습니다. 예를 들어, ID: 1, Class: AC
표에서 정의 된 119 16 비트 코드 중 23 개만 실제로 사용됩니다. 실제 스캔 세그먼트는 WPV 버전에서 28.5 % 더 큽니다.
요약
버전 정보 :
OS (Linux) ( uname -a
) :
Linux unity 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u1 (2016-09-03) x86_64 GNU/Linux
OS (Windows) :
김프 (Linux) : 2.8.14 (패키지 gimp
, 버전 2.8.14-1+deb8u1
)
Window Photo Viewer (이미지 메타 데이터에 따름) :
Microsoft Windows Photo Viewer 10.0.10586.0