XtremallyPurpur
Новичок
Вывод текста в картинку, GD
Пишу следующий класс (пре-альфа версия)
Теперь пытаюсь его тестить:
И скрипт мне рисует черный квадрат. Вопрос: я торможу или это заморочка GD, которая не может нормально обрабатывать двойной вызов imagecolorallocate(). Ибо, когда я переношу вызов imagecolorallocate() в вызов фунции draw_text_line(), то рисует все нормально.
(Вот так переношу:
)
PS простите за много кода, просто, если кто-нибудь захочет тестануть, чтоб без гимора.
Пишу следующий класс (пре-альфа версия)
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);
(Вот так переношу:
PHP:
$this->draw_text_line($this->im,$this->polygoncontent[0],100,100,imagecolorallocate ($this->im, 0, 0, 0));
PS простите за много кода, просто, если кто-нибудь захочет тестануть, чтоб без гимора.