# (Suche Coder für Skript) -> Kreis mit Text



## Alice (30. Januar 2012)

Hallo, ich hoffe ich bin im richtigen Forum mit meiner Anfrage. Wenn nicht, bitte einfach verschieben.

Und zwar suche ich einen Coder der mir mit PHP (oder so) ein Skript bastelt der einen Text in einen Kreis schreibt.
Der Kreis ist immer die selbe Grafik (z.B. 300x300px) die ins Skript geladen werden soll. Also eine Art Wappen. Es muss nur noch der Text immer unten mittig (richtig herum beim lesen) angebraucht werden. Anschliessend muss die neue Grafik auf dem Server gespeichert werden.

*Ich bin gerne bereit dafür zu behahlen, denn selber kriege ich es einfach nicht hin.*

Der Text wie z.B. "Fußball" oder "Ball" muss immer mittig (unten) sein. Umso länger der Text wird, umso mehr soll es halt nach oben wanders. Halt wie bei einem Wappen.

Gutes Beispiel: http://www.kirchendemenreuth.de/wappen_rund1.gif

Edit:

Es ist mir egal welche Programmiersprache oder so verwendet wird. Hauptsache der User ist nicht gewungen irgend ein PlugIn zu installieren oder so. Des Weiteren soll der User die verarbeitung der Grafik nicht sehen. Erst wenn das Bild als neues Bild (Standard Grafik + Text = Neue Grafik) auf dem Server gespeichert wurde, soll es der User sehen.


----------



## Yaslaw (30. Januar 2012)

Nun, du bist schon lange im Forum - und solltest darum wissen dass dies der falsche Ort ist.
-> Verschoben


----------



## Alice (30. Januar 2012)

Ich hab dieses Unterforum nicht gesehen. Sorry!


----------



## master bratack (31. Januar 2012)

Wieviel würdesten bezahlen


----------



## ComFreek (31. Januar 2012)

Gerade innerhalb von ~10 Minuten erledigt 

Ergebnis
1.)



2.) "Love PHP!" (LCD-BOLD.TTF - frei von dafont.com bzw. Samuel Reynolds)

3.)





Code

Originale Quelle für den Code war: http://www.ithowto.ro/2009/03/howto-write-circular-text-with-php-and-gd/

Für dich abgeändert:

```
<?php

function &bl5000Text(&$imgObj, $textProps, $offsetX=0, $offsetY=0, $charSpan=10)
{
  $text = strrev($textProps['text']);
  $textLen = strlen($text);

  $charSpanMin = 360/$textLen;
  
  if ( $charSpan > $charSpanMin )
    $charSpan = $charSpanMin;

  $start_angle = ceil($charSpan*($textLen/2));
  
  for ( $i=0; $i<$textLen; $i++ )
  {
    $a = ($charSpan*$i)-$start_angle;

    $cos = cos(deg2rad($a));
    $sin = sin(deg2rad($a));
    $x = 0;
    $y = 180;
    $xt = round($cos*($x) - $sin*($y));
    $yt = round($sin*($x) + $cos*($y));
    imagettftext($imgObj, $textProps['fontSize'], 360-$a, $offsetX+$xt, $offsetX+$yt, $textProps['color'],
                 $textProps['font'], $text[$i]);
  }
  return $imgObj;
}


$image = imagecreatefromjpeg('circle.jpg');
$red = imagecolorallocate($image,255,0,0);

$image = bl5000Text($image, array('text' => 'Love PHP!', 'color' => $red, 'font' => 'LCD-BOLD.TTF', 'fontSize' => 30),
                    200, 200);


header("Content-type: image/jpeg");
imagejpeg($image,"",100);
imagedestroy($image);

?>
```
Momentan fehlt die Dokumentation der Funktion - vllt. füge ich sie im Code noch hinzu.

Ansonsten:

$imgObj Eine Bild-Ressource, erstellt durch z.B. [phpf]imagecreatefromjpeg[/phpf].
$textProps Ein assoziatives Array mit folgenden Informationen bezüglich des anzuzeigenden Textes:

text Der anzuzeigende Text
color Eine durch [phpf]imagecolorallocate[/phpf] erstellte Farben-Ressource
font Der Pfad zu der zu nutzenden Schriftart
fontSize Die Schriftgröße in _pt_

$offsetX=0 Abstand von links
$offsetY=0 Abstand von oben
$charSpan=10 Abstand der einzelnen Zeichen in Grad


----------



## Alice (31. Januar 2012)

WOW! 

Vielen vielen vielen Dank! Das probiere ich direkt mal aus!

Ich möchte auf keinen Fall unhöflich klingen oder so, aber könntest du bitte bitte ein paar Einstellungen so ändern das der Text auf diese Grafik passt? 

http://www.abload.de/img/circlez9uos.png

Das wäre so super!


----------



## Lime (31. Januar 2012)

Auja, etwas zum spielen!


```
<?php

function &bl5000Text(&$imgObj, $textProps, $offsetX=0, $offsetY=0, $charSpan=13)
{
  $text = strrev($textProps['text']);
  $textLen = strlen($text);

  $charSpanMin = 360/$textLen;
  
  if ( $charSpan > $charSpanMin )
    $charSpan = $charSpanMin;

  $start_angle = ceil($charSpan*($textLen/2));
  
  for ( $i=0; $i<$textLen; $i++ )
  {
    $a = ($charSpan*$i)-$start_angle;

    $cos = cos(deg2rad($a));
    $sin = sin(deg2rad($a));
    $x = 0;
    $y = 240;
    $xt = round($cos*($x) - $sin*($y));
    $yt = round($sin*($x) + $cos*($y));
    imagettftext($imgObj, $textProps['fontSize'], 360-$a, $offsetX+$xt, $offsetX+$yt, $textProps['color'], $textProps['font'], $text[$i]);
  }
  return $imgObj;
}


$image = imagecreatefromjpeg('circle.jpg');
$red = imagecolorallocate($image,255,0,0);

$image = bl5000Text($image, array('text' => 'Love PHP!', 'color' => $red, 'font' => './LCD-BOLD.TTF', 'fontSize' => 40),
                    260, 200);


header("Content-type: image/jpeg");
imagejpeg($image,"",100);
imagedestroy($image);

?>
```

Bei mir siehts relativ gut aus:


----------



## Alice (31. Januar 2012)

Ja sieht bei mir auch gut aus. Nur der Text ist nicht mittig.

Edit:

Wenn ein "I" im Text vorkommt, ist der Abstand etwas sehr hoch. Jemand eine Idee wie man das ändern könnte?


----------



## Alice (1. Februar 2012)

Hallo. 

Kann mir jemand sagen was die "200" am ende des Codes bewirkt?


```
$image = bl5000Text($image, array('text' => 'Love PHP!', 'color' => $red, 'font' => './LCD-BOLD.TTF', 'fontSize' => 40),
                    260, 200);
```


----------



## Yaslaw (1. Februar 2012)

Argumente abzählen und Text vergleichen:


ComFreek hat gesagt.:


> $offsetY=0 Abstand von oben


----------



## Alice (1. Februar 2012)

Auf welche Frage hast du jetzt geantwortet?


----------



## Parantatatam (1. Februar 2012)

Logischerweise die Antwort auf die Frage, was die *200* am Ende des Codes bewirkt.


----------



## ComFreek (1. Februar 2012)

So, habe noch eine zwei Einstellmöglichkeiten hinzugefügt, die Parameterliste verkürzt und einen Bug beseitigt (hatte auch für den Y-Wert $offsetX im Code genommen).

Code ist jetzt in einem Blogeintrag hier verfügbar: http://www.tutorials.de/blogs/comfreek/11295-php-text-innerhalb-entlang-eines-kreises-schreiben.html

Wegen dem "I":

In der Tat erscheint beim "I" immer ein größerer Abstand zu anderen Buchstaben - und das bei mehreren verschiedenen Schriftarten.

Vielleicht weiß hier jemand den Hintergrund?​


----------



## Alice (1. Februar 2012)

OK das dachte ich mir natürlich schon aber egal welche Zahl ich dort einbaue (von 0 bis 1000) sehe ich keine veränderung.

Jemand ne Idee wie ich das Problem mit dem Buchstaben "I" lösen kann? Denn dann wäre der Sourcecode PERFEKT. 

Ich habe schon anderen Schriftarten ausprobiert aber immer das selbe Problem. Der abstand nach Rechts nach einem "I" ist 3 mal so hoch wie der normale Abstand.


----------



## ComFreek (1. Februar 2012)

> OK das dachte ich mir natürlich schon aber egal welche Zahl ich dort einbaue (von 0 bis 1000) sehe ich keine veränderung.


Immer noch (dort einbaue)?


----------



## Alice (1. Februar 2012)

Leider wird mit dem neuen Code gar nichts angezeigt. Ich suche gerade den Fehler (der bestimmt bei mir liegt).


----------



## Alice (1. Februar 2012)

So jetzt geht es!

Also ehrlich ComFreek... Du hast mir schon oft geholfen aber ich habe mich noch nie über etwas so gefreut wie über diesen Code von dir!

Vielleicht gibt es hier noch jemanden der das Problem mit dem Buchstabe "I" erklären oder sogar bei der Lösung helfen kann. 

Wäre es schwierig den Code etwas umzubauen damit auch ein oberer Bogen erzeugt wird?


----------



## Lime (1. Februar 2012)

bl5000 hat gesagt.:


> Wäre es schwierig den Code etwas umzubauen damit auch ein oberer Bogen erzeugt wird?



Wenn man weiß wie, dann bestimmt nicht.
Du könntest einfach etwas mit dem Code spielen, dann wirst du sehen, wie einfach es geht.


----------



## Alice (1. Februar 2012)

Niemals! Sobald ich am Code etwas anpasse ausser der Schrift geht nichts mehr! 

Ich blicke beim "Text im Kreis" einfach nicht durch.


----------



## Lime (1. Februar 2012)

Du solltest entweder Vorzeichen (Minus) oder die Gradzahlen ändern (bei den Winkelfunktionen), dann funktioniert das... ^^


----------



## Alice (1. Februar 2012)

Leider kriege ich das nicht hin.


----------



## ComFreek (1. Februar 2012)

So:

```
function &DrawCircularText_X2(&$imgObj, $textProps, $radius, $positionProps, $charSpan=10)
{
  $text = $textProps['text'];
  $textLen = strlen($text);

  $start_angle = $charSpan*($textLen/2);
  
  for ( $i=0; $i<$textLen; $i++ )
  {
    $a = ($charSpan*$i)-$start_angle;
    $a += $positionProps['angleOffset'];

    $cos = -cos(deg2rad($a));
    $sin = -sin(deg2rad($a));
    $x = 0;

    $xt = round($cos*($x) - $sin*($radius));
    $yt = round($sin*($x) + $cos*($radius));
    imagettftext($imgObj, $textProps['fontSize'], 360-$a, $positionProps['offsetX']+$xt,
                 $positionProps['offsetY']+$yt, $textProps['color'], $textProps['font'], $text[$i]);
  }
  return $imgObj;
}
```

Siehe auch im ZIP-Ordner zum Download des Blogeintrags test2 und test3.php:

Anhang anzeigen 59474
 Aktualisiert: 
	

		
			
		

		
	

Anhang anzeigen 59475


----------



## Alice (1. Februar 2012)

Hallo. 

Test1.php und Test2.php funktionieren einwandfrei (bis auf den "I" Bug). Aber Test3.php funktioniert nicht.

Fehler:
Fatal error: Call to undefined function drawcirculartext() in /www/htdocs/blablabla/test3.php on line 27


----------



## ComFreek (1. Februar 2012)

Hier der aktualisierte Download: 
	

		
			
		

		
	

Anhang anzeigen 59475


Vielleicht müsste man wegen dem I-Bug mal an die GD-(PHP-)Entwickler schreiben?


----------



## Alice (1. Februar 2012)

Ich versuche jetzt den Font mit Font Creator zu ändern. Ich glaube aber nicht dass das funktioniert.


----------



## Alice (1. Februar 2012)

Die Lösung ist: Man muss eine Nichtproportionale Schriftart verwenden.


----------



## Alice (2. Februar 2012)

Hallo noch einmal. 

Also ich habe mittlerweile beide Skripts (für oberen und unteren Text) für meine Bedürfnisse eingestellt.

Ich finde das Ergebnis super!




@ComFreek
Könntest du evtl. (wenn du Zeit hast) die zwei Funktionen (test1.php und test2.php) zusammenbauen wie in der Grafik von mir? Dann könnte man ja beide Texte in einem Zug erstellen. 

Dann wäre das Skript von dir im WWW einmalig, denn ich habe das ganze WWW durch gegoogelt und nichts in dieser Qualität gefunden.


----------



## Maniac (2. Februar 2012)

Bastle ne Klasse draus wo man die Gradien und Winkel einstellen kann, die Texte eingeben und Grafiken setzt und es dann generiert.


----------



## Alice (2. Februar 2012)

Ich habe mal versucht beide Codes zu vereinen aber es funktiobiert leider nicht. Habe dann mehr Fehler als der Code überhaupt Zeilen hat.


----------



## smileyml (2. Februar 2012)

bl5000, hier ist kein Bettelforum, sondern Hilfe zur Selbsthilfe.
Ich weiß, das du deine Anfrage eigentlich (und richtigerweise) im Jobforum gestellt hattest, aber so lernresistent trotz hervorragender Hilfe ist leider unaushaltbar für mich.

Versuche wenigstens ein wenig die Sprache zu verstehen oder aber lerne sie!

Danke und closed.
Marco


PS: ComFreek, entscheide selbst ob du noch helfen möchtest. Verstehen wird er es aber auch mit Erklärungen nicht.


----------



## ComFreek (2. Februar 2012)

bl5000, da hat Marco (Danke an dieser Stelle) wirklich Recht.

Du solltest dich wenigstens bemühen, die Fehlermeldungen zu posten anstatt einfach fertigen Code zu erwarten.
Die Funktion habe ich nicht erstellt, weil ich nichts besseres zu tun hatte, sondern aus eigener Neugier & Interesse.



> Versuche wenigstens ein wenig die Sprache zu verstehen oder aber lerne sie!


Meiner Meinung nach muss man nicht mal eine Programmiersprache beherrschen, um den Inhalt des Codes (grob) zu verstehen.

So wie SpiKeE einmal sagte: es liegt am abstrakten Denken des Programmierers 

@bl5000:

Zurück zum Thema!

Ich würde mal sagen, du postest deinen Ansatz (in Form von Code!) und die Fehlermeldungen.
Aber erwarte bitte keine kompletten Lösungen.​


----------

