YesYo.com MintState Forums  
뒤로    YesYo.com MintState BBS > Tech > PHP
검색
멤버이름  오토
비밀번호 
 

 
작성일 : 11-04-17 23:56
GD 라이브러리
 글쓴이 : MintState
조회 : 7,312  
GD 라이브러리

- 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. 결론
<?php 
$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)

출처 : http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=69435
Rated 0/5 (0%) (0 Votes)

(\__/)
(='.'=)
(")_(")~
Search Infomation by MintState
MintState

 
 

Total 160
번호 제   목 글쓴이 날짜 조회
160 첫문자를 대문자, 소문자로 변경하는 함수 MintState 08-08 245
159 header를 이용한 페이지 이동 함수 MintState 07-31 247
158 URL에서 한글만 인코딩 MintState 05-29 349
157 youtube preg_replace pattern MintState 02-22 635
156 특정 디렉토리의 하위파일 목록 가져오기 MintState 02-21 631
155 [정규식] 해시태그(#) 뽑아내기 MintState 11-12 2530
154 serialize unserialize 배열정보를문자열의 형태로 변환 MintState 12-08 2553
153 실시간 화면 출력 flush, ob_flush MintState 02-26 4999
152 [MYSQL] 생년월일로 나이 반환 MintState 01-22 7027
151 php 절사 MintState 07-27 4889
150 Referer URL 이용하여 검색엔진 키워드 뽑아내기 MintState 02-10 5437
149 달력 소스 MintState 10-21 5692
148 MYSQL 예약어 MintState 05-02 7925
147 페이징 클래스 v1.0 (PHP4/5) MintState 04-18 6767
146 GD 라이브러리 MintState 04-17 7313
145 GD를 이용한 기본기능 썸네일,CROP,CROP썸네일,텍스트 만들기 MintState 04-17 6883
144 xml 통신(수신) - Web 언어별 MintState 03-14 7224
143 무조건 알아야 할 PHP 속도 테스트 14 가지 MintState 03-04 6955
142 PHP를 이용하여 MYSQL Sleep 프로세스 죽이기 MintState 01-18 8547
141 youtube 주소로 정보 반환 MintState 07-02 8703
140 방문자의 브라우저와 OS등을 가져 오는 클레스 MintState 07-02 11205
139 Allowed memory size Error 발생시 처리방법 MintState 06-30 9168
138 AES 256-bit 암호화 MintState 04-28 14648
137 PHP 5.3.0 부터 POSIX Regex 함수 제거 MintState 02-12 8513
136 [Function] json_encode(), json_decode() MintState 01-13 14763
 1  2  3  4  5  6  7  
모바일 버전으로 보기
CopyRight ©2004 - 2017, YesYo.com MintState. ™