웹마스터 팁
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
[GD] 이미지 회전 함수 공개합니다.
2001.11.05 14:35
안녕하세요, 요즘 이미지 관리툴을 짜고 있는 막강커플홈 희민닷컴(www.HeeMin.com)의 민이(irismin@heemin.com)라고 합니다.
저희 커플이 디카로 사진 찍는 걸 좋아해서 디카 산 지 4개월여 만에 사진이 거의 2300여장이나 되었습니다.
웹상에서 이미지를 보고 싶을 때, 제로보드를 썼는데, 화일이 많아지니, 올리는 작업도 보통이 아니더군요. 게다가 이미지 용량이 큰 경우, 제로보드의 썸네일 방식으로는 버벅거림이 있기도 하고, 한 꺼번에 올릴 수 있는 방식 등을 고민하다가, FTP, HTTP 를 모두 지원하는 PICDB 프로그램을 짜고 있고, 현재 스킨 처리 부분만 되면 완성 단계입니다. 1.0 버전으로 조만간 공개할까 하네요.. ^^;; (스킨 부분을 뺀 부분)
완성이 되면, DB를 사용하지 않고 빠르고 간편한 웹용 이미지 뷰어, 관리툴이 될 것입니다. 현재 저희 커플은 비밀리에 2300여장의 이미지를 관리하고 있답니다.. ^^;;; 에... 여자친구도 그다지 컴퓨터에 밝지 않은데, 재밌고 간편해서 좋다더군요... 에... 팔이 안으로 굽는 다거나 하는건 아닌 것 같은데..
헷...
그 중에서 제가 마지막에 풀었던 문제입니다.
이미지 회전 함수인데요, 속도가 느립니다. ^^;;;
100x100 정도 크기면 모르겠는데, 640x480 정도 가면 많이 느리군요..
php 자체에서 분산처리를 해보까 하는 생각도 들고... 으음...
하여간 회전은 다 되니까, 일단 공개하겠습니다. 조만간 속도 업글이 된 함수를 다시 공개하겠습니다.
사설이 길었네요.. ㅡ.ㅡ;; 죄송합니다.
--------------------------------------------------------------------
function ImageRotate($src_file, $tag_file, $rotate) {
// ImageRotate function ver 1.0
// -------------------------------------------------------------
// $rotate : 90, 180, 270, horizontal, vertical
// -------------------------------------------------------------
// 이 이미지 회전 함수는 막강커플홈 희민닷컴(www.heemin.com)의
// 민이(irismin@heemin.com)가 만들었습니다.
// 사용하실 때는 고맙다는 인사라도.. ㅡ.ㅡ;;
// 희민닷컴에 오셔서 방명록에 함만 끄적여 주심 감사하겠습니다.
// 속도가 느려서 좀 더 빨리 처리할 수 있는 방법을 고민 중입니다.
// 2001.11.5 -민이-
$src_img=ImageCreateFromjpeg($src_file); //원본
$sx=imagesx($src_img);
$sy=imagesy($src_img);
if ($rotate==180 || $rotate=="horizontal" || $rotate=="vertical") {
$dst_img=ImageCreate($sx, $sy); //빈이미지를 만들어주고
ImageCopyResized($dst_img,$src_img,0,0,0,0,$sx,$sy,$sx,$sy); //줄여서 그려준다
}
else
{
$dst_img=ImageCreate($sy, $sx); //빈이미지를 만들어주고
ImageCopyResized($dst_img,$src_img,0,0,0,0,$sy,$sx,$sx,$sy); //줄여서 그려준다
}
for ($j=0; $j<$sx; $j++) {
for ($i=0; $i<$sy; $i++) {
$pixcol1=imagecolorat($src_img,$j,$i); // 좌표값의 색상을 추출한다
$pixcol2=imagecolorsforindex($src_img, $pixcol1); // 추출된 값의 RGB를 반환
$pixcol3=imagecolorclosest($dst_img,$pixcol2[red],$pixcol2[green],$pixcol2[blue]); // RGB를 변경될 이미지의 색상값이 맞춘 INDEX 값으로 변환
switch ($rotate) {
case 270:
$to_x=$i;
$to_y=$sx-$j-1;
break;
case 90:
$to_x=$sy-$i-1;
$to_y=$j;
break;
case 180:
$to_x=$sx-$j;
$to_y=$sy-$i-1;
break;
case "vertical":
$to_x=$j;
$to_y=$sy-$i-1;
break;
case "horizontal":
$to_x=$sx-$j;
$to_y=$i-1;
break;
}
imagesetpixel($dst_img,$to_x,$to_y,$pixcol3); // 변환된 색상을 목적 포인트에 찍어준다.
}
}
Imagejpeg($dst_img,$tag_file,100); // 화일로 출력
ImageDestroy($dst_img); //메모리 비워주기
ImageDestroy($src_img); //메모리 비워주기
}
참고로, 에... ImageCopyResized($dst_img,$src_img,0,0,0,0,$sy,$sx,$sx,$sy); //줄여서 그려준다
이 부분이 궁금하실 겁니다. 또는 색상을 추출해서 왜 변환했다가 다시 변환하는 지 궁금하신 분들 계시죠? 이 문제는 마치 그림에 글자를 썼는데, 파스텔 통으로 나와버리는 것과 비슷한 문제 때문인데, 각 이미지의 팔레트가 틀려서 그런 것 같아요.
글구, 굳이 회전되어 그려질 부분에 왜 확대,축소해서 그려줘야 하는가 하는 부분은 미스테리입니다. 이 부분도 속도를 꽤 잡아먹고 있는데, 제가 팔레트 땜에 고민하며 수정하다 보니, 절케 되지 않으면 이상한 색으로 되어 버리더군요..
분석해서 결과를 다음 함수에서 밝혀 드리겠습니다.
^^;;; 글고, 저 초보입니다. 소스 지저분해도 용서하세요. PHP 또는 프로그램 배운지 2달밖에 안됐습니다. 원래 디자이너입니다.. ㅋㅋ ㅡ.ㅡ;;
저희 커플이 디카로 사진 찍는 걸 좋아해서 디카 산 지 4개월여 만에 사진이 거의 2300여장이나 되었습니다.
웹상에서 이미지를 보고 싶을 때, 제로보드를 썼는데, 화일이 많아지니, 올리는 작업도 보통이 아니더군요. 게다가 이미지 용량이 큰 경우, 제로보드의 썸네일 방식으로는 버벅거림이 있기도 하고, 한 꺼번에 올릴 수 있는 방식 등을 고민하다가, FTP, HTTP 를 모두 지원하는 PICDB 프로그램을 짜고 있고, 현재 스킨 처리 부분만 되면 완성 단계입니다. 1.0 버전으로 조만간 공개할까 하네요.. ^^;; (스킨 부분을 뺀 부분)
완성이 되면, DB를 사용하지 않고 빠르고 간편한 웹용 이미지 뷰어, 관리툴이 될 것입니다. 현재 저희 커플은 비밀리에 2300여장의 이미지를 관리하고 있답니다.. ^^;;; 에... 여자친구도 그다지 컴퓨터에 밝지 않은데, 재밌고 간편해서 좋다더군요... 에... 팔이 안으로 굽는 다거나 하는건 아닌 것 같은데..
헷...
그 중에서 제가 마지막에 풀었던 문제입니다.
이미지 회전 함수인데요, 속도가 느립니다. ^^;;;
100x100 정도 크기면 모르겠는데, 640x480 정도 가면 많이 느리군요..
php 자체에서 분산처리를 해보까 하는 생각도 들고... 으음...
하여간 회전은 다 되니까, 일단 공개하겠습니다. 조만간 속도 업글이 된 함수를 다시 공개하겠습니다.
사설이 길었네요.. ㅡ.ㅡ;; 죄송합니다.
--------------------------------------------------------------------
function ImageRotate($src_file, $tag_file, $rotate) {
// ImageRotate function ver 1.0
// -------------------------------------------------------------
// $rotate : 90, 180, 270, horizontal, vertical
// -------------------------------------------------------------
// 이 이미지 회전 함수는 막강커플홈 희민닷컴(www.heemin.com)의
// 민이(irismin@heemin.com)가 만들었습니다.
// 사용하실 때는 고맙다는 인사라도.. ㅡ.ㅡ;;
// 희민닷컴에 오셔서 방명록에 함만 끄적여 주심 감사하겠습니다.
// 속도가 느려서 좀 더 빨리 처리할 수 있는 방법을 고민 중입니다.
// 2001.11.5 -민이-
$src_img=ImageCreateFromjpeg($src_file); //원본
$sx=imagesx($src_img);
$sy=imagesy($src_img);
if ($rotate==180 || $rotate=="horizontal" || $rotate=="vertical") {
$dst_img=ImageCreate($sx, $sy); //빈이미지를 만들어주고
ImageCopyResized($dst_img,$src_img,0,0,0,0,$sx,$sy,$sx,$sy); //줄여서 그려준다
}
else
{
$dst_img=ImageCreate($sy, $sx); //빈이미지를 만들어주고
ImageCopyResized($dst_img,$src_img,0,0,0,0,$sy,$sx,$sx,$sy); //줄여서 그려준다
}
for ($j=0; $j<$sx; $j++) {
for ($i=0; $i<$sy; $i++) {
$pixcol1=imagecolorat($src_img,$j,$i); // 좌표값의 색상을 추출한다
$pixcol2=imagecolorsforindex($src_img, $pixcol1); // 추출된 값의 RGB를 반환
$pixcol3=imagecolorclosest($dst_img,$pixcol2[red],$pixcol2[green],$pixcol2[blue]); // RGB를 변경될 이미지의 색상값이 맞춘 INDEX 값으로 변환
switch ($rotate) {
case 270:
$to_x=$i;
$to_y=$sx-$j-1;
break;
case 90:
$to_x=$sy-$i-1;
$to_y=$j;
break;
case 180:
$to_x=$sx-$j;
$to_y=$sy-$i-1;
break;
case "vertical":
$to_x=$j;
$to_y=$sy-$i-1;
break;
case "horizontal":
$to_x=$sx-$j;
$to_y=$i-1;
break;
}
imagesetpixel($dst_img,$to_x,$to_y,$pixcol3); // 변환된 색상을 목적 포인트에 찍어준다.
}
}
Imagejpeg($dst_img,$tag_file,100); // 화일로 출력
ImageDestroy($dst_img); //메모리 비워주기
ImageDestroy($src_img); //메모리 비워주기
}
참고로, 에... ImageCopyResized($dst_img,$src_img,0,0,0,0,$sy,$sx,$sx,$sy); //줄여서 그려준다
이 부분이 궁금하실 겁니다. 또는 색상을 추출해서 왜 변환했다가 다시 변환하는 지 궁금하신 분들 계시죠? 이 문제는 마치 그림에 글자를 썼는데, 파스텔 통으로 나와버리는 것과 비슷한 문제 때문인데, 각 이미지의 팔레트가 틀려서 그런 것 같아요.
글구, 굳이 회전되어 그려질 부분에 왜 확대,축소해서 그려줘야 하는가 하는 부분은 미스테리입니다. 이 부분도 속도를 꽤 잡아먹고 있는데, 제가 팔레트 땜에 고민하며 수정하다 보니, 절케 되지 않으면 이상한 색으로 되어 버리더군요..
분석해서 결과를 다음 함수에서 밝혀 드리겠습니다.
^^;;; 글고, 저 초보입니다. 소스 지저분해도 용서하세요. PHP 또는 프로그램 배운지 2달밖에 안됐습니다. 원래 디자이너입니다.. ㅋㅋ ㅡ.ㅡ;;
댓글 7
-
노경민
2001.11.05 14:40
참참, 회전 옵션으로는 90, 180, 270, horizontal(좌우 바꾸는거), vertical(세로로 바꿔주는 거) 가 있습니다. 다다음 버전쯤엔 임의의 각도로 틀어서 목적 화일에 그려주는 것도... ㅡ.ㅡ;; 이러다 완전 포토샵이 되어버리겠네요.. 크하핫.. -
노경민
2001.11.05 14:42
http://pic.heemin.com/rotate_test.php3여기서 테스트 가능합니다. -
노경민
2001.11.05 14:43
http://pic.heemin.com/rotate_test.php3?rotate=90했다가 http://pic.heemin.com/rotate_test.php3?rotate=180이러면 캐쉬 때문에 아까 나왔던 이미지가 나와버립니다. 이 때는 브라우져를 리프레쉬 해주시면 됩니다. -
노경민
2001.11.05 14:57
아참... 또... $to_y=$sy-$i-1; 이런 부분에서.. -1을 해주는 이유는 이미지 좌표계가 조금 틀려서 그런 것 같아요.. 이렇게 해주지 않으면 맨 아래 나와야할 줄이 위에 나타나거나 오른쪽에 나올 줄이 왼쪽에 나오기도 합니다. -
노경민
2001.11.07 10:53
관련작업을 하다보니 왠만한 이미지 변환은 다 되더군요.. 위와같은 패턴으로... 반전, Contrast, Britness, 등등... 문제는 속도인데... 블록별로 동시 작업을 하는 등의 고민을 하고 있는 중입니다. 혹시 속도 높이실 수 있는 분은 연락 주세요... -
BiHon
2001.11.10 08:47
임의의 각 회전은 계산할 부분이 많아집니다. 50x100 크기의 이미지를 90,180,270 회전하면 크기는 똑같지만 임의의 각으로 회전하게 되면 용량이 늘어납니다. 폭과 높이가 변경되는 것은 두말할 나위도 없죠.
아예 90,180,270,flip,mirror 이렇게 5개 항목만 가능하도록 지정하고, 그 외는 변환없음으로 하는게 낫겠네요.
[예전에 장난치던 함수가 어디 있을듯 한데 발견하거나 새로 작성하게 되면 여기에 올리도록 하겠습니다. 이미지 가지고 놀기...]
또다른 재미거리를 찾아~ 3만리... -
BiHon
2001.11.10 09:24
아참참. 또 힌트를 드릴께요. 코드를 보니 픽셀 하나씩 복사를 했는데 그것에 대한 힌트에요.
이미지를 flip (상하), mirror (좌우) 바꿀때 그냥 카피를 하세요. 이미지의 일정 영역 복사 알죠? ^^
flip의 경우 0,0에서 이미지의 폭,1 이것을 제일 아래로, 그 다음것을 제일 아래 위로... 이런 식으로요.
mirror의 경우 0,0에서 1,이미지의 높이 이것을 제일 우측으로, 그 다음것을 ... 대충 이해하겠죠? ^^ 그럼 즐프로그래밍~!
제목 | 글쓴이 | 날짜 |
---|---|---|
좋은 난수값을 얻기위한 시드배정 방법 mt_srand(), srand() | 차카게살자 | 2002.02.21 |
필터링조금 다른거.. [7] | 두기두바 | 2002.02.10 |
한글 필터링 정확히 하기 [1] | mini | 2002.02.09 |
원고지 함수;; [3] | 디쓰 | 2002.02.07 |
md5() 알고리듬 [8] | 양창민 | 2002.02.05 |
이제 홈페이지 업데이트 안하는 수모를 겪지 말자! [7] | 담배를끊으면복이옴과 | 2002.02.02 |
이제 PHP에 ?id=가나다라 같은것을 넣자! [12] | 담배를끊으면복이옴과 | 2002.01.30 |
초보분들을 위한 연산자 총정리 [6] | TheMics | 2002.01.29 |
[PHP]모르는 분이 있는듯 해서...변수관련 [2] | TheMics | 2002.01.24 |
cron을 이용해 윈앰프 방송정보를 빠르게 분석. [9] | Romeo | 2002.01.15 |
파일시스템에서 비밀번호 생성/수정/인증 [7] | 두기두바 | 2002.01.10 |
파일시스템(배열)에서의 검색기능 [5] | 두기두바 | 2002.01.09 |
[추천 팁] 디망쉬식 스킨 시스템 [4] | 디망쉬 | 2001.12.11 |
[추천 소스] phpMyAdmin 다중사용자용... [5] | WOWpc | 2001.11.29 |
MySQL에서 한글 정렬 문제 [2] | 손정호 | 2001.11.21 |
phpMyAdmin에서 dump 안 되시는 분들 보세요 [5] | 똥가리 | 2001.11.18 |
컴에 phpMyAdmin 깔고 원격 Mysql 관리.(이것도 팁이 되려나?) [1] | 최형삼 | 2001.11.17 |
[추천 소스] 특정일로부터 몇일 지났나 또는 몇일 남았나 알아보는 소스 ㅡ.ㅡ; [1] | 타스케 | 2001.11.15 |
게시판 만들 때 스팸메일을 막을 수 있는 방법중 한개. [11] | WOWpc | 2001.11.09 |
[GD] 이미지 회전 함수 공개합니다. [7] | 노경민 | 2001.11.05 |