PHP에서 ImageFontWidth 함수는 내장 글꼴의 단일 문자 너비를 얻는 데 사용됩니다. 기본 글꼴 컬렉션의 문자 너비를 반환하여 GD 라이브러리를 사용하여 텍스트를 그리시 텍스트 너비와 레이아웃을보다 쉽게 계산할 수 있습니다. 그러나 기본 ImageFontWidth는 고정 너비의 내장 글꼴 만 지원하며 국제 캐릭터 (예 : 중국어, 일본어, 한국 등)에 대한 지원이 제한되어 있으며 실제 너비를 정확하게 반영 할 수 없습니다.
이 기사는 확장 또는 사용자 정의를 통해 ImageFontWidth 의 기능을 향상시키는 방법을 살펴보고 더 많은 국제적인 문자 폭에 대한 지원을 달성하여 텍스트 렌더링의 정확성과 미학을 향상시킵니다.
ImageFontWidth (int $ font) : int
GD 내장 글꼴 번호 만 허용합니다 (1 ~ 5)
문자의 실제 내용을 무시하고 고정 너비를 반환합니다.
다중 바이트 문자의 너비 계산은 지원되지 않으며 반폭 및 전체 폭으로는 차별화 될 수 없습니다.
예를 들어:
<?php
$font = 5;
$width = imagefontwidth($font);
echo "Font $font width is $width pixels.";
?>
문자가 영어 또는 중국어이든 상관없이 ImageFontWidth 에 의해 반환 된 너비는 동일하므로 레이아웃 혼동이 발생합니다.
보다 국제적인 캐릭터의 폭을 지원하려면 ImageFontWidth 의 순수한 의존성을 우회해야하며 다음 솔루션을 고려할 수 있습니다.
imagettfbbox는 지정된 트루 타입 글꼴 파일에서 문자열의 경계 상자 크기를 측정 할 수 있습니다. 다국어 텍스트에 적합하며 다중 바이트 인코딩을 지원합니다.
예:
<?php
$fontFile = 'm66.net/fonts/YourFont.ttf'; // 사용자 정의 글꼴 경로
$text = "안녕하세요,world!";
$fontSize = 16;
$bbox = imagettfbbox($fontSize, 0, $fontFile, $text);
$width = abs($bbox[2] - $bbox[0]);
echo "Text width is $width pixels.";
?>
이를 통해 텍스트 너비를 정확하게 얻고 ImageFontwidth 제한을 피할 수 있습니다.
ImageFontWidth 통화 인터페이스와 호환 해야하는 경우 문자 인코딩 범위에 따라 해당 폭을 내부적으로 반환하는 사용자 정의 기능을 만들 수 있습니다.
예:
<?php
function extendedImageFontWidth(int $font, string $char): int {
// 내장 글꼴의 표준 너비
$baseWidth = imagefontwidth($font);
// Unicode전체 폭을 결정하기위한 인코딩
$ord = mb_ord($char, 'UTF-8');
// 일반적인 중국어、일본어、한국 캐릭터는 대략적으로 다양합니다
if (($ord >= 0x4E00 && $ord <= 0x9FFF) || // CJK Unified Ideographs
($ord >= 0x3000 && $ord <= 0x303F) || // CJK Symbols and Punctuation
($ord >= 0xFF00 && $ord <= 0xFFEF)) { // Halfwidth and Fullwidth Forms
return $baseWidth * 2; // 전폭 문자 너비가 두 번이라고 가정하십시오
}
return $baseWidth; // 반 폭의 캐릭터
}
// 사용 예제
$font = 5;
$char1 = "A";
$char2 = "너";
echo extendedImageFontWidth($font, $char1) . "\n"; // 예를 들어, 반환 9
echo extendedImageFontWidth($font, $char2) . "\n"; // 반품 18
?>
이 방법은 충분히 정확하지는 않지만 단순성과 특정 국제 지원을 모두 고려합니다.
위의 매핑 체계를 기반으로 텍스트 전체 단락의 너비를 정확하게 계산할 수 있습니다.
<?php
function extendedImageFontWidth(int $font, string $char): int {
$baseWidth = imagefontwidth($font);
$ord = mb_ord($char, 'UTF-8');
if (($ord >= 0x4E00 && $ord <= 0x9FFF) ||
($ord >= 0x3000 && $ord <= 0x303F) ||
($ord >= 0xFF00 && $ord <= 0xFFEF)) {
return $baseWidth * 2;
}
return $baseWidth;
}
function getTextWidth(int $font, string $text): int {
$width = 0;
$len = mb_strlen($text, 'UTF-8');
for ($i = 0; $i < $len; $i++) {
$char = mb_substr($text, $i, 1, 'UTF-8');
$width += extendedImageFontWidth($font, $char);
}
return $width;
}
// 예
$font = 5;
$text = "Hello,세계!";
echo "Text width: " . getTextWidth($font, $text) . " pixels.";
?>
ImageFontWidth는 고정형 내장 글꼴에 적합하며 멀티 바이트 국제 문자의 정확한 너비를 지원할 수 없습니다.
imagettfbbox 와 사용자 정의 로직을 결합하면보다 정확한 글꼴 폭 정보를 얻고 다국어 지원을받을 수 있습니다.
문자 너비 매핑을 통해 기존 코드를 확장하여 중국어와 일본어의 중국어와 일본 문자의 너비 추정을 실현할 수 있으며, 이는 간단한 시나리오에 적합합니다.
실제 애플리케이션에서는 Truetype Fonts 및 ImagetTfbbox 를 사용하여 문자열의 너비를 측정하여 텍스트 렌더링 효과를 향상시키는 것이 좋습니다.