우라질 쫀듸기같은 GD
같은 코드가 환경에따라 이렇게도 나오고 저렇게도 나온다. 근데 이게 사소한 것도 아니고 그래픽 처리에 상당히 많이 이용될 것 같은 부분에 이렇게 버그가 있다는건 좀 이해가 안간다. 지금까지 발견한건 두개. 문제가 된 두대의 컴퓨터의 세팅은 각각 Linux + PHP 4.3.1 + GD Version 2.0 or higher (Cafe24 계정이다), WindowsXP + PHP 4.3.10 + GD Version bundled (2.0.28 compatible) (이건 집 컴퓨터)
- imageCopyResampled
-
원본 이미지의 src_x, src_y 부터 src_width, src_height 만큼을 잘라 대상 이미지의 dst_x, dst_y 좌표에서 dst_width, dst_height 만큼의 공간에 이미지를 늘이거나 줄여 복사해주는 함수다. 문제가 되는 부분은 src_x, src_y 에 특정한 값을 셋팅해도 무조건 0으로 받아들인다는 점. 그래서 src_x, src_y 가 0이 아닌 특정 부분으로부터 이미지를 읽어오는게 불가능하다.
해결방법은 임시로 캔버스를 하나 만들어 imageCopy 함수를 이용해 원본 이미지로부터 이미지를 복사해 캔버스에 붙여넣은 다음 imageCopyResampled 함수로 임시 캔버스에 복사해둔 이미지를 원하는 위치에 붙여넣으면 된다.
PHP 4.3.11 + GD bundled (2.0.28 compatible) 버전을 사용하는 몇몇 컴퓨터에서는 제대로 돌아가기도 함
테스트 코드
<? header("Content-type: image/jpeg"); $old_image = imageCreateFromJpeg("test.jpg"); $new_image = imageCreateTrueColor(640, 480); imageCopyResampled($new_image, $old_image, 0, 0, 144, 66, 640, 480, 360, 200); imageJpeg($new_image, null, 100);?>
- imageColorTransparent
-
imageCreateTrueColor 함수로 생성한 캔버스는 검정색 바탕인데 imageColorTransparent 함수를 이용하면 바탕색을 투명하게 만들수 있다. 하지만 상황에따라 제대로 동작하지 않는 경우가 있는데..
아래의 테스트 코드를 실행하면 100x100 사이즈의 투명한 PNG 파일이 만들어져야 하지만 내가 테스트 한 곳에서는 그냥 검은색의 박스만 만들어졌다. 테스트를 부탁드린분의 PHP 5.0.4 + GD Version bundled (2.0.28 compatible) 환경, 같은 버전의 GD를 쓰는 또다른 곳의 PHP 4.3.10에서는 정상적으로 투명한 이미지가 만들어진걸 확인할 수 있었다.
코드가 정상적으로 돌아가는 곳에서 만들어진 PNG라도 파이어폭스나 IE의 alphaimageloader 필터에서는 정상적으로 투명한 이미지로 보이지만 일반적인 이미지 뷰어나 포토샵등에서는 그냥 까만색 박스로 보이는 문제가 있다. 그래서 투명한 캔버스 위에 이것저것 얹어서 최종 결과물을 얻는데는 문제가 있어보인다. 내부적으로 투명한 이미지를 다루기 위해 임시로 사용하는데는 문제가 없는 것 같음.
테스트 코드
<? header("Content-type: image/png"); $image = imageCreateTrueColor(100, 100); $black = imageColorAllocate($image, 0, 0, 0); imageColorTransparent($image, $black); imagePng($image);?>덧붙임,
위의 코드는 완벽하게 삽질이라는게 밝혀졌다. 음하하;; imageColorTransparent 함수는 색을 투명하게 하는게 아니고 8bit 컬러 팔레트에서 특정한 색을 투명색으로 '지정'만 해주는거다. 그래서 투명 GIF 만들때나 필요한 것이고 트루컬러 이미지를 다룰때는 필요가 없는 함수 되겠다..orz
올바른 코드
<? header("Content-type: image/png"); $image = imageCreateTrueColor(100, 100); imageAlphaBlending($image, 0); imageFilledRectangle($image, 0, 0, 100, 100, 0x7fffffff); imagePng($image);?>이렇게 캔버스 위에 imageFilledRectangle 함수로 투명한 사각형을 그려주면 끝! 6번째 인수의 컬러값 맨 처음에 나오는 7f가 투명도를 지정하는 부분이다. 50% 투명도를 가진 빨간색이라면 0x40FF0000 이 된다.
이렇게 만들어진 PNG 파일은 당연히 포토샵등에서도 투명한 이미지로 인식해준다. 만세 -_-)/
혹시라도 다른데 문제가 있거나 내 실수로 잘못 안거였으면 좋겠는데.. 지금으로써는 문제가 있는 부분을 회피해서 이런저런 꼼수를 써야하고 그나마 다른 서버에서 제대로 돌아가준다는 보장이 없으니 난감하다. ImageMagick 같은 라이브러리를 쓰고싶어도 GPL의 압박으로 낭패. PHP4에 어마어마한 결함이 발견돼서 사람들이 전부다 PHP5로 업데이트 하는 사태라도 일어나길 바란다-_-
'컴퓨터 얘기 > 프로그래밍' 카테고리의 다른 글
| 실용예제로 배우는 웹표준 (7) | 2005/08/11 |
|---|---|
| Google Talk (8) | 2005/08/09 |
| 우라질 쫀듸기같은 GD (3) | 2005/07/21 |
| MSN으로 태터툴즈 댓글 알림받기 (16) | 2005/07/15 |
| 인터넷 만화 RSS 몇개 (14) | 2005/06/14 |
| 태터툴즈 고쳐쓰기 #12 - 답글에 국가 아이콘 표시하기 (29) | 2005/06/12 |