"fakethumbs" ohne GDlib erstellen?

eLorFiN

Erfahrenes Mitglied
Hiho, ihr Forumleser, ich wende mich mit einer kleinen Frage an euch...
Ich habe in mein Forum ein System reingebracht, in dem die User Bilder von sich hochladen können und diese dann mit dem Namen $userID.extension gespeichtert werden, geht ja soweit "mit ohne" GD.(ist auch eine andere Geschichte...)

Nun haben wir aber nicht unbeschränkt Platz für diese Bilder, um genau zu sein, will ich diese auf 150x150 pixel beschränken, ich habe dazu folgende Funktion geschrieben, habe aber allerdings das Gefühl dabei, dass ich damit ZIEMLICH auf die Schnauze falle, weil ich eine Eigenschaft des Internet Explorers ausnutze, die ich in Netscape vor v6 vermisst habe.
Diese Eigenschaft ist, dass Bilder mit dem <img>-Tag eingebunden werden können ohne,dass man ihre Größe anzugeben braucht.Wenn man jedoch eine Größe angibt, wird das Bild auf diese skaliert, wenn es die Originalgröße ist, dann wird es halt auf 100% skaliert...

Hier jedenfalls der Code, der die Bilder der User ausliest.

PHP:
function zeige_pic($user_id)
{

$datei[1] = "upics/" . $user_id . ".gif";
$datei[2] = "upics/" . $user_id . ".jpeg";
$datei[3] = "upics/" . $user_id . ".png";

/*
System:
erst wird überprüft welceh extension die datei hat, da es nur 3 möglichkeiten gibt,
testen wir, ob eine datei mit der endung .gif,.jpeg oder .png existiert.
Im erfolgsfall wird ein HTML-tag generiert, welches das Bild in seiner ORIGINALGRÖßE
einbindet, falls diese 150x150px überschreitet, wird das tag überschrieben, mit einem tag, in dem
die werte 150x150 als Fläche angegeben werden,was den Browser(zumindest IE) dazu veranlasst,
das Bild zu skalieren.
*/

if(file_exists($datei[1]))
{
 $iname = $datei[1];
 $tag_create = "<img src=" . $iname . " alt='user picture'>";
 $size = getimagesize($iname);
 if(($size[0] > 150) OR ($size[1] > 150))
 {
  $tag_create = "<img src=" . $iname . " alt='user picture' width=150 height=150>";
 }
}
elseif(file_exists($datei[2]))
{
 $iname = $datei[2];
 $tag_create = "<img src=" . $iname . " alt='user picture'>";
 $size = getimagesize($iname);
 if(($size[0] > 150) OR ($size[1] > 150))
 {
  $tag_create = "<img src=" . $iname . " alt='user picture' width=150 height=150>";
 }
}
elseif(file_exists($datei[3]))
{
 $iname = $datei[3];
 $tag_create = "<img src=" . $iname . " alt='user picture'>";
 $size = getimagesize($iname);
 if(($size[0] > 150) OR ($size[1] > 150))
 {
  $tag_create = "<img src=" . $iname . " alt='user picture' width=150 height=150>";
 }
}
else
{
 $iname = "nopic.gif";
 $tag_create = "<img src=" . $iname . " alt='user picture'>";
}

return $tag_create;
}

Was ich mir von euch erhoffe, sind besser Vorschläge, wie ich das ganze ohne GDlib realisieren kann, da ich eine recht neue GD version auf dem Server habe, die einige Funktionen, wie imagegif lt. SelfPHP aus Lizenzgründen nicht mehr unterstützt werden.

Ach ja...die Lösung sollte etwa genauso einfach sein, ich baue ein Forum, kein Betriebssystem ;)


Danke im Voraus und GRÜÜÜÜÜÜÜÜÜÜßE :D
 
Du schreibst, dass du das ganze deshalb machst, da du nicht "unendlich Platz für die Bilder" hast. Ein skalieren über den <img> Tag ändert jedoch weder etwas an der Größe, die das Bild auf dem Space einnimmt, noch an dem Traffic, den das aufrufen des Bildes verursacht.

Beispiel:
Du hast ein Bild, welches die Ausmaße 1600x1200 hat und 750kb groß ist. Wenn du dieses Bild nun mittels der width und height Attribute nur als 160x120 ausgibst, werden trotzdem die vollen 750kb an den Client übertragen und das skalieren läuft Clientseitig ab.

Ergo bringt deine Idee dir zu deinem Speicherplatz Problem rein gar nichts und wenn ich dein Problem richtig verstanden habe, kommst du um die Nutzung der GD-Lib nicht herum. Ausserdem glaube ich nicht, dass auch neuere Versionen der GD-Lib irgendwelche essentiellen Funktionen nicht mehr unterstützen. Einfach mal ausprobieren.
 
Um genau zu sein muss er um das zu machen sogar die GD lib benutzen egal was er machen will!
Mit Javascript lässt sich die grösse eines Bildes nur dann ermitteln wenn sie auch im IMG tag mit angegeben ist!

aber da eigentlich JEDER provider die GLIB hatt wird es kein problem sein das umzusetzen!
deswegen gibt es die Funktion
Image_Copy_Resize();
 
@1 yup,darum gehts mir gar nicht, soll sich der cleint doch meinetwegen 1900mb an bildern laden, der webspace is unbegrenzt(also zumindest in gescheiten dimensionen...)
Was ich meinte, war die Fläche des anzuzeigenden bildes :D

zu 2
Danke für den tipp aber die manual hab ich auch soweit schon durchgeforstet und selfphp ist da auch sehr hilfreich.
Imagecopyresize sah zu Anfang auch sehr attraktiv aus nur habe ich hier ein recht VERWIRRENDES Beispiel zu dem Thema gefunden http://www.tutorials.de/forum/showthread.php?s=&threadid=7940&highlight=thumbs+erstellen
hier :)

da wurde auch unter anderem die Funktion ImageJpeg und ImageGif(weiterführend) verwendet, und eben diese Funktionen stehen mir nicht zur Verfügung.

Da fällt mir ein, ich habe die Upload-Bildgröße sowieso auf 200kb beschränkt also ist das ganz und gar nicht meine Sorge ;)
danke fpr die Mühe soweit trotzdem :)
 
In welcher verkappten Version der GD-Lib gibt es denn kein imagejpeg() und imagegif() ? Da kann man ja nur noch halb soviel damit machen ...
 
beleuchte mal 1.6 und höher, das sagt zumindest selfphp.
Ich weiß nicht, welche Version mein Provider nutzt(ist mir letzendlich egal), nur weiß ich,dass ich einen
"Fatal error: Call to undefined function imagecreatefomgif()" (oder so) bekomme.
Das Selbe gilt auch für Imagegif, viele dieser Optionen funktionieren nicht mehr.

Die JPEG version des Algorythmus mit imagecopyresized gibt auch SCHREKLICH verfälschte Bilder zurück, von daher ist mir die Skalierung gerade recht, weil ich wirklich nur auf die Fläche schaue.

[edit 1]
textformatierung und typos
 
Das du bei ImageGif einen Fehler bekommst ist klar!
Diese Funktion mussten Sie leider wegen Copyright aus der GLib rausnehmen
allerdings kannst du dennoch auf ImageCreatFromGif zugreifen!
Nur das erstellen eines Gifs ist nicht mehr verfügbar!
Was dein Problem angeht so würde ich dir zu ImagePng empfehlen
Die Dateien sind zwar insgesammt etwas grösser aber dafür ist die Qualität der bilder excelent! :)
 
Ach, und PNG geht, subbi *freu*, danke, ich werde darauf zurückgreifen, wenn ich bugs hierbei erlebe, ich habe den Algorythmus jetzt etwas aufpoliert, sodass das größere Attribut auf 150 gesetzt wird und das kleinere proportional mitskaliert wird, scheint recht lustig zu funktionieren, ich HOFFE,dass man sowas auf die Öffenltichkeit loslassen kann, ohne, von alten Netscapern Ärger zu bekommen:

PHP:
function zeige_pic($user_id)
{

$datei[1] = "upics/" . $user_id . ".gif";
$datei[2] = "upics/" . $user_id . ".jpeg";
$datei[3] = "upics/" . $user_id . ".png";

/*
System:
erst wird überprüft welceh extension die datei hat, da es nur 3 möglichkeiten gibt,
testen wir, ob eine datei mit der endung .gif,.jpeg oder .png existiert.
Im erfolgsfall wird ein HTML-tag generiert, welches das Bild in seiner ORIGINALGRÖßE
einbindet, falls diese 150x150px überschreitet, wird das tag überschrieben, mit einem tag, in dem
die werte 150x150 als Fläche angegeben werden,was den Browser(zumindest IE) dazu veranlasst,
das Bild zu skalieren.
*/

if(file_exists($datei[1]))
{
 $iname = $datei[1];
 $tag_create = "<img src=" . $iname . " alt='user picture'>";
 $size = getimagesize($iname);
 $b = $size[0]; $h = $size[1];
 if(($size[0] > 150) OR ($size[1] > 150))
 {
  if($b > $h)
  { 
   $hn = $h/$b * 150;
   $tag_create = "<img src=" . $iname . " alt='user picture' width=150 height=$hn>";
  }
  elseif($h > $b)
  {
   $bn = $b/$h * 150;
   $tag_create = "<img src=" . $iname . " alt='user picture' width=$bn height=150>";
  }
  else { $tag_create = "<img src=" . $iname . " alt='user picture' width=150 height=150>"; }
 }
}
elseif(file_exists($datei[2]))
{
 $iname = $datei[2];
 $tag_create = "<img src=" . $iname . " alt='user picture'>";
 $size = getimagesize($iname);
 $b = $size[0]; $h = $size[1];
 if(($size[0] > 150) OR ($size[1] > 150))
 {
  if($b > $h)
  { 
   $hn = $h/$b * 150;
   $tag_create = "<img src=" . $iname . " alt='user picture' width=150 height=$hn>";
  }
  elseif($h > $b)
  {
   $bn = $b/$h * 150;
   $tag_create = "<img src=" . $iname . " alt='user picture' width=$bn height=150>";
  }
  else { $tag_create = "<img src=" . $iname . " alt='user picture' width=150 height=150>"; }
 }
}
elseif(file_exists($datei[3]))
{
 $iname = $datei[3];
 $tag_create = "<img src=" . $iname . " alt='user picture'>";
 $size = getimagesize($iname);
 $b = $size[0]; $h = $size[1];
 if(($size[0] > 150) OR ($size[1] > 150))
 {
  if($b > $h)
  { 
   $hn = $h/$b * 150;
   $tag_create = "<img src=" . $iname . " alt='user picture' width=150 height=$hn>";
  }
  elseif($h > $b)
  {
   $bn = $b/$h * 150;
   $tag_create = "<img src=" . $iname . " alt='user picture' width=$bn height=150>";
  }
  else { $tag_create = "<img src=" . $iname . " alt='user picture' width=150 height=150>"; }
 }
}
else
{
 $iname = "nopic.gif";
 $tag_create = "<img src=" . $iname . " alt='user picture'>";
}

return $tag_create;
}
h steht für Höhe, b für Breite
und das hn und bn sind jeweils die angepassten Werte, fast schon tutorialreif *grins*, danke für eure Bemühungen trotzdem, ich werde wahrscheinlich doch darauf zurückkommen ;) früher oder später....
 
Zurück