현재 위치: > 최신 기사 목록> ImageFontWidth 함수를 사용하여 글꼴 폭 정보를 확장하여 더 많은 국제 캐릭터의 표시를 지원하는 방법은 무엇입니까?

ImageFontWidth 함수를 사용하여 글꼴 폭 정보를 확장하여 더 많은 국제 캐릭터의 표시를 지원하는 방법은 무엇입니까?

M66 2025-06-11

PHP에서 ImageFontWidth 함수는 내장 글꼴의 단일 문자 너비를 얻는 데 사용됩니다. 기본 글꼴 컬렉션의 문자 너비를 반환하여 GD 라이브러리를 사용하여 텍스트를 그리시 텍스트 너비와 레이아웃을보다 쉽게 ​​계산할 수 있습니다. 그러나 기본 ImageFontWidth는 고정 너비의 내장 글꼴 만 지원하며 국제 캐릭터 (예 : 중국어, 일본어, 한국 등)에 대한 지원이 제한되어 있으며 실제 너비를 정확하게 반영 할 수 없습니다.

이 기사는 확장 또는 사용자 정의를 통해 ImageFontWidth 의 기능을 향상시키는 방법을 살펴보고 더 많은 국제적인 문자 폭에 대한 지원을 달성하여 텍스트 렌더링의 정확성과 미학을 향상시킵니다.


1. ImageFontWidth 함수의 한계

ImageFontWidth (int $ font) : int

  • GD 내장 글꼴 번호 만 허용합니다 (1 ~ 5)

  • 문자의 실제 내용을 무시하고 고정 너비를 반환합니다.

  • 다중 바이트 문자의 너비 계산은 지원되지 않으며 반폭 및 전체 폭으로는 차별화 될 수 없습니다.

예를 들어:

 <?php
$font = 5;
$width = imagefontwidth($font);
echo "Font $font width is $width pixels.";
?>

문자가 영어 또는 중국어이든 상관없이 ImageFontWidth 에 의해 반환 된 너비는 동일하므로 레이아웃 혼동이 발생합니다.


2. 솔루션 아이디어를 확장하십시오

보다 국제적인 캐릭터의 폭을 지원하려면 ImageFontWidth 의 순수한 의존성을 우회해야하며 다음 솔루션을 고려할 수 있습니다.

2.1 사용자 정의 글꼴 파일 및 imagetfbbox 기능 사용

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 제한을 피할 수 있습니다.

2.2 매핑 테이블을 통해 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
?>

이 방법은 충분히 정확하지는 않지만 단순성과 특정 국제 지원을 모두 고려합니다.


3. 확장 너비를 결합하여 완전한 텍스트 너비 계산을 달성합니다.

위의 매핑 체계를 기반으로 텍스트 전체 단락의 너비를 정확하게 계산할 수 있습니다.

 <?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.";
?>

4. 요약

  • ImageFontWidth는 고정형 내장 글꼴에 적합하며 멀티 바이트 국제 문자의 정확한 너비를 지원할 수 없습니다.

  • imagettfbbox 와 사용자 정의 로직을 결합하면보다 정확한 글꼴 폭 정보를 얻고 다국어 지원을받을 수 있습니다.

  • 문자 너비 매핑을 통해 기존 코드를 확장하여 중국어와 일본어의 중국어와 일본 문자의 너비 추정을 실현할 수 있으며, 이는 간단한 시나리오에 적합합니다.

  • 실제 애플리케이션에서는 Truetype Fonts 및 ImagetTfbbox 를 사용하여 문자열의 너비를 측정하여 텍스트 렌더링 효과를 향상시키는 것이 좋습니다.