viele Diagramme gleichzeitig
Gustav
- php
0 Gustav0 Gustav
0 dedlfix0 Der-Dennis
Hallo,
ich versuche innerhalb eines einmligen Ausführens einer PHP-Datei mehrere Grafiken automatisch zu erstellen, dazu rufe ich mehrfach eine Klasse Image auf, die mir jeweils ein Bild erzeugt:
[PHP]
class Image
{
public $Bild;
public $HinterGrundFarbe;
public $AchsenFarbe;
public $SchriftFarbe;
public $KreuzFarbe;
public $FehlerFarbe;
public $HilfsLinienFarbe;
public $Farbe;
public $SchriftGroesse;
public $SchriftHoehe;
public $SchriftBreite;
public $AchsenSchriftGroesse;
public $AchsenSchriftHoehe;
public $AchsenSchriftBreite;
public $UeberSchriftGroesse;
public $UeberSchriftHoehe;
public $UeberSchriftBreite;
public $GleichungSchriftGroesse;
public $GleichungSchriftHoehe;
public $GleichungSchriftBreite;
function createNewImage($Hoehe,$Breite)
{
$this->Bild=imagecreate($Breite,$Hoehe);
}
function setBackgroundColour()
{
$this->HinterGrundFarbe=imagecolorallocate($this->Bild,255,255,255);
}
function setColours()
{
$this->AchsenFarbe=imagecolorallocate($this->Bild,0,0,0);
$this->SchriftFarbe=imagecolorallocate($this->Bild,0,0,0);
$this->KreuzFarbe=imagecolorallocate($this->Bild,255,0,0);
$this->FehlerFarbe=imagecolorallocate($this->Bild,180,180,180);
$this->Farbe['red']=imagecolorallocate($this->Bild,255,0,0);
$this->Farbe['blue']=imagecolorallocate($this->Bild,0,0,255);
$this->Farbe['green']=imagecolorallocate($this->Bild,0,255,0);
$this->Farbe['pink']=imagecolorallocate($this->Bild,255,0,255);
$this->Farbe['lightblue']=imagecolorallocate($this->Bild,0,255,255);
}
function setFonts()
{
$this->SchriftGroesse=3;
$this->SchriftHoehe=imagefontheight($this->SchriftGroesse);
$this->SchriftBreite=imagefontwidth($this->SchriftGroesse);
$this->AchsenSchriftGroesse=4;
$this->AchsenSchriftHoehe=imagefontheight($this->AchsenSchriftGroesse);
$this->AchsenSchriftBreite=imagefontwidth($this->AchsenSchriftGroesse);
$this->UeberSchriftGroesse=5;
$this->UeberSchriftHoehe=imagefontheight($this->UeberSchriftGroesse);
$this->UeberSchriftBreite=imagefontwidth($this->UeberSchriftGroesse);
$this->GleichungSchriftGroesse=4;
$this->GleichungSchriftHoehe=imagefontheight($this->GleichungSchriftGroesse);
$this->GleichungSchriftBreite=imagefontwidth($this->GleichungSchriftGroesse);
}
function saveImage($Pfad)
{
imagegif($this->Bild,$Pfad);
imagedestroy($this->Bild);
}
[/PHP]
Im Hauptprogramm sieht das wie folgt aus:
[PHP]
$Rand=70;
$Breite=2*$Rand+$xAchse;
$Hoehe=2*$Rand+$yAchse;
$Image=new Image;
$Image->createNewImage($Hoehe,$Breite);
$Image->setBackgroundColour();
$Image->setColours();
$Image->setFonts();
.
.
.
$Image->saveImage($Ordner.'OUTPUT/'.$DateiInfo.'_1.gif'); # natürlich wird nicht immer in selbe Datei geschrieben
[/PHP]
Und das wird immer wieder ausgeführt! Das erste Bild wurde mir noch gezeichnet. Doch das Zweite dann nicht mehr. Alles ist weiß! Ich hatte das Problem schon mal, und zwar lag es an imagecolorallocate(), und das man eine Farbe nur 1mal erstellen lassen kann. Bloß wie soll man das machen, wenn man mehrere Grafiken und dafür immer wieder eine Klasse aufruft ?
Gruß.
ich habe error_reporting(E_ALL) gesetzt und mal Speicherverbrauch kontrolliert:
vor Image: 2525768
vor Abspeichern: 3323728
nach Abspeichern: 2530216
am Ende des Programms: 2954328
Außerdem zeigt er keine Fehler an. Das Programm wird auch blitzartig durchgeführt!
Das Problem ist gelöst. Die Koordinaten zum Zeichnen waren außerhalb des Bildbereiches.
Hi!
Und das wird immer wieder ausgeführt! Das erste Bild wurde mir noch gezeichnet. Doch das Zweite dann nicht mehr. Alles ist weiß! Ich hatte das Problem schon mal, und zwar lag es an imagecolorallocate(), und das man eine Farbe nur 1mal erstellen lassen kann. Bloß wie soll man das machen, wenn man mehrere Grafiken und dafür immer wieder eine Klasse aufruft ?
Warum lag das an imagecolorallocate()? Und wie wäre es, wenn du mal eine ordentliche Fehlerbehandlung einbaust? Viele Funktionen, so auch die image-Funktionen, gegen über ihren Rückgabewert bekannt, ob ein Fehler auftrat oder nicht. Lass das nicht unbeachtet! Im Moment ist übrigens deine Klasse nicht viel mehr als ein OOP-Wrapper um die vorhandenen Funktionen. Wenn sie dir sinnvoll Arbeit abnehmen soll, musst du die noch in die Klasse einbringen. Was ist beispielsweise der Sinn hinter der Trennung zwischen dem (nicht vorhandenem) Konstruktor und der Methode CreateNewImage()? Warum wird die Eigenschaft $Farbe nicht gleich als (zunächst leeres) Array initialisiert? Was ist mit sinnvollen Default-Werten für die anderen Eigenschaften?
Lo!
ich habe das mal gemacht!
class Image
{
public $Bild;
public $HinterGrundFarbe=0;
public $AchsenFarbe=0;
public $SchriftFarbe=0;
public $KreuzFarbe=0;
public $FehlerFarbe=0;
public $HilfsLinienFarbe=0;
public $Farbe=array('red'=>0,
'blue'=>0,
'green'=>0,
'pink'=>0,
'lightblue'=>0);
public $SchriftGroesse=3;
public $SchriftHoehe=0;
public $SchriftBreite=0;
public $AchsenSchriftGroesse=4;
public $AchsenSchriftHoehe=0;
public $AchsenSchriftBreite=0;
public $UeberSchriftGroesse=5;
public $UeberSchriftHoehe=0;
public $UeberSchriftBreite=0;
public $GleichungSchriftGroesse=4;
public $GleichungSchriftHoehe=0;
public $GleichungSchriftBreite=0;
function createNewImage($Hoehe,$Breite)
{
echo $this->Bild=imagecreate($Breite,$Hoehe); echo '<br>';
}
function setBackgroundColour()
{
echo $this->HinterGrundFarbe=imagecolorallocate($this->Bild,255,255,255); echo '<br>';
}
function setColours()
{
echo $this->AchsenFarbe=imagecolorallocate($this->Bild,0,0,0); echo '<br>';
echo $this->SchriftFarbe=$this->AchsenFarbe; echo '<br>';
echo $this->KreuzFarbe=imagecolorallocate($this->Bild,255,0,0); echo '<br>';
echo $this->FehlerFarbe=imagecolorallocate($this->Bild,180,180,180); echo '<br>';
echo $this->Farbe['red']=$this->KreuzFarbe; echo '<br>';
echo $this->Farbe['blue']=imagecolorallocate($this->Bild,0,0,255); echo '<br>';
echo $this->Farbe['green']=imagecolorallocate($this->Bild,0,255,0); echo '<br>';
echo $this->Farbe['pink']=imagecolorallocate($this->Bild,255,0,255); echo '<br>';
echo $this->Farbe['lightblue']=imagecolorallocate($this->Bild,0,255,255); echo '<br>';
}
function setFonts()
{
echo $this->SchriftHoehe=imagefontheight($this->SchriftGroesse); echo '<br>';
echo $this->SchriftBreite=imagefontwidth($this->SchriftGroesse); echo '<br>';
echo $this->AchsenSchriftHoehe=imagefontheight($this->AchsenSchriftGroesse); echo '<br>';
echo $this->AchsenSchriftBreite=imagefontwidth($this->AchsenSchriftGroesse); echo '<br>';
echo $this->UeberSchriftHoehe=imagefontheight($this->UeberSchriftGroesse); echo '<br>';
echo $this->UeberSchriftBreite=imagefontwidth($this->UeberSchriftGroesse); echo '<br>';
echo $this->GleichungSchriftHoehe=imagefontheight($this->GleichungSchriftGroesse); echo '<br>';
echo $this->GleichungSchriftBreite=imagefontwidth($this->GleichungSchriftGroesse); echo '<br>';
}
function saveImage($Pfad)
{
echo imagegif($this->Bild,$Pfad); echo '<br>';
echo imagedestroy($this->Bild); echo '<br>';
}
}
Er gibt mir Folgendes aus:
Resource id #6
0
1
1
2
3
2
4
5
6
7
13
7
16
8
15
9
16
8
1
1
Resource id #7
0
1
1
2
3
2
4
5
6
7
13
7
16
8
15
9
16
8
1
1
usw.
Die Bilder zwar erstellt, aber es scheint ein Problem mit den Farben zu geben. Die gleiche Funktion:
echo imageline($Image->Bild,$x1,$y1,$x1,$y2,$Image->AchsenFarbe);
liefert bei allen Bildern den Rückgabewert 1.
Hi!
ich habe das mal gemacht!
Nimm var_dump() statt echo. Mit var_dump() bekommst du immer einen exakte Ausgabe. Ein echo gibt statt true eine 1 aus und statt false einfach gar nichts. Somit siehst du Fehler signalisierende Rückgabewerte (false) gar nicht, wenn du nur echost. (Vor var_dump() macht sich ein <pre> gut, einen Zeilenumbruch gibt es gratis und extra <br>s können entfallen.)
Lass mal das ganze Klassenzeugs weg und erstell ein Beispiel mit minimal möglichem Code, bei dem der Fehler nachvollziehbar ist. Also schlicht und einach zwei Bilder mit beispielsweise einer einzigen Linie drin nacheinander erzeugen. Wenn der Fehler auch da auftritt, kannst du durch den wenigen Code deine Aufmerksamkeit gezielt einsetzen. Ist er weg - auch gut, denn das bedeutet, dass es nicht an dem eigentlich vermuteten liegt. Füg dann stückweise Code hinzu, bis der Fehler wieder da ist. Da muss er dann irgendwo sein. Alles was beim Hinzufügen den Fehler nicht hervorbringt, fliegt wieder raus, wenn es entbehrlich ist. Erst wenn alles wesentliche drin ist und immer noch alles geht, kann der Zusatzkram hinzu.
Lo!
Das ist jetzt schon mindestens das dritte Forum, in dem Du diese Frage stellst (selfphp.de, phpforum.de).
Moin!
Das ist jetzt schon mindestens das dritte Forum, in dem Du diese Frage stellst (selfphp.de, phpforum.de).
Ja und?
Solange es in DIESEM Forum die einzige Anfrage bleibt und kein Doppelposting wird, wird das vom Moderationsteam in keiner Weise sanktioniert werden. Wenn andere Foren das anders handhaben wollen, ist das deren Bier.
- Sven Rautenberg
Hallo Sven,
danke für den Hinweis. Das hatte ich vorher anders verstanden. Also: Cross-Postings ja, Doppel-Postings nein. Ist gespeichert.
Gruß, Dennis
Hallo,
danke für den Hinweis. Das hatte ich vorher anders verstanden. Also: Cross-Postings ja, Doppel-Postings nein. Ist gespeichert.
Allerdings würden wir doch darum bitten im Falle eines Cross-Postings darauf hinzuweisen, wo überall hin ge-X-postet wurde.
Viele Grüße,
Christian