2014-12-20 1 views
2

동일한 이미지 블록 (크기가 40x40 또는 1600 픽셀)이 동일한 gif89a가있는 경우 gif 파일의 최종 크기가 계속 증가해야합니다 (제너럴 인코더라고 가정)?gif 이미지 형식의 의도 된 동작을 명확히하십시오.

저는 LZW 압축이 어떻게 작동하는지 이해하려고합니다. W3C 스펙에 따르면 여러 데이터 블록으로 구성된 전체 데이터 스트림 자체를 압축해야하므로 동일한 이미지 프레임을 여러 번 반복하면 오버 헤드가 거의 발생하지 않을 것이라고 생각했습니다. 이미지 블록). 이 경우가 아닌 것 같아요. 여러 개의 인코더 (Gimp, Photoshop)로 테스트했습니다.

모든 인코더에서 이것이 기대 되나요? 아니면이 두 가지가 제대로 수행되지 않았습니까?

김프로 테스트 한 gif는 240 개의 동일한 이미지 블록이 있고 크기가 58k이고 이미지 블록이 500 개 였는데 내 직감보다 덜 인상적으로 보입니다 (내 직감은 꽤 바보 같아서 만약 누군가가 내게 그렇게 잘못되었다고 말하면 충격을받을 것입니다.)

[편집]

나는 그것이 내가 생각에서지고있어 적절한 대답을받을 무엇을 확장 할 필요가

. 나는 gif 이미지를 수작업으로 만들고 싶다. (아마도 엔코더를 써야한다.) 다른 것들보다 더 잘 압축 할 수있는 몇 가지 단점을 이용하게 될 것이다.

반복적으로 타일링 방식으로 사용되는 여러 하위 이미지를 gif에 포함하고 싶습니다. 이미지 크기가 큰 경우 (이 경우 1700x2200) gif는 타일을 타일로 보지 못하기 때문에 타일을 잘 압축 할 수 없으며 왼쪽 상단부터 하단 오른쪽까지의 래스터와 최대 30 픽셀의 수평 슬라이스 어떤 주어진 타일의 심볼은 30x35 타일 자체가 아닌 심볼을주고 압축됩니다.

타일 자체는 잡지의 스캔에서 알파벳과 일부 구두점을 사용합니다. 물론 원래의 스캔에서 각 "a"는 압축에 도움이되지 않는 다른 모든 것보다 약간 씩 다르며 스캔시에도 많은 소음이 발생하여 도움이되지 않습니다.

각 타일은 이미지의 어딘가에서 수십에서 수백 번까지 반복되며 각 타일은 주어진 타일 조각의 30 배 또는 40 배 크기이므로 어떤 이득이있는 것처럼 보입니다 (gif 파일 형식이 내 목표를 향해 구부릴 수 있다고 가정).

gimp에서 25 개의 하위 이미지를 반복적으로 사용하는 gif를 손으로 직접 만들었습니다 (약 700 회이지만 잃어 버렸습니다). 압축되지 않은 크기가 90k이지만 압축하면 다시 11k로 떨어집니다. 각 하위 이미지의 상단/왼쪽 좌표가 다르더라도 (이는 하위 이미지의 헤더에서 4 바이트까지만 가능합니다.)

비교해 보면, 단일 프레임의 시각적으로 동일한 이미지는 75k입니다. 이 이미지는 압축되지 않습니다.

아직 파일로 알아 내야 할 다른 문제가 있습니다 (gif89a이며 각 프레임을 길이가 0ms로 설정 했는데도 애니메이션으로 처리하므로 모든 것을 볼 수는 없습니다). 바로). 나는 이것을하기 위해 인코더를 어떻게 만들지 생각조차 할 수 없다 ... 그것은 글리프의 가장 잘 보이는 (또는 더 잘 생긴 것 중 적어도 하나의) 버전을 선택해야 할 것이다. x, y는 항상 잘 정렬되지는 않지만 오버레이하는 것이 가장 좋습니다.

이것은 주로 cbr/cbz 전자 책으로 스캔 한 잡지에 사용됩니다.

enter image description here

+0

이 방법을 테스트하는 가장 좋은 방법은 명시된 압축 방식으로 "손으로"LZW 스트림을 생성하고 어떤 디코더가 가져올지를 확인하는 것입니다. (실제보다 더 두렵게 들립니다.) – nneonneo

+0

프레임은 개별적으로 LZW로 인코딩됩니다. GIF 파일에 연속적으로 동일한 프레임을 배치하는 대신 하나의 프레임을 길게 지연시킬 수 있습니다 (각 프레임에는 다음 프레임이 표시 될 때까지 지연이 포함 된 자체 GCE 블록이 있습니다). – Michael

+0

@Michael 긴 지연으로 하나의 프레임을 갖는 것은 내 의도가 아닙니다. 오히려 이미지의 여러 위치를 타일로 사용하려고했습니다. 이것은 물론 각각에 대한 상단/좌측 좌표를 변경하는 것을 의미 할 것이며, 압축 할 수는 없지만 나머지 블록은 (또는 그렇게 생각할 것입니다). 그러나 나는 그렇지 않다고 생각한다. –

답변

1

LZW을 (: 나는 또한 내 손으로 만들어진 GIF를 포함거야

은, 내가 설명을 통해 우연히 발견으로 내 글을 읽는 것보다에서 얻고 무엇을보고 쉽게 및 GIF) 압축은 1 차원입니다. 이미지는 모든 영역 대 지역 (용어에서 블록) 대칭이 사용되지 않는 기호 스트림으로 처리됩니다. 애니메이션 GIF 이미지는 독립적으로 압축 된 일련의 이미지이며 다양한 병합 옵션을 사용하여 "기본"이미지에 적용 할 수 있습니다. 애니메이션 GIF는 표준보다 해킹과 같았으며 이미지 크기의 효율성에 대해 잘 생각하지 않았습니다.

반복되는 블록으로 GIF를 ZIP 처리 한 후 작은 파일을 보는 이유에 대한 좋은 설명이 있습니다. ZIP 파일은 동일한 LZW 데이터를 작은 (< 32K) 블록 (또는 작은 거리로 분리)으로 잘 수행 할 수있는 "반복 블록"유형의 압축을 포함하는 여러 기술을 사용합니다.

GIF 생성 소프트웨어는 새로운 표준을 작성하지 않고 GIF 이미지를 압축하는 방법의 기본 제한을 극복 할 수 없습니다. 간단한 2 차원 필터를 사용하여 수평 및 수직 대칭의 이점을 취한 다음 FLATE 압축을 사용하여 결과를 압축하는 PNG는 약간 더 나은 방법을 사용합니다. 당신이 찾고있는 것처럼 더 많은 프랙탈 또는 비디오 접근 방식은 최종 이미지의 다른 위치에서 반복 될 수있는 압축 된 프리미티브 집합의 개념을 가질 수 있습니다. GIF와 PNG로이를 수행 할 수 없습니다.

+0

심지어 LZW 압축도 잘됩니다 ... 반복 된 블록은 더 큰 이미지와 분리되어 있으므로 전체 블록 자체가 1 차원입니다. 물론 압축을 블록 단위로 수행하지 않았다면 (또는 Mark Ransom이 지적한 것처럼 작은 코드 테이블로 제한됨). 설명해 주셔서 감사합니다. –

+0

LZW는 긴 블록을 구성하기 위해 많은 사전 항목을 필요로하고 12 비트 길이 제한을 초과하기 때문에 사전을 재설정해야하기 때문에 작은 블록을 사용하더라도 잘 수행 할 수 없습니다. LZW에는 "지연된 일반 코드"라는 옵션이있어 사전에 오래 동안 보관할 수 있지만 여전히 문제가 해결되지 않을 것이라고 생각합니다. – BitBank

1

GIF 압축은 스트림 기반입니다. 즉, 압축을 최대화하려면 스트림의 반복성을 최대화해야합니다. 정사각형 타일 대신 폭이 좁은 스트립을 사용하여 반복되기 전에 지나가는 데이터의 양을 최소화하고 동일한 스트림 내에서 반복을 유지합니다.

LZW 코드 크기는 12 비트로 제한되어 있습니다. 즉, 압축 테이블이 상대적으로 빠르게 채워집니다. 일반적인 엔코더는 이러한 상황이 발생하면 명확한 코드를 출력하므로 압축을 다시 시작할 수 있으므로 새로운 내용에 잘 적응할 수 있습니다. 사용자 정의 인코더를 사용하는 경우 명확한 코드는 건너 뛰고 기존 테이블을 계속 사용하여 압축 결과를 높일 수 있습니다.

GIF 사양은 지연 시간이 0 일 때 동작을 지정하지 않으므로 디코더 구현이 필요합니다. 일관된 결과를 얻으려면 지연 시간을 1로 설정하고 전체 이미지가 즉시 표시되지 않도록해야합니다.