테스트 사이트 - 개발 중인 베타 버전입니다

텍스트를 이미지로 바꾸는 소스 적용

· 13년 전 · 2099 · 1
파일이름 : txt2img.php utf-8

<?php

define('EMPTY_STRING', '');

//이미지 타입 설정
header('Content-type: image/png');

//이미지 가로 세로의 크기 (GET으로 받아옴)
$im = imagecreatetruecolor($_GET['width'], $_GET['height']);

// 이미지 텍스트의 색상을 정의 RGB
$white = imagecolorallocate($im, 255, 255, 255);
$gray = imagecolorallocate($im, 128, 128, 128);
$magenta = imagecolorallocate($im, 255, 0, 255);
$black = imagecolorallocate($im, 0, 0, 0);
$violet = imagecolorallocate($im, 157, 60, 255);
$blue = imagecolorallocate($im, 68, 162, 255);
$gray = imagecolorallocate($im, 80, 80, 80);
$red = imagecolorallocate($im, 234, 0, 0);
$green = imagecolorallocate($im, 148, 203, 49);


// 텍스트 이미지 기울기 설정
imagefilledrectangle($im, 0, 0, $_GET['width'], $_GET['height'], $white); // <-- $white 글자 배경이미지 색깔

// 폰트의 경로를 작성합니다.(네이버 나눔폰트)
$font_gothic_bold = '/home/tani/public_html/fonts/NanumGothicBold.ttf';
$font_pen = '/home/tani/public_html/fonts/NanumPen.ttf';

// 폰트 설정
if($_GET['font'] == 'pen'){
$font = $font_pen;
}else{
$font = $font_gothic_bold;
}


$text = foxy_utf8_to_nce($_GET['txt']);



$int_x = $_GET['left'];
$int_y = ($_GET['height'] / 2) + ($_GET['font_size'] / 2);


// get으로 받아온 색상값에 따라서 텍스트 이미지 생상 지정
if($_GET['color'] == 'black'){
imagettftext($im, $_GET['font_size'], 0, $int_x , $int_y, $black, $font, $text);
}elseif($_GET['color'] == 'blue'){
imagettftext($im, $_GET['font_size'], 0, $int_x , $int_y, $blue, $font, $text);
}elseif($_GET['color'] == 'gray'){
imagettftext($im, $_GET['font_size'], 0, $int_x , $int_y, $gray, $font, $text);
}elseif($_GET['color'] == 'red'){
imagettftext($im, $_GET['font_size'], 0, $int_x , $int_y, $red, $font, $text);
}elseif($_GET['color'] == 'green'){
imagettftext($im, $_GET['font_size'], 0, $int_x , $int_y, $green, $font, $text);
}elseif($_GET['color'] == 'violet'){
imagettftext($im, $_GET['font_size'], 0, $int_x , $int_y, $violet, $font, $text);
}


// imagepng()함수가 imagejpeg() 함수보다 텍스트가 더 깨끗하게 표현됨
//imagecolortransparent($im, $white); // <-- 이미지 투명처리 2012-08-22 민수추가
imagepng($im);
imagedestroy($im);




// imagettftext 함수에서 한글 UTF-8 방식의 오류를 보정한다.
function foxy_utf8_to_nce(
$utf = EMPTY_STRING
) {
if($utf == EMPTY_STRING) return($utf);

$max_count = 5; // flag-bits in $max_mark ( 1111 1000 == 5 times 1)
$max_mark = 248; // marker for a (theoretical ;-)) 5-byte-char and mask for a 4-byte-char;

$html = EMPTY_STRING;
for($str_pos = 0; $str_pos < strlen($utf); $str_pos++) {
$old_chr = $utf{$str_pos};
$old_val = ord( $utf{$str_pos} );
$new_val = 0;

$utf8_marker = 0;

// skip non-utf-8-chars
if( $old_val > 127 ) {
$mark = $max_mark;
for($byte_ctr = $max_count; $byte_ctr > 2; $byte_ctr--) {
// actual byte is utf-8-marker?
if( ( $old_val & $mark ) == ( ($mark << 1) & 255 ) ) {
$utf8_marker = $byte_ctr - 1;
break;
}
$mark = ($mark << 1) & 255;
}
}

// marker found: collect following bytes
if($utf8_marker > 1 and isset( $utf{$str_pos + 1} ) ) {
$str_off = 0;
$new_val = $old_val & (127 >> $utf8_marker);
for($byte_ctr = $utf8_marker; $byte_ctr > 1; $byte_ctr--) {

// check if following chars are UTF8 additional data blocks
// UTF8 and ord() > 127
if( (ord($utf{$str_pos + 1}) & 192) == 128 ) {
$new_val = $new_val << 6;
$str_off++;
// no need for Addition, bitwise OR is sufficient
// 63: more UTF8-bytes; 0011 1111
$new_val = $new_val | ( ord( $utf{$str_pos + $str_off} ) & 63 );
}
// no UTF8, but ord() > 127
// nevertheless convert first char to NCE
else {
$new_val = $old_val;
}
}
// build NCE-Code
$html .= '&#'.$new_val.';';
// Skip additional UTF-8-Bytes
$str_pos = $str_pos + $str_off;
}
else {
$html .= chr($old_val);
$new_val = $old_val;
}
}
return($html);
}

?>



\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
질문 :
위에서 38라인쯤에
$text = foxy_utf8_to_nce($_GET['txt']);
이부분인데 익스 6에서만 한글이.. 깨집니다. ^^; 영어숫자는 나오구요

$text = foxy_utf8_to_nce("메롱");
이렇게 하면 익스 6에서도 잘 나옵니다.
문서형식은 UTF-8 입니다.

출력부분:
<img src='$g4[path]/txt2img.php?width=80&height=10&color=green&font=pen&left=0&font_size=18&txt=$gSubject' border='0'>


별짓을 다 해봤는데 iconv 가져다가 붙여보기도 하고
안되서 질문좀 올려봅니다.
바쁘신데 읽어주신분들 감사합니다. ^^

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 1개

13년 전
해결했습니다. ^^
혹시 저같이 해메실분 있으실거 같아서
$gSubject2 = urlencode($gSubject);
요렇게 해주시면 됩니다. ㅎㅎ 아이고 반나절 지나갔네요 머리 나쁘면 몸이 고생합니다. 헐.. ㅎㅎ

게시글 목록

번호 제목
284508
284499
284492
284490
284484
284481
284478
284476
284474
284472
284470
284458
284457
284454
284453
284447
284446
284444
284441
284440