PHP
2014.07.09 16:26

PHP GD 설명

조회 수 10032 댓글 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
번호 분류 제목 날짜 조회 수 추천 수
17 PHP php 기본 문법 정리 secret 2014.01.16 0 0
16 PHP MySQL 기본 문법 2014.03.01 12444 0
15 PHP move_uploaded_file() 2014.04.29 10335 0
14 PHP Header for XML content in PHP file 2014.06.02 11262 0
13 PHP GD 라이브러리 간단 2014.07.09 9296 0
» PHP PHP GD 설명 2014.07.09 10032 0
11 PHP GD 및 이미지 함수 정리 2014.07.09 12678 0
10 PHP Simple GD example 2014.07.10 7737 0
9 PHP PHP 문자열 다루기 2015.06.30 24697 0
8 PHP 파일 데이터 저장하고 불러오기(파일 입출력) 2015.09.30 8386 0
7 PHP php 배열 사용하기 2015.10.28 12266 0
6 PHP 윈도우용 센드메일 구축 2016.03.30 8281 0
5 PHP SQL 일정 시간단위로 데이터 검색하기 2020.02.12 4916 0
4 PHP [PHP] .php 확장자 없이 URL 접속하기 2020.10.26 4465 0
3 PHP SQL :: EXIST , NOT EXIST 2022.09.05 1313 0
목록
Board Pagination ‹ Prev 1 2 Next ›
/ 2

나눔글꼴 설치 안내


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

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

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5