Page 1 of 1

How can I wrap text in an Image using magickwand?

Posted: 2007-08-20T02:28:27-07:00
by vinodkalpaka
Hi,

I am using a textarea for inputing text and need to embed the text to an image. Here is my code in a simlified form.

$magick_wand=NewMagickWand();
MagickReadImage($magick_wand,'customland.png');


$drawing_wand=NewDrawingWand();
DrawSetFont($drawing_wand,"Fonts/arial.ttf");
DrawSetFontSize($drawing_wand,100);
DrawSetGravity($drawing_wand,MW_CenterGravity);
$pixel_wand=NewPixelWand();
PixelSetColor($pixel_wand,"red");
DrawSetFillColor($drawing_wand,$pixel_wand);

if (MagickAnnotateImage($magick_wand,$drawing_wand,0,0,0,"Red Roses") != 0)
{

MagickEchoImageBlob( $magick_wand );
}
else
{
echo MagickGetExceptionString($magick_wand);
}.


In this case "Red Roses" is my text and it is working fine. But when I am working with long text, it will coming out of the image. I need to wrap up the text enterd. Is there any way to wrap the text or limit the input text in restricable area (give x1,y1,x2 and y2 to output text that is embed in image )? Please help me.

Thanking in advance.

Re: How can I wrap text in an Image using magickwand?

Posted: 2007-08-26T10:19:31-07:00
by ali
this thread is a dupe...

viewtopic.php?f=10&t=9444

Re: How can I wrap text in an Image using magickwand?

Posted: 2007-09-18T02:52:14-07:00
by ericilavia
Hi Vinod,this is Eric i also looking out for the same solution did u get anything to wrap a text.

Re: How can I wrap text in an Image using magickwand?

Posted: 2007-09-18T04:25:53-07:00
by vinodkalpaka
I did not get a direct solution.
I have used the following code. Please note the code is not completed one.

$txtm1 = mb_wordwrap($text,$fontface,$fontsize,$width)
// code for creating magickwand, setfont, fontsize, font alignment etc.

foreach($txtm1 as $textm)
{
if($textm!="")
{
MagickAnnotateImage($magick_wand,$drawing_wand,$message_x_position,$message_y_position,0,$textm);
$message_y_position =$message_y_position+$fontsize;
}
}
// code for show/save the image.



function mb_wordwrap($txt,$font,$size,$width) {
$pointer = 0; // Current character position pointer
$this_line_start = 0; // Starting character position of current line
$this_line_strlen = 1; // How long is the current line
$single_byte_stack = ""; // Variable for storing single byte word
$sbs_line_width = 0; // Pixel width of the Single byte word
$this_is_cr = FALSE; // Check if the character is new line code (ASCII=10)
$result_lines = array(); // Array for storing the return result

while ($pointer < mb_strlen($txt)) {
$this_char = mb_substr($txt,$pointer,1);
if (ord($this_char[0])==10) $this_is_cr = TRUE; // Check if it is a new line
// Check current line width
$tmp_line = mb_substr($txt, $this_line_start, $this_line_strlen);
$tmp_line_bbox = imagettfbbox($size,0,$font,$tmp_line);
$this_line_width = $tmp_line_bbox[2]-$tmp_line_bbox[0];

// Prevent to cut off english word at the end of line
// if this character is a alphanumeric character or open bracket, put it into stack
if (is_alphanumeric($this_char, $single_byte_stack)) $single_byte_stack .= $this_char;
// Check the width of single byte words
if ($single_byte_stack != "") {
$tmp_line_bbox = imagettfbbox($size,0,$font,$single_byte_stack);
$sbs_line_width = $tmp_line_bbox[2]-$tmp_line_bbox[0];
}

if ($this_is_cr || $this_line_width > $width || $sbs_line_width >= $width) {
// If last word is alphanumeric, put it to next line rather then cut it off
if ($single_byte_stack != "" && is_alphanumeric($this_char, $single_byte_stack) && $sbs_line_width < $width) {
$stack_len = mb_strlen($single_byte_stack);
$this_line_strlen = $this_line_strlen - $stack_len + 1;
$pointer = $pointer - $stack_len + 1;
}
// Move the current line to result array and reset all counter
$result_lines[] = mb_substr($txt, $this_line_start, $this_line_strlen-1);
if ($this_is_cr) { $pointer++; $this_is_cr=FALSE; }
if ($sbs_line_width >= $width) $sbs_line_width = 0;
$this_line_start = $pointer;
$this_line_strlen = 1;
$single_byte_stack = "";
} else {
if (!is_alphanumeric($this_char, $single_byte_stack)) {
$single_byte_stack = ""; // Clear stack if met multibyte character and not line end
}
$this_line_strlen++;
$pointer++;
}
}
// Move remained word to result
$result_lines[] = mb_substr($txt, $this_line_start);

return $result_lines;
}

function is_alphanumeric($character, $stack) {
if (
(ord($character)>=48 && ord($character)<=57) ||
(ord($character)>=65 && ord($character)<=91) ||
(ord($character)>=97 && ord($character)<=123) ||
ord($character)==40 ||
ord($character)==60 ||
($stack=="" && (ord($character)==34 || ord($character)==39))
) return TRUE;
else return FALSE;
}


The above code will not work accurately. I am using this function to embed texts enterd by a textarea to a png file.

Re: How can I wrap text in an Image using magickwand?

Posted: 2007-09-18T04:33:45-07:00
by vinodkalpaka
Otherwise please try the methods DrawSetClipPath, DrawSetClipRule or DrawSetClipUnits. This may help to set a clipping region to the image. I did not tested these functions.

Re: How can I wrap text in an Image using magickwand?

Posted: 2009-10-06T00:51:08-07:00
by ncm123
Try using http://us.php.net/manual/en/function.wordwrap.php for a rudimentary solution.