Strict Standards: Non-static method Soojung::addReferer() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/settings.php on line 79

Warning: Cannot modify header information - headers already sent by (output started at /home/lifthrasiir/sites/sapzil.info/soojung/settings.php:79) in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Counter.class.php on line 63

Strict Standards: Non-static method Entry::getEntry() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/entry.php on line 51

Strict Standards: Non-static method Soojung::entryIdToFilename() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Entry.class.php on line 182

Strict Standards: Non-static method Soojung::queryFilenameMatch() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Soojung.class.php on line 55
TokigunStudio3 | 블로그: png의 미스테리(?)

내용으로 바로 넘어 가기


TokigunStudio3

1 / 3283   


더 이상 이 블로그는 운영되지 않습니다. 새 블로그로 가 주세요.

png의 미스테리(?)

2005/01/09 AM 02:49 | 개발 | 4 comments | 0 trackbacks | AllBlog: vote, to pocket

여름도 아닌데 뭔 미스테리냐 하시는 분들께서는 그냥 안 보시는 게 나으리라고 본다. -_-; 에, 그러니까 이 글에 이은 세 번째 미스테리 시리즈다. -_-;;;;;;

지금까지 내가 obfuscation collection에 올린 파일들은 전부 Python, C, Befunge, Whirl 프로그램들이었다. 근데 내 주력 언어(라고 하기에는 실력이 딸리지만)인 php로는 뭐 하나 만들어 본 게 없어서, 뭐 만들까 생각하다가 아이디어가 난 게 "이미지를 생성하는 프로그램".

나는 png 포맷을 대충 알고 있다. 아는 사람은 알지만 png 포맷은 헤더(정확히는 indicator) 8바이트 딸랑 나오고 바로 chunk들의 향연(?)이 펼쳐지는데, 웃긴 게 이 중에 실제 래스터 데이터 들어 가는 chunk를 보면 압축 방법이 zlib이라고 되어 있다. -_-; 아니, 정확히는 zlib에 압축 방법을 deflate라고 못 박고 있지. -_-;;;; (zlib은 그냥 컨테이너다. PCM:AIFF/RIFF = deflate:zlib 정도의 관계로 보시라.) zlib 관련 함수들이 php에 있긴 하지만 컴파일 기본값에는 없기 때문에 쓰기는 뭣하다.

근데... 그거 아시는가? 대부분의 압축 포맷에는 "압축 안 함" 옵션이 꼭 들어 있다는 것. 확장성 등등의 이유로 채택하는 건데 deflate도 마찬가지로 압축 안 하고 그냥 일반 스트림으로 저장하는 방법이 있다. 그래서 내가 생각하길: 그냥 png 스트림에다가 압축 안 하고 zlib으로 싸서 넣으면 되겠지.

맞는 말이긴 했는데... 어떻게 어떻게 대충 코드 짜고 (간단하게 체크 무늬 출력하게 만들어 봤음...) 실행해 보니까 모질라에서 나오고 explorer.exe에서도 잘 나오는데... 익스플로러에서 안 나온다. OTL php에서 gd library 써서 읽어도 libpng가 별 이상한 에러를 내더란다... 뭐 이런 일이 다 있나 싶어서 가로 크기를 8의 배수로 맞추고 (png 스트림은 한 줄씩 집어 넣는 방식을 쓰는데, -- 전문 용어로, 일반적으로 스캔라인이 한 줄 단위로 나온다 라고 말한다 -- 내가 만든 이미지는 한 바이트에 픽셀 8개가 들어 가게 되어 있다. 문제는 이렇게 하면 끄트머리에 남는 비트가 생기는데, png 스펙에서는 분명 이건 아무렇게나 해도 상관 없다고 되어 있지만 혹시나 싶어서 이렇게 했던 것이다. 지금 확인해 보니 전혀 상관 없었다만;) 해 봤는데도 안 된다. 그래서 똑같은 이미지를 그림판이나 Paint Shop Pro에서 열어서 저장해 보니 물론 데이터 chunk가 압축된 채로 나오는데 이건 또 잘 열린다. 그래서 데이터 chunk 부분만 잘라서 원래 이미지에 넣으니... 잘 된다. OTL

결론: 익스플로러랑 libpng(익스플로러가 libpng 쓸까?)는 데이터 chunk가 압축 안 되면 에러 낸다. (정말로?)



그래서, 결국...

대처법: 별 수 없다. deflate 압축 구현해야지...





orz 잠이나 자자.

덤. 게임회사 이야기 연재 중단.. (쿠궁) 출판물에 연재되기 때문에 동시에 인터넷에 올리기 부담스럽다는 게 이유인데... 뭐 나중에라도 볼 수 있었으면 좋겠다. 이 현기 님 파이팅! :)

TrackBack URL: http://sapzil.info/soojung/trackback.php?blogid=297

Comment: 디토 (2005/01/09 PM 05:12)

모질라도 libpng 쓰는 것 같던데요? -_-;;;;

Comment: 토끼군 (2005/01/09 PM 05:44)

디토: 그러니까 말이에요. -_-; 똑같이 libpng 쓰는데 php의 gd library에서는 못 읽고 모질라에서는 읽고(..) 하는 건 뭔가 문제가 있는 거 아니겠어요.

Comment: 인클루드 (2005/01/10 AM 11:59)

libpng 가 읽지 못했을 때를 대비하여 mozpng 라는 모듈이 있을 지도 몰라요(..)

Comment: 토끼군 (2005/01/10 PM 03:00)

인클루드: mozpng... -_-;;

Copyright (c) 1995-2005, Kang Seonghoon (Tokigun).