PNG Bild mit PHP erzeugen - Bei ~30% der User falsche Darstellung

BadKiss

Mitglied
Hallo zusammen,

leider hab ich mal wieder ein kleines Problem und komm einfach nicht darauf, wie ich es lösen kann :(
Hoffe einer von euch kann mir helfen?

Ich erzeuge "Karten" mit PHP - also ich nehme den Rahmen, färbe ihn ein und packe ein Bild in die Mitte.
Bisher hat das alles auch immer super funktioniert, dann hatte mein Hoster Serverprobleme und das Problem fing an.
Die Bilder wurden nur zur Hälfte oder gar nicht angezeigt.

Nun bin ich auf einen vServer gezogen - habe aber leider immer noch das selbe Problem.

Soviel hab ich schon rausgefunden:
Mache ich am Schluss statt ImagePNG($image); ein ImageGIF($image); wird das Bild ganz angezeigt, jedoch gibt es einen riesen Qualitätsverlust und es wird "krisselig".

Lasse ich das Bild in der Mitte weg (welches PNG ist), dann wird der Rest der Karte ebenfalls angezeigt, auch ohne Probleme.

Somit vermute ich einfach mal, dass mein Server evtl PNG-Bilder nicht richtig darstellen/erzeugen kann!?

Das Verrückte ist allerdings: Zuhause auf meinem PC und bei mehr als der Hälfte meiner User wird alles richtig dargestellt - am ArbeitsPC und einem kleinen Teil der User sieht es eben so abgehackt aus bzw es erscheint gar kein Bild.

Hier mal mein Code aufs minimalste reduziert:
PHP:
$hex = $row['sets_color'];
$r = substr($hex, 0, 2);
$g = substr($hex, 2, 2);
$b = substr($hex, 4, 2);
$red = hexdec($r);
$green = hexdec($g);
$blue = hexdec($b);

if($row['sets_color2'] != '') {
  $hex = $row['sets_color2'];
  $r = substr($hex, 0, 2);
  $g = substr($hex, 2, 2);
  $b = substr($hex, 4, 2);
  $red2 = hexdec($r);
  $green2 = hexdec($g);
  $blue2 = hexdec($b);
} else {
	$red2 = $red;
	$green2 = $green;
	$blue2 = $blue;
}

header("Content-Type: image/png");

$image = imagecreatetruecolor(114,66);
//$image = imagecreate(114,66);

// links nach rechts Verlauf
$height = 66;
$width = 144;
$right_color = array($red, $green, $blue);
$left_color = array($red2, $green2, $blue2);

$x1 = 0;
$y1 = 0;

$color0=($left_color[0]-$right_color[0])/$width;
$color1=($left_color[1]-$right_color[1])/$width;
$color2=($left_color[2]-$right_color[2])/$width;
for ($i=0;$i<=$width;$i++)
{
  $red=$left_color[0]-floor($i*$color0);
  $green=$left_color[1]-floor($i*$color1);
  $blue=$left_color[2]-floor($i*$color2);
	$newcolor = imagecolorexact($image, 0, 0, 0);
  $col= imagecolorallocate($image, $red, $green, $blue);
  imagecolorset($image, $newcolor, $x1+$i, $y1, $x1+$i);

  imageline($image, $x1+$i, $y1, $x1+$i, $y1+$height, $col);
}
// l-n-r Verlauf ende

if($row['sets_cat_name'] == 'Special') {
  $rahmen = ImageCreateFromGIF("/PFADZURDATEI/card/deck_special_innen.gif");
} else {
  $rahmen = ImageCreateFromPNG("/PFADZURDATEI/card/deck_innen.png");
}

$card = ImageCreateFromPNG("/PFADZURDATEI/card/cards/".$row['sets_name']."/".$row['sets_name']."deck.png");
ImageCopy($image,$card,3,3,0,0,108,54);

$Textfarbe = ImageColorAllocate($image, $red, $green, $blue);
$Textfarbe2 = ImageColorAllocate($image, $red2, $green2, $blue2);

$newcolor = imagecolorexact($rahmen, 0, 0, 0);
imagecolorset($rahmen, $newcolor, $red2, $green2, $blue2);
$newcolor2 = imagecolorexact($rahmen, 16, 16, 16);
imagecolorset($rahmen, $newcolor2, $red, $green, $blue);

$Trans = ImageColorAllocate($image, 0, 255, 0);
ImageColorTransparent($image, $Trans);

ImageCopy($image,$rahmen,0,0,0,0,114,66);

$font = dirname($_SERVER["SCRIPT_FILENAME"]) . "/SG10.ttf";
$font2 = dirname($_SERVER["SCRIPT_FILENAME"]) . "/04B_03__.TTF";

$size = ImageTTFBBox(6, 0, $font2, $set);
$x = (116-($size[2]-$size[0]))/2;
if(isset($_COOKIE['cardtemplate'])) {
  if($_COOKIE['cardtemplate'] == 6) {
    $size = ImageTTFBBox(6, 0, $font2, $set);
    $x = (116-($size[2]-$size[0]))/2;
   	ImageTTFGradient($image, 6, 0, $x, 66, $Textfarbe2, $font2, $set, $Textfarbe2,$Textfarbe);
  } elseif($_COOKIE['cardtemplate'] == 3) {
			ImageTTFGradient($image, 6, 0, $x, 63, $Textfarbe2, $font2, $set, $Textfarbe2,$Textfarbe);
	} else {
		ImageTTFGradient($image, 6, 0, $x, 64, $Textfarbe2, $font2, $set, $Textfarbe2,$Textfarbe);
	}
} else {
	ImageTTFGradient($image, 6, 0, $x, 64, $Textfarbe2, $font2, $set, $Textfarbe2,$Textfarbe);
}

//ImageGIF($image);
ImagePNG($image);
ImageDestroy($image);

Und im Anhang noch Bilder wie es falsch aussieht (deckfalsch.png), als gif (deckgif.png) und wie es aussehen sollte (deckrichtig.png).

Habe die Transparenz auch mal weggelassen, hat sich leider nichts geändert =/

Ich hoffe, jemand von euch hat da eine Idee und kann mir helfen =/
 

Anhänge

  • deckfalsch.png
    deckfalsch.png
    8,4 KB · Aufrufe: 211
  • deckgif.png
    deckgif.png
    5,5 KB · Aufrufe: 212
  • deckrichtig.png
    deckrichtig.png
    15,4 KB · Aufrufe: 217
Das Bild, welches Du einbindest macht hier ganz offenbar Probleme.
Wird das Bild denn bei dir lokal ordentlich generiert?

Ansonsten erstelle mal ein solches (ähnliches) Bild mittels imagecreatefrompng und schau was dabei herauskommt. Ich hoffe Du hast einen Test-System, welches das Bild abgehackt anzeigt.
 
Ich hab mir die Datei einfach geklont und einen anderen Aufruf dafür gemacht.

Imagecreatefrompng benutze ich ja an der Stelle, wo das Bild eingebunden wird.
PHP:
$card = ImageCreateFromPNG("/PFADZURDATEI/card/cards/".$row['sets_name']."/".$row['sets_name']."deck.png");
Oder meinst du an einer anderen Stelle?

Wie bereits gesagt, zuhause am Rechner, wenn ich das selbe Bild aufrufe (oder zb auch mit dem Handy), wird es mir richtig dargestellt - nur zb am Arbeitsrechner eben nicht :(

Und das Problem haben halt leider auch ein paar der User, nicht alle, nur ein relativ kleiner Prozentteil, soweit ich es mitbekommen habe.

Das Bild, welches ich einbinde, ist dieses hier:
chiideck.png (URL: http://card.whispering-secrets.net/cards/chii/chiideck.png)
Das wird alleine auch richtig dargestellt.

Und danke für deine Antwort! :)
 
Mein Gedanke ging mehr dahin, das kleine Bild in das Bild vom Rahmen hineinzubringen, aber ich sehe gerade den kleinen Stern und andere Designelemente die dann zerstört werden würden.

Vielleicht wagst Du mal ein Versuch mit anderer Qualitätsstufe (0-9) und eventuell ohne / alle Filter (PNG_NO_FILTER / PNG_ALL_FILTER). Wenn das Bild dann weiterhin kaputt ist wird es komisch.

http://de3.php.net/manual/de/function.imagepng.php
 
Leider hat das auch nichts geändert :(
Bei PNG_ALL_FILTER kommt sogar dieser Fehler:
PHP:
Notice: Use of undefined constant PNG_ALL_FILTER - assumed 'PNG_ALL_FILTER' in deck2.php on line 178 
Warning: imagepng() expects parameter 4 to be long, string given in deck2.php on line 178

Hat sonst niemand eine Idee? :(

Gibt es sonst noch eine andere Möglichkeit Bilder via PHP erzeugen? Also nicht mit GDLib sondern einer anderen Library?

So sieht übrigens die PHP Info für GD aus:

GD Support enabled
GD Version 2.0
FreeType Support enabled
FreeType Linkage with freetype
FreeType Version 2.4.2
T1Lib Support enabled
GIF Read Support enabled
GIF Create Support enabled
JPEG Support enabled
libJPEG Version 6b
PNG Support enabled
libPNG Version 1.2.44
WBMP Support enabled

Directive - Local Value - Master Value
gd.jpeg_ignore_warning - 0 - 0

Hilft das evtl jemandem weiter? :(

Sorry für Doppelpost, möchte nur kurz was wichtiges einwerfen:

Ich habe mal Kaspersky deaktiviert und nun werden mir auch alle Karten angezeigt.
Zuhause hab ich jedoch auch Kaspersky und dort geht es ohne Probleme.

Was die User für Antivirenprogramme haben, weiß ich jedoch (noch) nicht.

Hat da vielleicht noch jemand eine Idee?

Sehen manche Antivirenprogs evtl das als "gefährlich" an oder so?
 
Hi

Kann man sich das online irgendwo anschauen?

Ist jedenfalls seltsam.
PHP-Code sollte man mit den bisherigen Infos als Problemursache ausschließen können,
würde eher "Bug in Browser/Plugins/AV" sagen.
Wogegen man schwer was machen kann.

Kombinationen von AV an/aus, Browserplugins alle/bestimmte an/aus,...
Browser?, Betriebssystem?


(Hideki lässt grüßen :D)
 
Huhu :)

Also ansehen kannst du dir das ganze auf http://www.whispering-secrets.net
Auf der Hauptseite sind ja schon ein paar Karten - siehst du diese richtig, dann hast du das Problem nicht - werden sie bei dir abgeschnitten oder nicht angezeigt, dann hast du das selbe Problem.. ^^

Ich habe nun die Leute mal angeschrieben.

Bei vielen werden die "Searchcards" (Suchkarten für Karten, die noch fehlen) nicht geladen.
Beispiel: http://card.whispering-secrets.net/search_20.png

Das Problem kann ich nur leider gar nicht reproduzieren.

Bei anderen werden die Karten eben abgeschnitten angezeigt (sind jetzt aber nicht soooo viele, wie ich bisher bemerkt habe - einige davon benutzen Kaspersky).

Und ein paar andere haben einfach allgemein wohl ein langsames Internet, dass die Karten erst beim 2. Reload richtig geladen werden.

Der Fehler tritt bei den Leuten in allen Browsern auf - egal ob FireFox, Opera, Chrome oder IE.

In der Arbeit hab ich folgendes:
- Win7 64bit
- Kaspersky
- Firefox 13

Zuhause:
- WinXP 32bit
- Kaspersky
- Firefox 13


Plugins sind ziemlich ähnlich bei beiden PCs.
Hab auch mal alle deaktiviert - ist das selbe Problem da.


(und ich grüße zurück ^^)
 
OK, Korrektur: Es liegt doch an PHP :D
Zumindest bei den Searchcards.

(ach so, whispering-secrets ist deine Seite...
irgendwie dachte ich zuerst, nur das Bild hast du von dort :))

Am Bild selbst ist überhaupt kein Problem,
auch nicht an den PNG-spezifischen Funktion oder Browsern, Plugins oder Aintiviren.

Nur gibts so eine nette Fehlermeldung:
Code:
Notice: Undefined index: cardtemplate in /var/customers/webs/wstcg/card/searchcard.php on line 88
die mit dem Bild zusammen als PNG rausgeschickt wird.
Die Meldung steht ganz am Anfang, noch vor den Infos, dass das hier ein PNG-Bild ist...
da bekommt jedes Anzeigeprogramm Probleme.
Wenn man die Buchstaben händisch aus den Daten rausnimmt
kommt ein komplettes, fehlerfreies Bild raus.

Bei dem anderen Problem mit dem Abgeschnitten-sein
könnte eine ähnliche Meldung an anderer Stelle der Datei schuld sein.

Aber da die Bilddaten selbst problemlos ankommen...

Möglichkeit 1, schnell:
PHP:
error_reporting(0);
ini_set('display_errors', 0);
an den Anfang der betroffenen PHP-Datei(en).
Dreht alle Meldungen ab. Solche Meldungen gehen die Benutzerschaft sowieso nichts an.
(Ob das greift hängt auch von den generellen Servereinstellungen ab,
aber probieren schadet nicht. Ggf. muss eben mehr umgestellt werden).
(Alternativ könnte man die Meldungen auch in Logs etc. umleiten,
aber zuerst mal so versuchen).

Möglichkeit 2 (bzw. beide zusammen ist auch nicht schlecht):
Den Code eben ausbessern...
Kein Zugriff auf nicht existierende Variablen mehr.
Bzw. mit isset prüfen, ob die Var existiert, sonst was Anderes tun.
 
Kennst du WS denn sogar? ;)

Omg, danke! ^^
Die Searchcards sollten nun (hoffentlich) gehn.
Da hatte noch eine isset-Abfrage in einem else-Fall gefehlt :')

Dein Tipp von Möglichkeit 1 zeigt leider keine Veränderung :(

Wie bzw wo genau hast du denn die obige Fehlermeldung gefunden?

Aber danke schonmal für die eine Lösung! :)
 
Kennst du WS denn sogar? ;)
Kannte WS vor diesem Thread noch nicht (bin aber generell eher kein Onlinespieler)

Omg, danke! ^^
Die Searchcards sollten nun (hoffentlich) gehn.
Da hatte noch eine isset-Abfrage in einem else-Fall gefehlt :')

Dein Tipp von Möglichkeit 1 zeigt leider keine Veränderung :(
Auch für später würde es Sinn machen, die Fehlermeldungsbehandlung umzustellen.

Je nach Hoster/Produkt gibt es (hoffentlich) irgendwo Einstellungen zum Standardverhalten
(Menge (Gar nichts, nur schwere Fehler...Alles) und Ort (Zum Nutzer/Log/...))
und ob die PHP-Scripts das selbst einstellen dürfen
(zB mit den zwei genannten Anweisungen) oder nicht.

Wie bzw wo genau hast du denn die obige Fehlermeldung gefunden?
Den Link von oben angeklickt (http://card.whispering-secrets.net/search_20.png)
zeigte mir mein Browser (Firefox auf Windows) nur,
dass das Bild fehlerhaft ist und nicht angezeigt werden kann.
(Diese Meldungen kommt nicht, wenn das Bild in eine HTML-Seite eingebunden ist,
nur beim Alleinaufruf...)
(Hab keine Ahnung, ob jeder Firefox von Haus aus solche Meldungen bringt,
oder ob ich das bei mir irgendwann eingestellt hab.
Komplett verstellte Programme sind hier nichts Ungewöhnliches :))

Dann die nicht anzeigbare Datei auf die Festplatte gespeichert und mit einem Hexeditor geöffnet.
Bei Bildern versteht man textuell ja normalerweise nichts, aber Bildformate wie JPG/PNG...
haben alle einen charakteristischen Anfang.
Wollte nur schauen, ob der da ist oder was der Server sonst da erzeugt haben könnte.
...und da war dann die Meldung von PHP.
Nach der Zeilennummer des Fehlers kam dann der ordentliche PNG-Header.
Meldung testweise rausgelöscht, Bild konnte geöffnet werden.
 
Zurück