2013-06-21 1 views
0

나보다 PHP 경험이 많은 사람들의 도움에 감사드립니다.PHP로 이미지에 ttf 문자 추가하기

PHP를 사용하여 가까운 텍스트 이미지를 생성합니다. 지금까지는 다음과 같이 작동합니다.

  1. 먼저 x 문자의 임의의 문자열을 생성합니다.
  2. 는 그 다음 등 배경 이미지를 만드는 그것은
  3. 그 다음은 다음 문자를 배치 (크기의 일부 무작위 화, 회전 등으로) 특정 장소에서 첫 번째 문자를 배치

  4. 있도록 왼쪽 아래 테두리 상자의 모서리는 문자의 경계 상자의 오른쪽 하단 모서리와 같은 지점에 있습니다 (일부 무작위 등). 그 코드는 다음과 같이 간다 : 문자열의 이후의 각 문자에 대한

    $coords = array(); 
    $pos_y = $this->image_height/2; 
    
    for ($counter = 0; $counter < $this->code_length; $counter++){ 
        $sbox = @imagettfbbox($size, $angle, $font, $this->code[$counter]); 
        if($counter == 0) 
         $pos_x = $this->image_width/$this->code_length; 
        else 
         // element 2 is the x co-ord of the bottom right corner of the ttf box 
         $pos_x = $coords[$counter-1][2]; 
        @imagettftext($this->image, $size, $angle, 
         $pos_x, $pos_y, $fontcolor, $font, $this->code[$counter]); 
    } 
    
  5. 반복 4.

나는 가능한 한 모든 캐릭터가 이웃을 만지고 싶어한다. 내가 지금까지 해왔 던 것은 글리프의 하단 모서리가 테두리 상자의 모서리에 다소있는 'M'과 같은 문자에는 잘 작동하지만 'G'나 'I'와 같은 문자는 어디에도 없습니다.

경계 상자가 아닌 ttf 글리프의 실제 치수를 얻는 방법을 알고있는 사람이 있습니까? 아니면 누구든지이 문제에 접근하는 더 좋은 방법을 생각할 수 있습니까?

의견/아이디어/조언을 많이 주셨습니다.

+0

(당신이 그리 개요 데이터 시도를 사용하여주고 싶어한다, 당신은 FreeType2, 또는 https://github.com/pomax/php-font-parser 같은 것을 사용하려고 할 수 있습니다) – gibberish

+0

당신의 문제는 텍스트의 순환 일 수 있습니다. [imagettftext] (http://www.php.net/manual/en/function.imagettftext.php)에서 : '점은 각도에 관계없이 텍스트를 기준으로하므로 "왼쪽 위"는 왼쪽 상단에 의미합니다. 텍스트가 수평으로 보일 때 왼손 구석에. – bitWorking

+0

@redreggae가 문제의 일부입니다.그러나 회전을 무시하더라도 글자의 실제 글립 문자는 경계 상자의 모든 구석으로 이동하지는 않습니다. 따라서 회전이 전혀 없더라도 'G'의 오른쪽 하단 점과 'A'의 하단 왼쪽 점 사이에 'G'와 'A'가 서로 붙어 있지 않습니다. –

답변

1

테두리 상자는 텍스트의 최소/최대 x 및 y 값을 나타내는 상자입니다. 문자 C와 문자 O가있는 경우 테두리 상자를 만지면 실제 문자가 접하지 않습니다. 두 문자가 결합 된 선은 위쪽과 아래쪽에 C가 있고 중간에 O가 있기 때문입니다.

문자가 닿아 있는지 확인하려면 문자 모양 개요 데이터를 가져와 글리프 2의 글리프 1에 대한 투영 지점을 찾는 영리한 알고리즘을 사용하거나 간단한 minmax 알고리즘을 사용하십시오. 두 개를 서로 옆에 놓고 투명한 색으로 래스터 화 한 다음 색이 지정된 픽셀 중 어둡게 놓여 있는지 확인하십시오. 그렇다면 거리 D만큼 문자를 이동하십시오. 겹치지 않으면 다시 시도하십시오. 거리 D/2만큼 뒤로 이동합니다. 겹쳐지면 D/4로 다시 이동합니다. 그렇지 않으면 D/4만큼 더 이동 한 다음 D/8, D/16 등으로 수정할 때까지 거리가 픽셀보다 작습니다.

경계 상자 정렬이 저렴하고 쉽습니다. 원하는 작업은 불행히도, 둘 다가 아닙니다. 그것은 싸울 수도 있지만 (알고리즘은 어렵다) 또는 쉽다 (그러나 알고리즘은 비싸다).

응답을 장려하기 위해 코드의 비트를 게시하는 것은 좋은 생각이 될 것

+0

나는 그 대답이 당신이 제안한 것과 같을 것이라고 생각합니다. php 글꼴 파서를 가리켜 주셔서 고마워요. 나는 그것을 살펴볼 것이다. –