Thumbnails

Loveboat

Erfahrenes Mitglied
Hallo zusammen,

hoffe jemand kann mir auch mal helfen. Bin dabei mir eine eigene Bildergalerie zu schreiben. Diese soll wie folgt aussehen.

In einer Datenbank stehen zwei Einträge ("path" und "file") welche die Originalbilder in der vollen Größe enthalten. Diese werden mit einer Schleife ausgelesen und sollen dann in einer Galerie mit kleinen Bildern (so ca 5k) dargestellt werden. Die kleinen Thumbs sollen temporär in dem Unterordner "thumbs" liegen damit ich sie weiter nutzen kann.

Mein Script hat auch mal funktioniert, aber dann auf einmal nicht mehr und ich weiß nicht warum.

Hier mal mein Script:

PHP:
echo '<tr>';
			$sql1 = "SELECT DISTINCT * FROM tab_galerie WHERE abteilung = '$abteilung' AND submenue1='$gruppe' LIMIT $start,$maxentry";
			$result = mysql_query($sql1);
			while($mygrp = mysql_fetch_assoc($result))
				{
				$path = $mygrp["path"];
				$bild = $mygrp["file"];
				$size = getimagesize("$path"."$bild"); 
				$breite = $size[0]; 
				$hoehe = $size[1];
				if($breite > $hoehe)
					{
					$neueBreite = 100;
					$neueHoehe = intval($hoehe*$neueBreite/$breite);
					}
				elseif($hoehe > $breite)
					{
					$neueBreite = intval($neueHoehe*$breite/$hoehe);
					$neueHoehe = 75;
					}
				elseif($hoehe == $breite)
					{
					$neueBreite = 75;
					$neueHoehe = 75;
					}
				else
					{
					$neueBreite = 0;
					$neueHoehe = 0;
					}
				$altesBild = ImageCreateFromJPEG("$path"."$bild"); 
				$neuesBild = imagecreatetruecolor($neueBreite,$neueHoehe); 
				imageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe); 
				ImageJPEG($neuesBild,"$path"."thumbs/"."$bild"); 
				$Thumbnail=$path."thumbs/".$bild;  
				echo '<td width="130" height="130" align="center" valign="top">
						<table class="table_pic" onmouseover="this.className=\'table_pic_over\'" onmouseout="this.className=\'table_pic\'" onclick="window.open(\'../picture.php?action=go&id='.$mygrp["id"].'\',\'Bild1\',\'width=575,height=400,screenX=200,screenY=0,hotkeys=no\')" width="130" height="130" border="0" id="table1" cellspacing="0" cellpadding="3">
							<tr>
								<td height="5"></td>
							</tr>
							<tr>
								<td height="75" align="center"><img src="'.$Thumbnail.'" width="'.$neueBreite.'" height="'.$neueHoehe.'"></td>
							</tr>
							<tr>
								<td height="40" class="font6" align="center" valign="top">'.$mygrp["comment"].'</td>
							</tr>
						</table>	
					  </td>';
				}
			echo '</tr>';

Meine jetzige Fehlermeldung ist folgende:

Warning: imagejpeg(): Unable to access ../pics/galerie/thumbs/1garde.jpg in /mnt/ja2/02/922/00000012/htdocs/karneval/garde_foto1.php on line 76

Warning: imagejpeg(): Invalid filename '../pics/galerie/thumbs/1garde.jpg' in /mnt/ja2/02/922/00000012/htdocs/karneval/garde_foto1.php on line 76

Line 76 ist folgende in dem oben gezeigten Ausschnitt:
ImageJPEG($neuesBild,"$path"."thumbs/"."$bild");


Denn Unterordner "thumbs" habe ich mit Schreibrechte versehen (chmod 777).

Was mache ich falsch?

Danke schon mal vorab.

Gruß
Loveboat
 
Existiert die betreffende Datei überhaupt; was liefert denn beispielsweise var_dump(file_exists($path.$bild)); zurück?
 
Hey super,

das tut es auch. Aber kapieren tu ich es noch nicht warum das so ist.
Soweit ich es verstehe, lege ich es erst mal an und schließe die Datei, damit ImageJPG() drauf zugreifen kann!? Ich dachte dass die Funktion die Datei automatisch anlegt.

Hab mein Script jetzt wie folgt abgeändert:

PHP:
				$altesBild = ImageCreateFromJPEG("$path"."$bild"); 
				$neuesBild = imagecreatetruecolor($neueBreite,$neueHoehe); 
				imageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe);
				$fh=fopen("$path"."thumbs/"."$bild",'w');
				fclose($fh);
				ImageJPEG($neuesBild,"$path"."thumbs/"."$bild"); 
				$Thumbnail=$path."thumbs/".$bild;

Mir wäre jetzt aber mal eine echt technische Erklärung wichtig damit ich das versteh und nicht einfach so weiter benutze.

Danke und Gruß
Loveboat
 
Laut der Meinung des lieben Ilia dürften die image* Funktionen keine Rechte haben eine Datei zu erstellen.
Diese Änderung wurde jedoch erst kürzlich und in einem Minor-Release eingeführt, was mich an der Releasepolitik zweifeln lässt.
 
wenn die Rechte zum erstellen von Dateien erst kürzlich eingeführt wurden, warum ging es schon lange vorher und jetzt nicht mehr? Das raff ich nicht...

:(
 
Du kannst das Ganze auch handlich in eine Funktion packen:
PHP:
<?php

	/**
	* @param    resource    $im         image resource
	* @param    int         $type       image type; php constants IMG_GIF, IMG_JPG, IMG_PNG, IMG_WBMP
	* @param    string      $filename   filename
	* @return   bool
	*/
	function imageCreate($im, $type, $filename)
	{

		if( !is_resource($im) || get_resource_type($im) || !is_int($type) || !(bool) (imagetypes() & $type) ) {
			return false;
		}
		if( file_exists($filename) ) {
			if( !is_writeable($filename) ) {
				return false;
			}
		} else {
			if( !fclose(fopen($filename, 'w')) ) {
				return false;
			}
		}
		switch( $type ) {
			case IMG_GIF:
				return imagegif($im, $filename);
				break;
			case IMG_JPG:
				return imagejpg($im, $filename);
				break;
			case IMG_PNG:
				return imagepng($im, $filename);
				break;
			case IMG_WBMP:
				return imagewbmp($im, $filename);
				break;
		}

	}

/*
	…
	$altesBild = ImageCreateFromJPEG($path.$bild);
	$neuesBild = ImageCreateTrueColor($neueBreite, $neueHoehe);
	imageCopyResized($neuesBild, $altesBild, 0, 0, 0, 0, $neueBreite, $neueHoehe, $breite, $hoehe);
	$Thumbnail = $path.'thumbs/'.$bild;
	imageCreate($neuesBild, IMG_JPG, $Thumbnail);
	…
*/

?>
 
Loveboat hat gesagt.:
wenn die Rechte zum erstellen von Dateien erst kürzlich eingeführt wurden, warum ging es schon lange vorher und jetzt nicht mehr? Das raff ich nicht...
Die Kontrollierung der Rechte wurde kürzlich eingeführt. Richtig lesen hilft.
 
Zurück