Willkommen in der Webstatt Zum Webstatt Blog und Stories
fish fish am 10.09.07 12:37

mahlzeit.
ich will thumbnails generieren lassen, doch die ergebnisse sind irgentwie nicht so berauschend.
[img]http://www.beta.bierquartier.de/cls/2/uploads/images/thumbnails/mini/10.09.07_cucks_liquor_store_2.gif[/img]
(die vorlage war kein schwarzes bild und es war auch nicht quadratisch)

laut meiner info-datei kann so spass mit bildern machen.

$thumbnail_mini_width = 20;
$uploaddir_images = "/www/htdocs/w455709b/cls/2/uploads/images/";

das originalbild wird auch richtig eingelesen.
mit echo $bildgroesse[0]." ".$bildgroesse[1]." ".$bildgroesse[2];
kann bekomme ich die reichtigen werte angezeigt.

das vollständige script gibt es hier: http://ubuntuusers.de/paste/14792/

der code sieht so aus:
// Thumbnails generieren
// Bildgrösse und Eigenschafte feststellen
$bildgroesse = getimagesize($uploaddir_images.$row->name);
$bild_breite = $bildgroesse[0];
$bild_hoehe = $bildgroesse[1];

// wenn das Bild zu Klein ist, keine kleinen Thumbnails
// erstellen
// $thumbnail_mini_width aus der Konfigurationsdatei
if($bild_breite > $thumbnail_mini_width){
$thumbnail_mini_breite = $thumbnail_mini_width;
$thumbnail_mini_hoehe = intval($bild_hoehe*$thumbnail_mini_breite/$bild_hoehe);
}

// Wenn das Bild im GIF-Format ist
if($bildgroesse[2] == 1) {
$altes_gif = ImageCreateFromGIF($uploaddir_images.$row->name);

// nur die Bilder erstellen, die auch gebraucht werden
if(!empty($thumbnail_mini_breite)){
ImageCopyResized(ImageCreate($thumbnail_mini_breite ,$thumbnail_mini_breite), $altes_gif, 0, 0, 0, 0, $thumbnail_mini_breite, $thumbnail_mini_hoehe, $bild_breite, $bild_hoehe);
ImageGIF(ImageCreate($thumbnail_mini_breite, $thumbnail_mini_breite), $uploaddir_images."thumbnails/mini/".$row->name);
}
}

woran liegts?

netcup.de Warum gibt es hier Werbung?
nuit nuit am 10.09.07 13:26

wahrscheinlich war es kein gif
und du solltest in zeile 21 und 22 auch mal die höhe einsetzen ;)

fish fish am 10.09.07 13:53

hm also eigentlich war es schon ein gif.
das mit breite und höhe habe ich geändert, aber er produziert trotzdem nur quadrate
das ganze script sieht so aus: http://ubuntuusers.de/paste/14792/ vielleicht habe ich ja was übersehen?

png und jpgs werden übrigens auch schwarz

der_nic der_nic am 10.09.07 17:11

Also wieso da nur Quadrate rauskommen liegt an dem hier
$thumbnail_mini_hoehe = intval($bild_hoehe*$thumbnail_mini_breite/$bild_hoehe);
Wenn $thumbnail_mini_breite die Breite ist dann wird $thumbnail_mini_hoehe gleich gross, weil * $bild_hoehe und danach / $bild_hoehe hebt sich gegenseitig auf;)

fish fish am 11.09.07 10:10

hmm okay.. habs mal ausgebessert... leider bleiben die bilder immer noch schwarz... weiss niemand woran das liegt?

der_nic der_nic am 11.09.07 13:48

oke das Script sieht irgendwie total kaputt aus:D

ich habs mal für dich zum laufen gebracht...

$bildgroesse = getimagesize("abc.gif"); // abc.gif ist die Quelldatei
$bild_breite = $bildgroesse[0]; // Breite des alten Bildes
$bild_hoehe = $bildgroesse[1]; // Hoehe des alten Bildes

$thumbnail_mini_width = 100; // Vorgegebene Breite des neues Bildes


if($bild_breite > $thumbnail_mini_width){
$thumbnail_mini_breite = $thumbnail_mini_width;
$thumbnail_mini_hoehe = intval($thumbnail_mini_breite/$bild_hoehe*$bild_breite); // Hoehe des neuen Bildes berechnen

}


if($bildgroesse[2] == 1) { // Wenn das alte Bild ein GIF ist (liesse sich aber auch anders prüfen zb über MIME
$altes_gif = ImageCreateFromGIF("abc.gif");
$neues_gif = ImageCreate($thumbnail_mini_breite ,$thumbnail_mini_hoehe);
ImageCopyResized($neues_gif, $altes_gif, 0, 0, 0, 0, $thumbnail_mini_breite, $thumbnail_mini_hoehe, $bild_breite, $bild_hoehe);
ImageGIF($neues_gif, "def.gif"); // def.gif ist das neue Bild
}

CIX88 am 13.09.07 19:32

ImageCopyResampled ist besser geeignet als ImageCopyResized.
Wenn man mit JPEG abeiten möchte fliegt man mit ImageCopyResized voll auf die Fresse.

> ich habs mal für dich zum laufen gebracht...

... und dabei doch glatt ImageDestroy() vergessen :)

Bei einfachen Sachen kann mich sich GetImageSize (dauert zu lange) auch sparen, dazu hat die GDlib schon eigene Funktionen wie imagesx bzw. imagesy.
Das Script läuft deshalb zwar auch, aber etwas schneller.

fish fish am 14.09.07 17:36

wofür ist imagedestroy da?
wo finde ich genauere informationen über die bildbearbeitungsfunktionen und deren _geschickten_ einsatz im zusammenspiel (insbesondere für thumbnails)? im handbuch wird ja meist nur die funktion beschrieben.. und die thumbnailtutorials die ich so gefunden haben nutzen irgentwie alle den gleichen code...

der_nic der_nic am 14.09.07 17:42

oke stimmt ImageCopyResampled ist besser, darauf habe ich jetzt gar nicht geachtet... mea culpa

aber imagedestroy ist hier meiner Meinung nach nicht zwingend notwendig, da ja nur 1 Bild geladen wird und der Speicher nach Ausführung des Scripts automatisch wider frei wird.

fish fish am 15.09.07 11:41

okay. danke für euere hilfe.. einiges klappt soweit (die höhenbrechnung muss e ich korriegieren ;-))
folgendes probleme habe ich noch:
durchsichtige gifs werden mit schwarz hinterlegt wenn sie kleiner gemacht werden, kann man das durchsichtig lassen oder wenigstens mit einer anderen farbe hinterlegen?.

<?php
// Funktion: Thumbnail erstellen
// =============================

function thumbnail($bild_pfad, $bild_name, $thumbnail_pfad, $thumbnail_name, $thumbnail_breite) {

// Bildeigenschaften: Breite, Höhe, Typ, Dateigrösse
$bild_groesse = getimagesize($bild_pfad . $bild_name);

// Breite des alten Bildes
$bild_breite = $bild_groesse[0];

// Höhe des alten Bildes
$bild_hoehe = $bild_groesse[1];

// Thumbnail nur erstellen, wenn das Bild grösser als der geplante Thumbnail
if($bild_breite > $thumbnail_breite){

// Thumbnail-Höhe berechnen
$thumbnail_hoehe = intval($bild_hoehe / ($bild_breite / $thumbnail_breite));

// Wenn das Bild ein GIF ist, dann GIF-Thumbnail erstellen
if($bild_groesse[2] == 1) {
$altes_gif = ImageCreateFromGIF($bild_pfad . $bild_name);
$neues_gif = ImageCreate($thumbnail_breite, $thumbnail_hoehe);
ImageCopyResampled($neues_gif, $altes_gif, 0, 0, 0, 0, $thumbnail_breite, $thumbnail_hoehe, $bild_breite, $bild_hoehe);
ImageGIF($neues_gif, $thumbnail_pfad . $thumbnail_name);
}

// Wenn das Bild ein JPG ist, dann JPG-Thumbnail erstellen
if($bild_groesse[2] == 2) {
$altes_jpg = ImageCreateFromJPEG($bild_pfad . $bild_name);
$neues_jpg = imagecreatetruecolor($thumbnail_breite, $thumbnail_hoehe);
ImageCopyResampled($neues_jpg, $altes_jpg, 0, 0, 0, 0, $thumbnail_breite, $thumbnail_hoehe, $bild_breite, $bild_hoehe);
ImageJPEG($neues_jpg, $thumbnail_pfad . $thumbnail_name);
}

// Wenn das Bild ein PNG ist, dann PNG-Thumbnail erstellen
if($bild_groesse[2] == 3) {
$altes_png = ImageCreateFromPNG($bild_pfad . $bild_name);
$neues_png = imagecreatetruecolor($thumbnail_breite, $thumbnail_hoehe);
ImageCopyResampled($neues_png, $altes_png, 0, 0, 0, 0, $thumbnail_breite, $thumbnail_hoehe, $bild_breite, $bild_hoehe);
ImagePNG($neues_png, $thumbnail_pfad . $thumbnail_name);
}
}
}

CIX88 am 16.09.07 12:08

Quote
Original von der_nic
aber imagedestroy ist hier meiner Meinung nach nicht zwingend notwendig, da ja nur 1 Bild geladen wird und der Speicher nach Ausführung des Scripts automatisch wider frei wird.


Naja wenn meherer Zugriffe auf das Script sind, geht es nicht mehr so einfach:
http://www.cix88.de/cix_php/php_grafik/cix_gdlib_speicherverbrauch_einzeln.php

Und wenn weitere Scriptzeilen folgen, kann dies zu Problemen führen.
Wenn man ganz unsauber arbeitet, ist recht schnell das memory_limit am Ende.
Passiert das, wird das Script nicht mehr ausgeführt.

fish fish am 16.09.07 12:19

ist das bei meiner funktion sinnvoll? wenn ja wo?

wie bringe ich imagealphablending und imagesavealpha in meiner funktion unter?

CIX88 am 16.09.07 21:38

Quote
Original von fish
wie bringe ich imagealphablending und imagesavealpha in meiner funktion unter?


Zuwas brauchst du diese Funktionen wenn du NUR Vorschaubilder erzeugen willst ?
Verstehe ich jetzt gar nicht ...

fish fish am 16.09.07 22:30

naja vorschau-gifs und png sollen transparent sein, wenn die originale transparent sind

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt