PHP를 사용하여 이미지를 처리 할 때, 우리는 종종 ImageFontWidth () 함수를 사용하여 특정 글꼴 크기의 문자 너비를 얻으므로 이미지에서 텍스트의 정확한 장소 보유를 계산합니다. 그러나 많은 개발자들이 번거로운 문제에 직면하게됩니다. ImageFontWidth ()에 의해 반환 된 너비는 항상 실제 디스플레이 효과와 일치하지 않으므로 텍스트 위치가 혼란 스럽거나 잘립니다. 이 기사는이 문제의 원인을 깊이 분석하고 신뢰할 수있는 솔루션을 제공합니다.
ImageFontWidth (int $ font) 는 PHP GD 라이브러리가 지정된 글꼴 크기로 문자의 픽셀 너비를 얻기 위해 제공하는 기능 중 하나입니다. GD 라이브러리에 내장 된 비트 맵 글꼴에서만 작동하며 글꼴 크기는 일반적으로 정수 값 (1 ~ 5)입니다.
샘플 코드 :
$width = imagefontwidth(5);
echo "글꼴 너비는입니다:$width 픽셀";
일반적으로 문제는 다음과 같은 측면에서 발생합니다.
ImageFontWidth () 는 내장 비트 맵 글꼴에만 유효하며 TRUETYPE 글꼴 (TTFS)에는 적용 할 수 없습니다. 많은 개발자들이 imageTtfText ()를 사용하여 TTF 글꼴을 잘못 렌더링하여 필연적으로 잘못된 결과로 이어질 것입니다.
내장 글꼴을 사용하더라도 ImageFontWidth () 는 단일 문자의 너비를 반환합니다. 전체 문자열을 렌더링하는 경우 문자열 길이를 곱해야합니다.
$font = 5;
$text = "Hello";
$width = imagefontwidth($font) * strlen($text);
문자열에 멀티 바이트 문자 (예 : 중국어)가 포함 된 경우 strlen ()에 의해 반환 된 길이는 부정확하며 대신 mb_strlen ()을 사용해야합니다.
$width = imagefontwidth($font) * mb_strlen($text, 'UTF-8');
PHP의 비트 맵 글꼴을 수동으로로드 할 필요는 없지만 사용자 정의 글꼴 경로 또는 시스템 글꼴을 사용하는 경우 다른 렌더링 기능이 혼합되어 이해 오류가 발생할 수 있습니다.
imagefontwidth ()를 직접 사용하여 글꼴 번호가 1 ~ 5 범위에 있는지 확인하고 strlen () 또는 mb_strlen ()을 사용하십시오.
$font = 3;
$text = "Welcome";
$width = imagefontwidth($font) * strlen($text);
TTF 글꼴의 경우 imageFontWidth ()가 유효하지 않습니다. 지정된 글꼴 아래에 문자열의 경계 상자를 가져 오려면 imageTtfbbox ()를 사용해야합니다. 그런 다음 좌표에 따라 너비를 계산해야합니다.
$fontFile = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf";
$fontSize = 14;
$text = "Welcome";
$bbox = imagettfbbox($fontSize, 0, $fontFile, $text);
$width = abs($bbox[2] - $bbox[0]);
이 예에서 $ bbox는 텍스트 테두리의 네 모서리를 나타내는 8 개의 요소 배열을 반환합니다. 너비는 오른쪽 상단 코너와 왼쪽 상단 모서리 사이의 수평 축 차이로 계산할 수 있습니다.
$img = imagecreate(200, 50);
$bg = imagecolorallocate($img, 255, 255, 255);
$color = imagecolorallocate($img, 0, 0, 0);
$fontFile = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf";
$text = "Hello World";
$fontSize = 12;
$bbox = imagettfbbox($fontSize, 0, $fontFile, $text);
$textWidth = abs($bbox[2] - $bbox[0]);
$x = (200 - $textWidth) / 2;
$y = 30;
imagettftext($img, $fontSize, 0, $x, $y, $color, $fontFile, $text);
header("Content-Type: image/png");
imagepng($img);
imagedestroy($img);
이런 식으로, 우리는 TTF 글꼴조차도 정확한 너비와 센터링 위치를 얻도록합니다.
Imagestring () 및 imagetftext ()를 혼합하지 마십시오. 각각 비트 맵 및 TTF 글꼴에 적합합니다.
ImageFontWidth () 에 의해 반환 된 결과는 DPI 설정의 영향을받지 않지만 imageTtfbbox ()는 논리 픽셀을 계산하고 글꼴 파일의 영향을받습니다.
다른 서버에 배포 된 경우 글꼴 파일 경로가 존재하고 액세스 할 수 있는지 확인하십시오. 예 : https://m66.net/fonts/dejavusans.ttf
ImageFontWidth ()가 잘못된 너비를 반환하는 경우 대부분의 경우 호환되지 않는 글꼴 유형을 사용하거나 총 문자 수의 제품을 무시하기 때문입니다. TTF 글꼴을 처리 할 때이 기능의 범위를 이해하고 imagetfbbox ()를 사용하는 것이 문제를 해결하는 데 핵심입니다. 도구를 올바르게 선택하면 이미지를 처리 할 때 원하는 정확한 레이아웃과 효과를 얻을 수 있습니다.