Вывод текста в картинку, GD

XtremallyPurpur

Новичок
Вывод текста в картинку, GD

Пишу следующий класс (пре-альфа версия)
PHP:
class BBox{
  var $coordinates; //координаты точек полигона в массиве(как при вызове imagepolygon())
  var $color_lines;//цвет линий полигона
  var $color_text;//цвет текста, который будет писаться в полигон
  var $polygoncontent;//текст, который будет в полигоне, разбит по строчкам в массив 
  var $im; //image pointer
//инициализация переменных класса
  function initiate($im,$color_text,$polygoncontent,$color_lines,$coordinates){
    $this->im = $im;
    $this->color_text = $color_text;
    $this->coordinates = $coordinates;
    $this->polygoncontent = $polygoncontent;
    $this->color_lines = $color_lines;
  }
//рисует квадрат
  function _draw_polygon(){
    if (count($this->coordinates)!=8) {print "You must use 4 points to draw square polygon";exit();}
    if (!$this->_check_is_box($this->coordinates)) {print "Your polygon is not box. Please enter other coordinates";exit();}
    imagepolygon($this->im,$this->coordinates,4,$this->color_lines);
  }
//в будущем будет рисовать текст в прямоугольном полигоне, созданном _draw_polygon()
  function _draw_content(){
    $this->draw_text_line($this->im,$this->polygoncontent[0],100,100,$this->color_text);
  }
//рисует квадратный полигон
  function draw(){
    $this->_draw_polygon();
    $this->_draw_content();
  }
//проверяет квадратный ли полигон
  function _check_is_box(){
    $x2_x1 = $this->coordinates[4]-$this->coordinates[2];
    $x0_x3 = $this->coordinates[0]-$this->coordinates[6];

    $y1_y0 = $this->coordinates[3]-$this->coordinates[1];
    $y3_y2 = $this->coordinates[7]-$this->coordinates[5];
    if ($y1_y0!=0) return false;
    if ($y3_y2!=0) return false;
    if ($x2_x1!=0) return false;
    if ($x0_x3!=0) return false;
    return true;
  }

//перегоняет кириллицу в юникод
  function iso2uni ($isoline){
    for ($i=0; $i < strlen($isoline); $i++){
      $thischar=substr($isoline,$i,1);
      $charcode=ord($thischar);
      $uniline.=($charcode>175) ? "&#" . (1040+($charcode-176)). ";" : $thischar;
    }
    return $uniline;
  }

//выводит строчку текста
  function draw_text_line($im,$string,$px,$py,$color){
    $koistring = $string;
    $isostring = convert_cyr_string($koistring, "w", "i");
    $unistring = @$this->iso2uni($isostring);
    imagettftext($im, 15, 0, $px, $py, "red", realpath('verdana.ttf'), $unistring);
    return(0);
  }

}
Теперь пытаюсь его тестить:

PHP:
  header ("Content-type: image/jpeg");
  require("bbox.class");

  $im  = imagecreate (400, 400);

  $color_lines = imagecolorallocate ($im, 0, 0, 0);
  $color_text = imagecolorallocate ($im, 0, 0, 0);

  $polygoncontent = array ("123","2345");

  $coordinates=array (110,120,120,120,120,110,110,110);

  $box = new BBox;
  $box->initiate($im,$color_text,$polygoncontent,$color_lines,$coordinates);
  $box->draw();

  imagejpeg($im);
И скрипт мне рисует черный квадрат. Вопрос: я торможу или это заморочка GD, которая не может нормально обрабатывать двойной вызов imagecolorallocate(). Ибо, когда я переношу вызов imagecolorallocate() в вызов фунции draw_text_line(), то рисует все нормально.
(Вот так переношу:
PHP:
$this->draw_text_line($this->im,$this->polygoncontent[0],100,100,imagecolorallocate ($this->im, 0, 0, 0));
)

PS простите за много кода, просто, если кто-нибудь захочет тестануть, чтоб без гимора.
 

Yurik

/dev/null
Кода-то я подобное делал, это вроде такая фича ГД что колоралокейт перекрывает предыдущий алокейт.
В смысле они не просто меняют $color_lines и $color_text, а меняют текущие настройки цвета, которые потом используются другими функциями. Решал аналогичным образом - перенес вызов в сам вывод.
 

XtremallyPurpur

Новичок
разобрался
нужно первым вызовом imagecolorallocate() писать цвет фона
тогда фсе работает :
PHP:
  $background = imagecolorallocate ($im, 255, 255, 255); 
  $color_lines = imagecolorallocate ($im, 0, 0, 0); 
  $color_text = imagecolorallocate ($im, 0, 0, 0);
причем этот $background нигде потом не использовать не надо
странная заморочка, тем не менее пашет :-|
 
Сверху