Gå til innhold

Tekst på bilder med GD


Anbefalte innlegg

Jeg bruker koden under til å lage et bilde med tekst. Men når teksten blir for lang, så går den utenfor bildet! Hvordan kan jeg få tekststørrelsen til å variere etter størrelsen på bildet? F.eks. hvis bildet er 128 px brett og 128 px høyt, så må skiftens størrelse tilpasse seg så den er f.eks. 90% av bildets bredde. Noen som skjønner? :)

 

<?php
  // Set some test variables
  $font = "arial.ttf";
  $text = "Denne teksten er for lang for bildet!";
  $size = 10;
  $angle = 0;

  // Create an image and fill the background with lightgray
  $image = imagecreatetruecolor(128, 128);
  imagefill($image, 0, 0, hexdec("dddddd"));

  // Make a cross to make it easier to analyze
  /*
  imageline($image, 0, 0, imagesx($image), imagesy($image), hexdec("000000"));
  imageline($image, imagesx($image), 0, 0, imagesy($image), hexdec("000000"));
  */

  // Run a fixed version of imagettfbbox()
  $bbox = imagettfbbox_fixed($size, $angle, $font, $text);

  // Make some text and center the text on the image.
  // imagettftext() pivot is on lower left
  imagettftext($image, $size, $angle, imagesx($image) / 2 - $bbox['width'] / 2, imagesy($image) / 2 + $bbox['height'] / 2, hexdec("0000ff"), $font, $text);

  // Show the image
  imagejpeg($image);

  function imagettfbbox_fixed($size, $angle, $font, $text)
  {
      // Get the boundingbox from imagettfbbox(), which is correct when angle is 0
      $bbox = imagettfbbox($size, 0, $font, $text);

      // Rotate the boundingbox
      $angle = pi() * 2 - $angle * pi() * 2 / 360;
      for ($i=0; $i<4; $i++)
      {
          $x = $bbox[$i * 2];
          $y = $bbox[$i * 2 + 1];
          $bbox[$i * 2] = cos($angle) * $x - sin($angle) * $y;
          $bbox[$i * 2 + 1] = sin($angle) * $x + cos($angle) * $y;
      }

      // Variables which tells the correct width and height
      $bbox['width'] = $bbox[0] + $bbox[4];
      $bbox['height'] = $bbox[1] - $bbox[5];

      return $bbox;
  }
?> 

Lenke til kommentar
Videoannonse
Annonse
Mål størrelsen med imagettfbox() www.php.net/imagettfbbox

Har satt meg inn i imagettfbbox() nå. Mulig jeg er dum, men skjønner ikke hvordan dette skal hjelpe meg. X og Y på bilder er veldig nytt for meg, så kanskje det er noe jeg må skjønne? Prøvde koden under, og fikk opp noen tall. Hva sier disse meg egentlig? Takk for all hjelp :D

 

<?php
$array = imagettfbbox(100, 0, "arial.ttf", "Arial");

print $array[0];
print ", ";
print $array[1];
print ", ";
print $array[2];
print ", ";
print $array[3];
print ", ";
print $array[4];
print ", ";
print $array[5];
print ", ";
print $array[6];
print ", ";
print $array[7];
?>

 

EDIT: Det jeg fikk opp var: -3, 2, 257, 2, 257, -97, -3, -97

Endret av simenss
Lenke til kommentar

Les kommentarene til funksjonen ;)

 

<?php

function fixbbox($bbox)

{

  $xcorr=0-$bbox[6]; //northwest X

  $ycorr=0-$bbox[7]; //northwest Y

  $tmp_bbox['left']=$bbox[6]+$xcorr;

  $tmp_bbox['top']=$bbox[7]+$ycorr;

  $tmp_bbox['width']=$bbox[2]+$xcorr;

  $tmp_bbox['height']=$bbox[3]+$ycorr;

 

  return $tmp_bbox;

}

?>

Lenke til kommentar
Les kommentarene til funksjonen ;)

 

<?php

function fixbbox($bbox)

{

   $xcorr=0-$bbox[6]; //northwest X

   $ycorr=0-$bbox[7]; //northwest Y

   $tmp_bbox['left']=$bbox[6]+$xcorr;

   $tmp_bbox['top']=$bbox[7]+$ycorr;

   $tmp_bbox['width']=$bbox[2]+$xcorr;

   $tmp_bbox['height']=$bbox[3]+$ycorr;

  

   return $tmp_bbox;

}

?>

Hvordan bruker man denne koden for å utføre den jobben simenss vil at den skal gjøre? Er ganske grønn i PHP, så takk hvis noen kan svare :love:

 

edit: kom du fram til noe simenss?

Endret av bfreddy
Lenke til kommentar

Ved bruk av den funksjonen kan du lage et script som dette:

 

$bredde = 50; // angi bredden på bildet

while($størrelse != true){

$i++;

$bildet = fixbbox(imagettfbbox($i,0,"arial.ttf","teksten"));

if($bildet['width'] > $bredde){

$størrelse = true;

$i--;

}

}

 

Da vil $i være den største størrelsen teksten kan være uten at den går utenfor bildet. Har ikke testet scriptet så det kan hende det må endres litt, og det kan helt sikkert effektiviseres - spesielt med tanke på at man kan ta bort funksjonen og heller skrive den rett inn i scriptet.

 

Lykke til :thumbup:

Lenke til kommentar

Takk for hjelpen, enda en gang ???????? :thumbs: Hvis noen er interessert i koden jeg kom fram til så er den:

 

<?php
// Set some test variables
$font = "comic.ttf";
$text = "Denne teksten er for lang for bildet!";
$angle = 0;

function fixbbox($bbox)
{
$xcorr=0-$bbox[6]; //northwest X
$ycorr=0-$bbox[7]; //northwest Y
$tmp_bbox['left']=$bbox[6]+$xcorr;
$tmp_bbox['top']=$bbox[7]+$ycorr;
$tmp_bbox['width']=$bbox[2]+$xcorr;
$tmp_bbox['height']=$bbox[3]+$ycorr;

return $tmp_bbox;
}

$bredde = 128; // angi bredden på bildet
while($størrelse != true){
$i++;
$bildet = fixbbox(imagettfbbox($i,0,$font,$text));
if($bildet['width'] > $bredde)
{
$størrelse = true;
$i--;
}
}

// Create an image and fill the background with lightgray
$image = imagecreatetruecolor(128, 128);
imagefill($image, 0, 0, hexdec("dddddd"));

// Run a fixed version of imagettfbbox()
$bbox = imagettfbbox_fixed($i, $angle, $font, $text);

// Make some text and center the text on the image.
// imagettftext() pivot is on lower left
imagettftext($image, $i, $angle, imagesx($image) / 2 - $bbox['width'] / 2, imagesy($image) / 2 + $bbox['height'] / 2, hexdec("0000ff"), $font, $text);

// Show the image
imagejpeg($image);

function imagettfbbox_fixed($i, $angle, $font, $text)
{
// Get the boundingbox from imagettfbbox(), which is correct when angle is 0
$bbox = imagettfbbox($i, 0, $font, $text);

// Rotate the boundingbox
$angle = pi() * 2 - $angle * pi() * 2 / 360;
for ($i=0; $i<4; $i++)
{
$x = $bbox[$i * 2];
$y = $bbox[$i * 2 + 1];
$bbox[$i * 2] = cos($angle) * $x - sin($angle) * $y;
$bbox[$i * 2 + 1] = sin($angle) * $x + cos($angle) * $y;
}

// Variables which tells the correct width and height
$bbox['width'] = $bbox[0] + $bbox[4];
$bbox['height'] = $bbox[1] - $bbox[5];

return $bbox;
}
?> 

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...