출처 : http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=69435
- gd 란 ? -
boutell 씨(?) 가 만든 png, jpg, gif 등 을 다루는 c library 로,
(아마도) 설치가 간편하고 크기가 작다는 이유로 널리 쓰이게 된 라이브러리.
php extension 으로 wrapping 되면서 폭발적인 인기를 누리게 되었다고 생각됨.
gif 의 압축 알고리즘인 lzw 의 라이센스 때문에 한동안 gd 에서 gif 를 다루지 못하기도 하였는데,
라이센스 기간의 만료로 gif 다루는 것에도 자유로워 졌음.
코드를 보면 animated gif 에도 대응하려 한 흔적이 있는데,
현재 가능하지는 않음.
animated gif 를 읽으면 첫장만 읽힘.
freetype 을 이용하여 글자도 찍을 수 있고,
이제는 완전히 php 그룹에서 관리하여 bundle 되었기 때문에
php 에서는 gd 를 따로 설치할 필요도 없음.
gd 를 여태 따로 설치하고 있었다면 ./configure --help 해보기를 권장함.
1. gd 는 truecolor 를 지원하는 라이브러리.
imagecolorallocate() 는 indexed color 를 다루기 위한 함수이다.
indexed color 란 256 색 이하의 색상만을 표현할 수 있는 방식으로,
palette 라는 개념이 있다.
이 palette 에 2 의 배수 (2색(흑백), 4, 8, 16, 32, 64, 128, 256) 단위로
색상을 '미리 지정해 놓고' 팔레트의 번호(indexed)로써 색을 표현하는 방식이다.
때문에 많은 색상을 표현하기는 당연히 안되므로,
imagecolorclosest() 라는 근접한 색상을 반환하는 함수도 존재한다.
하지만 지금은 뭐가 아쉬워서 256색이라는 제한에 갇혀 있겠는가?
truecolor 로 맘껏 표현해 놓고 gif 로 저장할 때만 슬쩍 256 색으로 바꿔주면 된다.
imagetruecolortopalette()
이는 크기를 변경한다거나, 글을 쓴다거나 할 때
얼마나 부드럽게 표현 (anti alias 등) 되는가에 중대한 영향을 끼친다.
2. gd 에서 truecolor 색상값은 그냥 3bytes hex code.
함수로 불러오고 변환하고 그런것은 필요하지 않다.
이미지를 트루컬러로 생성하고, 색상을 적어주면 된다.
포토샵에서 익숙하던 그것. 빨강(R), 녹색(G), 파랑(B) 이 0~255 단계로 구분되는 그것.
16진수로 0~ff 로 표현되는 그것.
php 에서는 간단하게 0xffffff 로 표현하면 255, 255, 255 의 흰색이다.
imagecreatetruecolor(), imagecreatefromjpeg(), imagecreatefrompng() 등 으로
생성된 이미지는 트루컬러이고 여기에는 색상을 allocate 할 필요가 없는 것이다.
주의할 것은 png 는 indexed color 도 취급한다는 것이다.
원본이 truecolor 인지 확인할 필요가 있다. imageistruecolor()
3. gd 에서의 투명 (transparent vs alpha)
indexed color 에서는 투명은 '점을 찍지 않는것'이다.
팔레트에 미리 지정하고 그 색을 사용하는 indexed color 에서는
팔레트 하나를 transparent 로 지정하여 해당 점을 찍지 않음으로 투명을 표현한다.
때문에 anti alias 와는 친해질 수 없고,
톡박에 올라오는 animated gif 가 허연테두리가 보기 싫게 붙는 것이다.
반면, truecolor 에서의 투명은 말 그대로 투명이다.
투과되어 뒤가 보이는 것이다.
투명한 정도를 alpha 값으로 표현하고,
imagecopy() 등으로 이미지를 겹칠 때
투명도에 따라 충실히 색상을 섞어서 뒤가 비쳐보이는 효과를 낼 것이다.
투명도는 0~127 (0~7f) 의 값을 가지고 rgb 앞에 온다. (argb)
0x7fffffff 로 표현하면 완전히 투명한 흰색이 된다.
완전히 투명하기에 뒤에 오는 ffffff 는 의미가 없겠지만,
색상이 '겹칠 때' 는 또 다르다.
항상 겹치면 원하는 대로 표현할 수 없으므로
imagealphablending() 이라는 함수로 겹치지 않게 할 수도 있다.
gd 에서 결과물에 투명정보가 그대로 남는 이미지 형식은 png 뿐이다.
게다가 imagesavealpha() 를 반드시 해 주어야만 남는다.
4. 결론
<?
$img = imagecreatetruecolor(199, 199);
imagealphablending($img, false);
imagefilledrectangle($img, 0, 0, 198, 198, 0x7fffffff);
imagealphablending($img, true);
imagefilledellipse($img, 99, 99, 199, 100, 0x30ff0000);
imagefilledellipse($img, 99, 99, 100, 199, 0x300000ff);
$img2 = imagecreatetruecolor(121, 121);
imagealphablending($img2, false);
imagefilledrectangle($img2, 0, 0, 120, 120, 0x3000ff00);
imagecopy($img, $img2, 39, 39, 0, 0, 121, 121);
imagefttext($img, 80, 0, 5, 100, 0x30000000, 'ms_gungsuh.ttf', "확대를 하면\nanti alias 까지\n깔끔하게 먹힌\n것이 보인다.");
//작은 글꼴을 깔끔하게 표현하기 위한 비트맵 글꼴이 포함되어 있는 글꼴은 크기가 작으면 안티알리아스 되지 않는다. 바탕,굴림,돋움,궁서 가 그러하다.
imagesavealpha($img, true);
imagepng($img, 'test.png');
?>
5. 도형이 anti alias 가 안되는 것에 불만이면, php cairo wrapper 를 알아보자.
imageantialias() 를 시험해 보는 것을 말리지는 않겠다.
6. IE6 png alpha 는 구글님에게 물어보자.
http://www.google.co.kr/search?q=ie6+png+alpha&ie=utf-8&oe=utf-8&aq=t&rls=org.gentoo:en-US:official&client=firefox-a
추천 : http://www.dillerdesign.com/experiment/DD_belatedPNG/
Written by Song Hyo-Jin (shj at xenosi.de)
License : Creative Commons - Attribution (CC-BY)