PHP
2014.07.09 16:26

PHP GD 설명

조회 수 10121 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
출처 : 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)

Dreamy의 코드 스크랩

내가 모으고 내가 보는

List of Articles
번호 분류 제목 날짜 조회 수 추천 수
341 일반 네트워크 특정 IP 작업그룹/컴퓨터명 정보 조회 1 2015.02.10 10084 0
» PHP PHP GD 설명 2014.07.09 10121 0
339 LINUX 리눅스 시스템 시작시에 자동 실행할 파일 등록하기 2015.09.30 10148 0
338 C# Application 클래스 2013.09.25 10167 0
337 LINUX shutdown 명령어 2013.07.26 10258 0
336 Pi 아두이노 Arduino String Class 2017.07.16 10269 0
335 Android adb로 display 해상도 조정 2015.04.22 10278 0
334 LINUX 리눅스에서 특정작업 or 명령어 반복하기 Crontab 2014.11.10 10346 0
333 Android logcat, main+kernel로그 합치는 로그 2014.10.07 10368 0
332 LINUX 리눅스 부팅시 명령스크립트 실행하기 2015.09.30 10404 0
331 PHP move_uploaded_file() 2014.04.29 10414 0
330 Pi 파이썬 코드를 이용한 파이카메라 제어 2018.04.24 10438 0
329 Pi 키르히호프의 법칙 2016.12.05 10494 0
328 LINUX OpenGrok 설치 빨리하기 2016.04.27 10538 0
327 Pi 칩 저항 사이즈표, 사이즈변환, 와트, 오차표 2019.01.11 10538 0
목록
Board Pagination ‹ Prev 1 ... 7 8 9 10 11 12 13 14 15 16 ... 34 Next ›
/ 34

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5