'비트맵'에 해당되는 글 1건
2009.06.18 23:28
오랫만에 블로그로 인사드립니다. (__)

최근에 BMP 파일을 Flex 에서 읽어다 쓸 일이 생겼습니다.
Flex에서 이미지를 보여주는 컴포넌트인 Image 컴포넌트는 JPEG, PNG, GIF, SWF, SVG 같은 확장자만을 지원하고 BMP은 지원하고 있지 않기 때문에 BMP을 바로 넣을 수는 없습니다.(웹에서 BMP 를 쓰는 무식한 짓을 하면 안되겠죠.. ㅜㅜ 크기도 큰데 말입니다.)  JPG 파일이면 Image 컴포넌트에서 바로 읽어다 쓸 수 있을텐데 참 난감합니다.

그럼 방법이 없느냐? 아닙니다.
어떤 멋진 분께서 BMPDecoder 를 만들어놓으셨네요! :) 이미 FlexComponent 카페에서도 공유되었던 내용입니다.


위의 블로그에 들어가보시면 간단한 사용법에 대해서 나오고 BMPDecoder 라이브러리도 보입니다. 다만 BMPDecoder.as 파일이 다운로드가 안되네요. BMPDecoder.as 파일은 '삶의 향기'라는 블로그에  간단한 예제와 함께 업로드 되어 있으니 다운받아 사용하시면 되겠습니다.

간단하게 FP10 에서 추가된 FileReference의 load() 메소드를 이용해, BMP파일을 불러다  Image 컴포넌트에 넣는 예제를 만들어봤습니다.  예제 구성은 위에서 소개해드린 '삶의 향기' 블로그에 소개된 코드를 이용했습니다.


BMPDecoder.as 보기


BMP 파일을 선택하시면  Image 컴포넌트에 깔끔하게 출력되는 것을 보실 수 있습니다.

하지만 다음과 같은 버그가 존재합니다.
170픽셀 16bit BMP

170픽셀 16bit BMP

171픽셀 16bit BMP

171픽셀 16bit BMP 파일


위의 이미지에서 볼수 있는 것 처럼 BMP을 로드했을 때 이미지가 뒤틀려버리는 버그가 존재합니다.
왜 그럴까 한참을 고민했는데, 저희 팀장님이 힌트를 주시더군요. '윈도우어플에서도 비트맵 크기가 홀수일 경우 이미지가 저렇게 깨진다'고 말이죠. 실제로 테스트해보니 위와 같이 16bit이고 이미지의 너비가 홀수일 경우 위 처럼 이미지가 뒤틀려버리는 버그가 있습니다. (24bit, 32bit에서는 괜찮더군요)

이 버그에 해결책으로 저는 아래와 같이 decode() 메소드에서 이미지 너비를 결정해주는 로직 밑에 너비가 홀수일경우 강제로 1픽셀 늘리는 방법을 사용했습니다. 더 좋은 방법이 있을 것 같은데, 아시는 분은 알려주세요 :)


그럼 좋은 하루되세요!


예제파일 다운로드 :

신고
Creative Commons License
Creative Commons License
Favicon of http://hangunsworld.com BlogIcon Han Sanghun | 2009.06.20 08:25 신고 | PERMALINK | EDIT/DEL | REPLY
잘 뒤져보면 자주 쓰이는 파일 포멧들에 대한 인코더/디코더들이 많이 공개되어 있더라고요. 정말 좋은 세상인것 같아요. ^^
그렇지만 플래시 플레이어 성능의 한계상, 용량이 좀 큰 파일인 경우 스크립트 실행이 멈추는 문제가 종종 있더군요.
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.06.20 14:25 신고 | PERMALINK | EDIT/DEL
정말 고마우신 분들이 많으십니다 ;)
예전에 JPEG의 EXIF 정보 읽어보려서 스펙뒤지고 했는데, 이미 만들어서 공개해두신 분이 계시더라는;;;;
용량 큰건 안습이죠... ㅜㅜ
Favicon of http://siking.tistory.com BlogIcon 윤연식 | 2009.06.23 20:53 신고 | PERMALINK | EDIT/DEL | REPLY
아하.. 그렇군요... 잘보고 갑니다 감사합니다...^^
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.06.24 11:24 신고 | PERMALINK | EDIT/DEL
생유~
차상욱 | 2009.06.24 11:43 신고 | PERMALINK | EDIT/DEL | REPLY
좋은 자료 감사합니다.
그런데 제가 flex3 빌더를 사용하는데 여기서는 FileReference 안에 load() 메소드가 지원되지 않더군요
혹시 위에 빌더가 flex 2인가요??
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.06.24 15:02 신고 | PERMALINK | EDIT/DEL
저는 Builder 3를 사용하고 있습니다.
기본적으로 Builder 3에서는 FP 9가 기본인데요, 위에 설명에서 보시면 알 수 있듯, Flash Player 10 에서 load() 메소드가 추가되었습니다.
FP10 의 API를 이용하기 위해서는 프로젝트 생성 후 프로젝트 속성에서 Flex Compiler 선택해보시면 하단에 HTML wrapper 가 있습니다. 거기에 요구되는 Flash Player 버전을 10.0.0 이상을 맞춰주시면 정상적으로 실행됩니다. ;)
나그네 | 2010.01.12 18:34 신고 | PERMALINK | EDIT/DEL | REPLY
1픽셀 늘리는 패치를 사용할 경우 에러가 나는 경우가 있습니다. 24비트 bmp 디코드 시에 decode24BitBMP() 메소드에서 "파일의 끝입니다" IOError 가 발생하더군요.
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2010.03.04 08:36 신고 | PERMALINK | EDIT/DEL
1픽셀 늘리게 수정한 뒤에 테스트는 못 해봤는데 ^^;;;
감사합니다! ^^
Favicon of http://blog.jidolstar.com BlogIcon 지돌스타 | 2010.01.29 19:00 신고 | PERMALINK | EDIT/DEL | REPLY
좋은 정보야~~~~
Favicon of http://stemp.tistory.com BlogIcon 문정환 | 2010.03.03 12:51 신고 | PERMALINK | EDIT/DEL | REPLY
좋은정보가 많이 있네요 ^^
많은 도움이 될것같습니다 좋은정보 감사드립니다^^
| 2012.09.11 11:34 | PERMALINK | EDIT/DEL | REPLY
비밀댓글입니다
- 덧글 좀..(굽신굽신) : 장문의 덧글은 트랙백을 이용해주세요 ;^)
Name
Password
Homepage
Secret
prev"" #1 next