Bilderskalierung

Kategorien: PHP & MySQL
10 Antworten
JayT
JayT am Montag, 12. Dezember 2005 um 09:10
Hallo Leutz habe ein Problem mit meinem Script. Hier das Script: function grafik($Grafik){ $Bilddaten = getimagesize($Grafik); $OriginalBreite = $Bilddaten[0]; $OriginalHoehe = $Bilddaten[1]; $ThumbnailBreite = 128; if($OriginalBreite < $ThumbnailBreite){ $ThumbnailBreite=$OriginalBreite; } $Skalierungsfaktor = $OriginalBreite/$ThumbnailBreite; $ThumbnailHoehe = intval($OriginalHoehe/$Skalierungsfaktor); if($Bilddaten[2] == 1){ $Originalgrafik = ImageCreateFromGIF($Grafik); $Thumbnailgrafik = ImageCreateTrueColor($ThumbnailBreite, $ThumbnailHoehe); ImageCopyResized($Thumbnailgrafik, $Originalgrafik, 0, 0, 0, 0, $ThumbnailBreite, $ThumbnailHoehe, $OriginalBreite, $OriginalHoehe); ImageGIF($Thumbnailgrafik, "thumb_".$Grafik); }elseif($Bilddaten[2] == 2){ $Originalgrafik = ImageCreateFromJPEG($Grafik); $Thumbnailgrafik = ImageCreateTrueColor($ThumbnailBreite, $ThumbnailHoehe); ImageCopyResized($Thumbnailgrafik, $Originalgrafik, 0, 0, 0, 0, $ThumbnailBreite, $ThumbnailHoehe, $OriginalBreite, $OriginalHoehe); ImageJPEG($Thumbnailgrafik, "thumb_".$Grafik); }elseif($Bilddaten[2] == 3){ $Originalgrafik = ImageCreateFromPNG($Grafik); $Thumbnailgrafik = ImageCreateTrueColor($ThumbnailBreite, $ThumbnailHoehe); ImageCopyResized($Thumbnailgrafik, $Originalgrafik, 0, 0, 0, 0, $ThumbnailBreite, $ThumbnailHoehe, $OriginalBreite, $OriginalHoehe); ImagePNG($Thumbnailgrafik, "thumb_".$Grafik); } return $Grafik; } aufrufen tuhe ich es mit: $gb[bild] = grafik($gb[bild]); damit es an einer stelle verkleinert angezeigt wird, aber jetzt kommt dieser Fehler: Warning: getimagesize(bild1.jpg): failed to open stream: No such file or directory in /home/p/planet-vox.de/public_html/function.php on line 17 Warning: Division by zero in /home/p/planet-vox.de/public_html/function.php on line 24 Warning: Division by zero in /home/p/planet-vox.de/public_html/function.php on line 25 Warning: Division by zero in /home/p/planet-vox.de/public_html/function.php on line 24 Warning: Division by zero in /home/p/planet-vox.de/public_html/function.php on line 25 Kann mir vielleicht jemand dabei helfen?

Kommentare

Markus René Einicher
Markus René Einicher am Montag, 12. Dezember 2005 um 12:02

Ja das heißt das die Grafik bild.jpg nicht gefunden wird, und deshalb schlagen dann die witeren vier Divisionen fehl.

Wo liegt den bild.jpg, im selben Ordner wie die function.php? Wenn nicht must du den ganzen Pfad zur Datei, also mit ../bilder/bild.jpg zum Beispiel angeben.

JayT
JayT am Montag, 12. Dezember 2005 um 21:52

Original von EaStErDoM:
Ja das heißt das die Grafik bild.jpg nicht gefunden wird, und deshalb schlagen dann die witeren vier Divisionen fehl.

Wo liegt den bild.jpg, im selben Ordner wie die function.php? Wenn nicht must du den ganzen Pfad zur Datei, also mit ../bilder/bild.jpg zum Beispiel angeben.




function grafik($Grafik){
$Bilddaten = getimagesize($Grafik);
$OriginalBreite = $Bilddaten[0];
$OriginalHoehe = $Bilddaten[1];
$ThumbnailBreite = 128;
if($OriginalBreite < $ThumbnailBreite){
$ThumbnailBreite=$OriginalBreite;
}
$Skalierungsfaktor = $OriginalBreite/$ThumbnailBreite;
$ThumbnailHoehe = intval($OriginalHoehe/$Skalierungsfaktor);

if($Bilddaten[2] == 1){
$Originalgrafik = ImageCreateFromGIF($Grafik);
$Thumbnailgrafik = ImageCreateTrueColor($ThumbnailBreite, $ThumbnailHoehe);
ImageCopyResized($Thumbnailgrafik, $Originalgrafik, 0, 0, 0, 0, $ThumbnailBreite, $ThumbnailHoehe, $OriginalBreite, $OriginalHoehe);
ImageGIF($Thumbnailgrafik, "../images/thumb_$Grafik");
}elseif($Bilddaten[2] == 2){
$Originalgrafik = ImageCreateFromJPEG($Grafik);
$Thumbnailgrafik = ImageCreateTrueColor($ThumbnailBreite, $ThumbnailHoehe);
ImageCopyResized($Thumbnailgrafik, $Originalgrafik, 0, 0, 0, 0, $ThumbnailBreite, $ThumbnailHoehe, $OriginalBreite, $OriginalHoehe);
ImageJPEG($Thumbnailgrafik, "../images/thumb_$Grafik");
}elseif($Bilddaten[2] == 3){
$Originalgrafik = ImageCreateFromPNG($Grafik);
$Thumbnailgrafik = ImageCreateTrueColor($ThumbnailBreite, $ThumbnailHoehe);
ImageCopyResized($Thumbnailgrafik, $Originalgrafik, 0, 0, 0, 0, $ThumbnailBreite, $ThumbnailHoehe, $OriginalBreite, $OriginalHoehe);
ImagePNG($Thumbnailgrafik, "../images/thumb_$Grafik");
}
return $Grafik;
}


Habe es jetzt so geändert, aber der gleiche Fehler tritt immernoch auf.

Struktur:
- Basisordner
- function.php
- images
- bild1.jpg

Markus René Einicher
Markus René Einicher am Dienstag, 13. Dezember 2005 um 11:13

Wenn die images im selben Ordner wie die function.php liegen, brauchst nicht nochmal mit ../ rausgehen.

../ bedeutet, dass du eine Ordnerebene zurück gehst. In deinem Fall wärs du dann über dem Basisordner.

und das Bild heißt wirklich thumb_bild1.jpg? Denn genau das setzt sich dann dort oben zusammen.

Wieso hast du alle einträge innerhalb der Funktion geändert? Es hätte gereicht, wenn du einfach die Funktion mit dem ganzen Pfad aufrufst:

$grafik = grafik('images/bild1.jpg');

... geht?

JayT
JayT am Dienstag, 13. Dezember 2005 um 15:08

Habe mal was neues probiert, hier der code:


<?
require("config.inc.php");
require("function.php");

$gbook_view_bit = "";
$gb_query = mysql_query("SELECT * FROM gbook ORDER by id ASC");
while($gb = mysql_fetch_array($gb_query)) {
$Grafik = "images/$gb[bild]";
//------start thumbnailer
$thumbsize=120;
list($width, $height) = getimagesize($Grafik);
$imgratio=$width/$height;
if ($imgratio>1){
$newwidth = $thumbsize;
$newheight = $thumbsize/$imgratio;}
else{
$newheight = $thumbsize;
$newwidth = $thumbsize*$imgratio;}
$thumb = ImageCreateTrueColor($newwidth,$newheight);
$source = imagecreatefromjpeg($Grafik);
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
$gb[bild] = imagejpeg($thumb,"images/thumb/thumb_$gb[bild]",100);
eval ("$gbook_view_bit .= "".gettemplate("gbook_view_bit")."";");
}

eval ("$quick_menu .= "".gettemplate("quick_menu")."";");
eval ("$content .= "".gettemplate("gbook")."";");
eval ("$quick_menu2 .= "".gettemplate("quick_menu2")."";");
eval ("dooutput("".gettemplate("main")."");");
?>


Jetzt kommt dieser Fehler:


Warning: getimagesize(): Read error! in /home/p/planet-vox.de/public_html/gbook.php on line 11

Warning: Division by zero in /home/p/planet-vox.de/public_html/gbook.php on line 12

Warning: imagecreatetruecolor(): Invalid image dimensions in /home/p/planet-vox.de/public_html/gbook.php on line 19

Warning: imagecreatefromjpeg(): gd-jpeg: JPEG library reports unrecoverable error: in /home/p/planet-vox.de/public_html/gbook.php on line 20

Warning: imagecreatefromjpeg(): 'images/' is not a valid JPEG file in /home/p/planet-vox.de/public_html/gbook.php on line 20

Warning: imagecopyresized(): supplied argument is not a valid Image resource in /home/p/planet-vox.de/public_html/gbook.php on line 21

Warning: imagejpeg(): supplied argument is not a valid Image resource in /home/p/planet-vox.de/public_html/gbook.php on line 22

blackfeet
blackfeet am Dienstag, 13. Dezember 2005 um 17:17

Warning: getimagesize(): Read error! in /home/p/planet-vox.de/public_html/gbook.php on line 11

Das heißt wohl das mit $Grafik was nicht stimmt.
$Grafik = "images/$gb[bild]";
Und da ist auch was sehr unschön dass in manchen/einigen PHP Versionen sogar zu Fehlverhalten führt. Prinzipiell verlangt php bei assoziativen Arrays einen String als Schlüssel. Also etwas in Hochkomma. Ob einzeln oder doppelt ist prinzipiell egal, der Unterschied zwischen den Beiden ist das PHP bei den doppelten (") nachschaut ob darin Variablen sind und diese durch ihre Werte ersetzt, bei den einfachen jedoch nicht.
Nach dem du das gelesen hast würdest du warscheinlich die Zeile so abändern:
$Grafik = "images/$gb[&#039;bild&#039;]";
Das geht leider auch nicht, da PHP hier $gb zu ersetzen versuchen würde und diese Variable existiert nicht. Deshalb musst du prinzipiell bei assoziativen Variablen den Verkettungsoperator Punkt (.) verwenden.
Richtig sieht es dann so aus:
$Grafik = "images/".$gb[&#039;bild&#039;];

Ach ja, wenn es dann auch noch nicht klappt dann mach mal echo $Grafik, und schau was da rauskommt. Variablen mit echo zu überprüfen ob sie überhaupt gefüllt sind bzw. richtig gefüllt sind ist immer ein guter Tipp.

JayT
JayT am Dienstag, 13. Dezember 2005 um 18:16

Habe es jetzt so gelöst:

<?
require("config.inc.php");
require("function.php");

$gbook_view_bit = "";
$gb_query = mysql_query("SELECT * FROM gbook ORDER by id ASC");
while($gb = mysql_fetch_array($gb_query)) {
$bild = $gb[bild];
$bilderordner = "images/";
//------start thumbnailer
$size = getimagesize($bilderordner.$bild);
$breite = $size[0];
$hoehe = $size[1];
if(($breite > 100) and ($hoehe > 50)) {
$neueBreite = 100;
$neueHoehe = intval($hoehe * $neueBreite / $breite);
$altesBild = ImageCreateFromJPEG("$bilderordner"."$bild");
$neuesBild = ImageCreateTrueColor($neueBreite, $neueHoehe);
imageCopyResized($neuesBild, $altesBild, 0, 0, 0, 0, $neueBreite, $neueHoehe, $breite, $hoehe);
ImageJPEG($neuesBild, "$bilderordner"."tn_"."$bild");
$gb[bild] = $bilderordner."tn_".$bild;
}

eval ("$gbook_view_bit .= "".gettemplate("gbook_view_bit")."";");
}

eval ("$quick_menu .= "".gettemplate("quick_menu")."";");
eval ("$content .= "".gettemplate("gbook")."";");
eval ("$quick_menu2 .= "".gettemplate("quick_menu2")."";");
eval ("dooutput("".gettemplate("main")."");");
?>


Aber es kommt noch dieser Fehler:

Warning: getimagesize(): Read error! in /home/p/planet-vox.de/public_html/gbook.php on line 11


In Zeile 11:

$size = getimagesize($bilderordner.$bild);


Er erstellt dass Bild verkleinert, aber oben wird der Fehler von Zeile 11 angezeigt

blackfeet
blackfeet am Dienstag, 13. Dezember 2005 um 18:38

$bild = $gb[bild];
das ist noch immer unschön, es sollte so aussehen:
$bild = $gb[&#039;bild&#039;];

Ist $bild wirklich belegt? Und vor allem richtig?

Der Fehler muss fast daran liegen. Dieser Fehler wird nämlich bei nicht vorhandensein des Bildes erzeugt.

Also mach mal:
echo $bildordner.$bild

Das musst du klarerweise nach dem du die Variablen belegt hast einfügen.
Das was dabei rauskommt zeig dann mal her.

Und warum machst du das hier unter Anführungsstrichen?
$altesBild = ImageCreateFromJPEG("$bilderordner"."$bild");

Du solltest dir villeicht noch mals anschauen was welche Anführungszeichen machen.

JayT
JayT am Dienstag, 13. Dezember 2005 um 18:46

Er gibt mir dies aus:

images/bild1.jpgimages/

blackfeet
blackfeet am Dienstag, 13. Dezember 2005 um 19:03

"bild1.jpg" nehme ich mal wurde wirklich skaliert und passt.

Er versucht dann aber nochmals ein bild das nur images/ heißt du skalieren also eignetlich den Ordner.
Daraus folgt dass du in der Datenbank 2 Einträge in der Tabelle gbook hast. Einer enthält dabei richtig einen Eintrag in der spalte bild, der andere ist aber leer.

Wenn das unbeabsichtigt war dann lösche einfach den Eintrag. Wenn es aber normal ist dass in deiner Tabelle Zeilen sind die kein bild enthalten, dann musst du deine Select Abfrage so abändern dass nur mehr Zeilen ausgegeben werden in denen auch wirklich die Spalte bild ausgefüllt ist.

JayT
JayT am Dienstag, 13. Dezember 2005 um 19:33

Big thx, es klappt