2011-09-15 2 views
4

잘 작동하는 newPseudoImage에 어노테이션 텍스트를 추가하고 있지만 이미지 크기에 맞게 텍스트 크기를 만들고 싶습니다.PHP 텍스트 어노테이션에 가장 잘 어울리는 방법을 Imagick

어떻게 생각하나요?

$im = new Imagick(); 
$draw = new ImagickDraw(); 

$draw->setFillColor($color); 
$draw->setFont($font); 
$draw->setFontSize(($width, $height)/100) * 15); 
$draw->setGravity(Imagick::GRAVITY_CENTER); 

$im->newPseudoImage($width, $height, "canvas:{$bg}"); 
$im->annotateImage($draw, 0, 0, 0, $text); 

$draw->clear(); 
$draw->destroy(); 

$im->setImageFormat('gif'); 

header("Content-Type: image/gif"); 
echo $im; 
+0

정말 아무도 대답이 없습니까? – DrKHunter

답변

8

imageftbbox 기능을 사용하면 도움이 될 것으로 생각합니다.

주어진 ttf 글꼴, 크기 및 각도로 텍스트 문자열의 경계 상자를 제공합니다.

텍스트가 이미지에 적절하게 맞지 않는 한 글꼴 크기를 늘리거나 줄이려면 루프를 만들 수 있습니다.

<?php 

$bbox = imageftbbox(12, 0, 'Arial.ttf', 'This is a test'); 
$width_of_text = $bbox[2] - $bbox[0]; 

당신은 $width_of_text보고 글꼴이 원하는대로 조정되지 않는 한 글꼴 크기를 조정할 수 있습니다. 글꼴을 늘리면 너비와 높이가 커집니다.

확장하려는 항목에 따라 도움이 될 수 있습니다.

1

저도 같은 문제에 직면하고있어 난 도망 내 컴퓨터에서 해요 나는 아직이 시도하지 적이 있지만, 나는이 갈 줄거야.

클래스의 쿼리 글꼴 메트릭 기능을 사용하면 계산 된 너비의 텍스트를 가져 와서 컨테이너의 지정된 너비와 비교할 수 있습니다. 나는 글꼴 크기를 조정하고 충분히 가까울 때까지 반복 할 것이다. 이 방법은 꽤 정확할 수 있지만 이미지에 여러 텍스트 항목이있을 경우 가능한 성능 문제를 염두에 두어야합니다.

반면에 텍스트 스타일링에 신경 쓰지 않는다면 캡션을 사용할 수 있습니다.

+1

이것은 이론적으로 질문에 대답 할 수 있지만 여기에 대답의 핵심 부분을 포함하고 참조 용 링크를 제공하는 것이 바람직합니다 (http://meta.stackexchange.com/q/8259). –

-1

이것은 약간의 순진한 해결책입니다. (적절한 글꼴 크기를 찾기 위해 이진 검색을 사용할 수는 있지만) 저에게는 효과적입니다.

예를 들어 이미지의 상자에 텍스트를 넣으므로 imageftbbox를 사용하여 적절한 글꼴 크기를 계산합니다.

$size = $MAX_FONT_SIZE; 
while (true){ 
    $bbox = imageftbbox($size, 0, $font, $text); 
    $width_of_text = $bbox[2] - $bbox[0]; 
    if ($width_of_text > $MAX_TEXT_WIDTH) { 
      $size -= 1; 
    } 
    else { 
      break; 
    } 
} 
$height_of_text = ($bbox[3] - $bbox[1]); 
$draw->setFontSize($size); 
$image->annotateImage($draw, $TEXT_WIDTH_CENTER - $width_of_text/2, $TEXT_HEIGHT_CENTER - $height_of_text/2, 0, $text); 
관련 문제