Seite 1 von 1

Album Mod - "getimagesize" für Thumbnail Problem

Verfasst: 17.07.2006 20:44
von yy
Hallo zusammen und vorab Danke für die Hilfe!
Für einen Pro ist das hier in max. 5-10 Min gegessen 8)

Folgendes:

1.
Ich benutze Smartors Album Mob und ein kleines Hack, um mir auf irgend einer Seite z.B. das neuste Foto bzw. dessen Thumbnail anzeigen zu lassen.

Das sieht in der page_header.php im Orginal so aus:

Code: Alles auswählen

$Display = 'Recent'; 
$CategoryID = 0;  

if ($Display == 'Recent') 
{ 
      $sql = "SELECT p.pic_id, p.pic_title, p.pic_username, p.pic_user_id, p.pic_time, p.pic_desc, p.pic_lock, p.pic_approval, u.username
         FROM ". ALBUM_TABLE ." AS p 
         LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id 
         WHERE  pic_approval = 1 AND pic_lock = 0 AND pic_cat_id = $CategoryID
         ORDER BY pic_time DESC 
         LIMIT 0,1"; 
   }
if (!$result = $db->sql_query($sql)) 
{ 
   message_die(GENERAL_ERROR, 'Could not query album information', '', __LINE__, __FILE__, $sql); 
} 
$picrow = $db->sql_fetchrow($result); 
$pic_poster = '<a href="'. append_sid("profile.$phpEx?mode=viewprofile&". POST_USERS_URL .'='. $picrow['pic_user_id']) .'">'. $picrow['pic_username'] .'</a>';
2.
Funktioniert auch alles wunderprächtig, schon immer.
Was mir jedoch schon seit Monaten auf den Nerv geht, ist die Tatsache das mein Layout immer zerhäckselt wird. Warum? Das Thumbnail bekommt natürlich keine Größenangabe mitgegeben (Höhe und Breite).
Und da ich diesbezüglich nichts gefunden habe, habe ich mich mal hingesetzt und eine Lösung geschrieben.

Das sieht dann wie folgt aus:

Code: Alles auswählen

$Display = 'Recent'; 
$CategoryID = 0;  

if ($Display == 'Recent') 
{ 
      $sql = "SELECT p.pic_id, p.pic_title, p.pic_username, p.pic_user_id, p.pic_time, p.pic_desc, p.pic_lock, p.pic_approval, u.username, p.pic_thumbnail as picthumbnail
         FROM ". ALBUM_TABLE ." AS p 
         LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id 
         WHERE  pic_approval = 1 AND pic_lock = 0 AND pic_cat_id = $CategoryID
         ORDER BY pic_time DESC 
         LIMIT 0,1"; 
   }
if (!$result = $db->sql_query($sql)) 
{ 
   message_die(GENERAL_ERROR, 'Could not query album information', '', __LINE__, __FILE__, $sql); 
} 
$picrow = $db->sql_fetchrow($result); 
$pic_poster = '<a href="'. append_sid("profile.$phpEx?mode=viewprofile&". POST_USERS_URL .'='. $picrow['pic_user_id']) .'">'. $picrow['pic_username'] .'</a>';
$pic_dimension = getimagesize(ALBUM_UPLOAD_PATH .'cache/'. $picrow['picthumbnail']);
$pic_thumb = $pic_dimension[3];
Folgende Änderungen habe ich vorgenommen:
- Mit , p.pic_thumbnail as picthumbnail wird jetzt zusätzlich der Dateiname des Thumbnails ausgelesen
- Folgender Code hinzugefügt, um Dateigröße auszulesen, etc... Profis werden rauslesen können was ich damit bezwecke:
$pic_dimension = getimagesize(ALBUM_UPLOAD_PATH .'cache/'. $picrow['picthumbnail']);
$pic_thumb = $pic_dimension[3];



3.
Auch dies funktioniert wunderprächtig! (Auch wenn ich nicht weiss ob ich es sauber oder dirty gecoded habe :-?
Das einzigste Problem besteht jetzt darin:

Er lädt den Namen der Thumbnaildatei aus der Datenbank und versucht dann die Breite und Höhe auszulesen, da er ja von mir gesagt bekommen hat wo die Thumbnaildateien liegen. Das klappt auch prima, aber natürlich NICHT, wenn das Thumbnail noch nicht vorhanden ist. Das resultiert dann natürlich in einer Fehlermeldung auf der Seite :cry:

4.
Lösung!
Das einzigste was ich nun bräuchte wäre jemand der mir ein kleines Workaround für mein Problem schreibt. *liebguck*

Vorschlag 1: Zuerst prüfen, ob die Thumbnail-Datei an angegebener Stelle überhaupt vorhanden ist, ansonsten den Versuch die Größe des Thumbnails auszulesen abbrechen.

Vorschlag 2: Sobald ein User ein Foto hochlädt, sollte sofort das dazu passende Thumbnail generiert werden. Dann ist es sofort verfügbar und nicht erst wenn es das erste mal abgerufen wurde.

--------------------

Soo ich hoffe ich konnte mein winziges Problem gut erläutern und mir kann geholfen werden, denn für einen Pro der weiss was ich meine ist das wohl nur eine Sache von 2-3 Zeilen Code, um das Problem zu beseitigen.

Ich danke allen die mir helfen wollen, können oder es versuchen vielmals!
:grin:

Verfasst: 17.07.2006 22:38
von yy
Hab in der Zwischenzeit mal ein wenig nachgelesen.
Kann mir jemand sagen, ob dies mein Problem lösen würde?

Code: Alles auswählen

$pic_thumbnail = 'ALBUM_UPLOAD_PATH .'cache/'. $picrow['picthumbnail']';
if (file_exists($pic_thumbnail)) {
   $pic_dimension = getimagesize(ALBUM_UPLOAD_PATH .'cache/'. $picrow['picthumbnail']);
   $pic_thumb = $pic_dimension[3];
}
Würde das so funktionieren? Indem er einfach erstmal mit file_exists überprüft, ob die Datei vorhanden ist - und erst dann die Größe der Datei ermittelt.

Ist die Datei nicht vorhanden, dürfte ja nichts passieren, ausser das die Variable $pic_thumb leer bleibt, korrekt? Aber zumindest dürften dann keine Fehlermeldungen mehr kommen, wenn er versucht einen (noch) nicht vorhandenen Thumbnail zu laden und dessen Breite und Höhe zu messen, richtig?

Hoffe mir kann jemand helfen und meine Fragen beantworten, wäre sehr lieb...

Verfasst: 18.07.2006 08:35
von Max
Hallo,


nur mal so als Idee...

Guck doch mal hier: http://www.phpbb.de/viewtopic.php?t=123878

Da wird das Thumbnail auf Vorhandensein abgefragt, wenn ja = gut, wenn nein = erstelle es

Könntest ja da etwas abschreiben und schon ist Dein Problem gelöst. Also statt Fehlermeldung lass das Teil einfach ein Thumbnail erstellen.
Ist praktisch eine Kombination aus Vorschlag 1 und 2
Allerdings Vorschlag 2 ist doch eigentlich Standard, musst mal in der album_upload.php gucken...
fängt hier an:

Code: Alles auswählen

	// --------------------------------
	// This image is okay, we can cache its thumbnail now
	// --------------------------------

	if( ($album_config['thumbnail_cache']
und geht dann ein ganzes Stück weiter.



Gruß Max

Verfasst: 18.07.2006 14:44
von yy
Hallo Max!

Danke für den Linktipp, der mich allerdings nicht wirklich weitergebracht hat :cry:
Komisch komisch, hab mir den von dir genannten Abschnitt in der album_upload.php einmal angesehen und wenn ich es richtig verstehe müsstet du Recht haben.
Denn eigentlich müsste das Thumbnail automatisch erstellt werden, nachdem ein User ein Bild hochgeladen hat, oder sehe ich was falsch?
So hab ich es zumindest "rausgelesen":

album_upload.php:

Code: Alles auswählen

	// --------------------------------
	// This image is okay, we can cache its thumbnail now
	// --------------------------------

	if( ($album_config['thumbnail_cache'] == 1) and ($pic_filetype != '.gif') and ($album_config['gd_version'] > 0) )
	{
		$gd_errored = FALSE;

		switch ($pic_filetype)
		{
			case '.jpg':
				$read_function = 'imagecreatefromjpeg';
				break;
			case '.png':
				$read_function = 'imagecreatefrompng';
				break;
		}

		$src = @$read_function(ALBUM_UPLOAD_PATH  . $pic_filename);

		if (!$src)
		{
			$gd_errored = TRUE;
			$pic_thumbnail = '';
		}
		else if( ($pic_width > $album_config['thumbnail_size']) or ($pic_height > $album_config['thumbnail_size']) )
		{
			// Resize it
			if ($pic_width > $pic_height)
			{
				$thumbnail_width = $album_config['thumbnail_size'];
				$thumbnail_height = $album_config['thumbnail_size'] * ($pic_height/$pic_width);
			}
			else
			{
				$thumbnail_height = $album_config['thumbnail_size'];
				$thumbnail_width = $album_config['thumbnail_size'] * ($pic_width/$pic_height);
			}

			$thumbnail = ($album_config['gd_version'] == 1) ? @imagecreate($thumbnail_width, $thumbnail_height + 16) : @imagecreatetruecolor($thumbnail_width, $thumbnail_height + 16);

			$resize_function = ($album_config['gd_version'] == 1) ? 'imagecopyresized' : 'imagecopyresampled';

			@$resize_function($thumbnail, $src, 0, 0, 0, 0, $thumbnail_width, $thumbnail_height, $pic_width, $pic_height);
$dimension_font = 1;
$dimension_filesize = filesize(ALBUM_UPLOAD_PATH . $pic_filename);
$dimension_string = $pic_width . "x" . $pic_height . " " . intval($dimension_filesize/1024) . "Kb";
$dimension_colour = ImageColorAllocate($thumbnail,255,255,255);
$dimension_height = imagefontheight($dimension_font);
$dimension_width = imagefontwidth($dimension_font) * strlen($dimension_string);
$dimension_x = ($thumbnail_width - $dimension_width) / 2;
$dimension_y = $thumbnail_height + ((16 - $dimension_height) / 2);
imagestring($thumbnail, 1, $dimension_x, $dimension_y, $dimension_string, $dimension_colour);
		}
		else
		{
			$thumbnail = $src;
		}

		if (!$gd_errored)
		{
			$pic_thumbnail = $pic_filename;

			// Write to disk
			switch ($pic_filetype)
			{
				case '.jpg':
					@imagejpeg($thumbnail, ALBUM_CACHE_PATH . $pic_thumbnail, $album_config['thumbnail_quality']);
					break;
				case '.png':
					@imagepng($thumbnail, ALBUM_CACHE_PATH . $pic_thumbnail);
					break;
			}

			@chmod(ALBUM_CACHE_PATH . $pic_thumbnail, 0777);

		} // End IF $gd_errored

	} // End Thumbnail Cache
	else if ($album_config['gd_version'] > 0)
	{
		$pic_thumbnail = '';
	}
Bei mir allerdings sieht es so aus:

1. Fall
User1 betritt Seite, Thumbnail XYZ soll geladen werden,
XYZ Thumbnail ist nicht vorhanden,
Mein Script kann die Größe (Breite/Höhe) des Thumbs nicht auslesen,
XYZ wird dann erstmalig erstellt und angezeigt.

2. Fall
User2 betritt Seite, Thumbnail XYZ soll wieder geladen werden,
XYZ Thumbnail ist mittlerweile vorhanden,
Mein Script liest die Höhe und Breite des Thumbs aus und schreibt die Daten ins IMG Tag und zeigt das Thumbnail korrekt an.


Mhh, weiss jemand OB das Thumb schon erstellt werden sollte wenn ein User ein Bild hochgeladen hat? Wenn ja: WIESO macht er das bei mir nicht, sondern erst wenn das Thumb das erste mal über die Seite versucht wird abzurufen? :(

Hier mal meine aktuelle Lösung zum checken und ansehen:

Verfasst: 18.07.2006 14:45
von yy
Mit meiner Lösung die ich mittlerweile gecoded habe klappt es wunderbar. Mal davon abgesehen, dass er eben beim ersten abrufen des Thumbs (wenn das Thumb noch nicht erstellt wurde) eben keine Höhe und Breite auslesen kann und ich die Variable auf "null" setzen muss.
Schöner wäre natürlich, wenn das Thumb jedes mal sofort erstellt werden würde, BEVOR es jemand abfragt. Denn dann könnte mein Script IMMER die Daten des Bildes auslesen und das Thumb korrekt anzeigen lassen.
Aber so wie ich es jetzt gelöst habe ich es in Ordnung und funktioniert.

Für alle die wissen wollen wie ich es gemacht habe oder mir vielleicht erzählen wollen das und wo ich Fehler drinnen habe bzw. wie man es besser machen könnte, hier nochmal der neue und funktionierende "Hack":

page_header.php:

Code: Alles auswählen

$Display = 'Recent';
$CategoryID = 0;
if ($Display == 'Recent') 
{ 
      $sql = "SELECT p.pic_id, p.pic_title, p.pic_username, p.pic_user_id, p.pic_time, p.pic_desc, p.pic_lock, p.pic_approval, u.username, p.pic_thumbnail as picthumbnail 
         FROM ". ALBUM_TABLE ." AS p 
         LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id 
         WHERE  pic_approval = 1 AND pic_lock = 0 AND pic_cat_id = $CategoryID
         ORDER BY pic_time DESC 
         LIMIT 0,1"; 
   }
if (!$result = $db->sql_query($sql)) 
{ 
   message_die(GENERAL_ERROR, 'Could not query album information', '', __LINE__, __FILE__, $sql); 
} 
$picrow = $db->sql_fetchrow($result); 
$pic_poster = '<a href="'. append_sid("profile.$phpEx?mode=viewprofile&". POST_USERS_URL .'='. $picrow['pic_user_id']) .'">'. $picrow['pic_username'] .'</a>'; 
$pic_thumbnail = ALBUM_UPLOAD_PATH .'cache/'. $picrow['picthumbnail'];
if (file_exists($pic_thumbnail)) 
    {
   $pic_dimension = getimagesize(ALBUM_UPLOAD_PATH .'cache/'. $picrow['picthumbnail']);
   $pic_thumb = $pic_dimension[3];
    }
else
    {
    $pic_thumb = ' ';
    }

$template->assign_vars(array( 
'PIC_IMAGE' => append_sid('album_thumbnail.'. $phpEx . '?pic_id=' . $picrow['pic_id']),
'PIC_DESCR' => $picrow['pic_desc'],
'PIC_THUMB' => $pic_thumb,
'U_PIC_LINK' => append_sid('album_comment.' . $phpEx . '?pic_id=' . $picrow['pic_id']),
);
Die Ausgabe bzw. Anzeige des Thumbs erfolgt dann mit:

Code: Alles auswählen

<a href="{U_PIC_LINK}"><img {PIC_THUMB} src="{PIC_IMAGE}" border="0" alt="{PIC_DESCR}"></a>
... wobei {PIC_THUMB} die von mir gewünschte Änderung bewirkt.
Nämlich dass die Größe (breite/höhe) des Thumbs mit angegeben wird, damit das Layout nicht auseinandergeht. Ist das Thumb noch nicht erstellt bzw. vorhanden wird {PIC_THUMB} zum Leerzeichen.

--------


So funktioniert es momentan einwandfrei, ich weiss allerdings nicht ob es eine bessere Lösung gäbe und ob es sauber gecoded ist.

Verfasst: 18.07.2006 15:05
von Max
Hallo,


also ich bin ja nicht der Proficoder, aber ich meine:

Du solltest mal aus Deinem Code das hier:

Code: Alles auswählen

if (file_exists($pic_thumbnail))
    {
   $pic_dimension = getimagesize(ALBUM_UPLOAD_PATH .'cache/'. $picrow['picthumbnail']);
   $pic_thumb = $pic_dimension[3];
    }
else
    {
    $pic_thumb = ' ';
    }

Mit dem verlinkten Code vergleichen und da dann insbesondere dieser Abschnitt:

Code: Alles auswählen

if( ($album_config['thumbnail_cache'] == 1) && ($picrow[$j]['pic_thumbnail'] != '') && file_exists(ALBUM_CACHE_PATH . $picrow[$j]['pic_thumbnail']) )
 {
 $picture_thumb = $picrow[$j]['pic_thumbnail'];
 $pic_thumb = "album_mod/upload/cache/$picture_thumb";
 }
 else
    {
       $pic_thumb = append_sid(album_append_uid("album_thumbnail.$phpEx?pic_id=". $picrow[$j]['pic_id']));
   } 
Hier wird ja auch geprüft, ob das Thumbnail da ist und wenn nicht, dann ab zu album_thumbnail.php und erzeuge das schleunigst.

Das auf Deine Bedürfnisse angepasst, müsste dann doch eigentlich den Zweck erfüllen.



Gruß Max

Verfasst: 18.07.2006 18:02
von yy
Hallo Max!

Ich werde es mal ausprobieren, auch wenn meine Lösung ganz gut funktioniert.

Danke für die Hilfe!