image resize Thumbnail (von gif) und transparentez
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
aufruf
beibehalten
bild
break
code
ersatz
funktion
http
image
list
manual
mime
original bild
pixel
quelle
switch
teil
transparent bleiben
type
url
-
Hallo
ich habe eine Funktion,
die mir aus einem größeren Image eine kleins Bild davon als .png kopieren soll,
Stichwort: Thumbnail
aber wenn ich eine .gif als Quelle nehme und die auch tranzparente Flächen enthält,
dann werden diese dann im resized .png zu schwarze Farb-Fläche
hier die Funktion(en):
<?php // ---------------------------------------------------------- function resize_image($src, $dst, $dstw, $dsth) { list($width, $height, $type, $attr) = getimagesize($src); // ---- Image $type Flags: ---- 1 = GIF, 2 = JPG, 3 = PNG ---- // ---- http://www.php.net/manual/en/function.exif-imagetype.php // ---- http://www.php.net/manual/en/function.image-type-to-mime-type.php switch($type) { case (1): $im = imagecreatefromgif($src); break; case (2): $im = imagecreatefromjpeg($src); break; case (2): $im = imagecreatefrompng($src); break; default: echo "Error"; exit(); break; } $tim = imagecreatetruecolor($dstw, $dsth); imagecopyresampled($tim, $im, 0, 0, 0, 0, $dstw, $dsth, $width, $height); $tim = ImageTrueColorToPalette2($tim, false, 255); imagepng($tim,$dst); } function ImageTrueColorToPalette2($image, $dither, $ncolors) { $width = imagesx( $image ); $height = imagesy( $image ); $colors_handle = ImageCreateTrueColor( $width, $height ); ImageCopyMerge( $colors_handle, $image, 0, 0, 0, 0, $width, $height, 100 ); ImageTrueColorToPalette( $image, $dither, $ncolors ); ImageColorMatch( $colors_handle, $image ); ImageDestroy($colors_handle); return $image; } // ---------------------------------------------------------- ?>
Beispiel Aufruf dann so (vereinfacht)
$isrc = 'testimg1.gif'; // ---- Original-Bild / Quelle $type = '.gif'; // ---- Image-Type von Original-Bild $dstw = 120; // ---- Thumbnail width in Pixel $dsth = 120; // ---- Thumbnail height in Pixel $idst = basename($isrc, $type); // --- ergibt: testimg1 ohne .gif $idst .= 'thumb_'.$idst.'.png'; // --- prefix und filetype des Thumbnail if (!file_exists($idst)) { $new_image = resize_image($isrc, $idst, $dstw, $dsth); } // ---- Test / Debug Ausgabe ---- echo "<br /> \n"; echo "<br /> Original: \n"; echo "<br /><img src=\"".$isrc."\" border=\"0\" />\n"; echo "<br /> \n"; echo "<br /> Thumbnail: \n"; echo "<br /><img src=\"".$idst."\" border=\"0\" />\n"; echo "<br /> \n";
erzeugt wird somit die neue Datei$idst = 'thumb_testimg1.png';
Fragen:
a) kann ich die Transparenz irgendwie beibehalten,
damit die transparenten Bereiche aus .gif auch in der .png transparent bleiben ?
b) oder [wenn a) nicht geht] wo muss ich die Werte ändern,
wenn ich eine andere Farbe als Ersatz für die transparenten Flächen haben will,
also z.B., weiß (255, 255, 255) anstatt schwarz (0,0,0) ... aber wo im Code anpassen ?
c) oder kennt jemand eine andere (bessere) image-Resize Funktion,
um Thumbnail zu erstellen, in der transparente Bereiche auch transparent bleiben ?
Beitrag zuletzt geändert: 18.9.2012 11:34:43 von sportinfo -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
http://php.net/manual/de/function.imagecolortransparent.php
evt auch http://de2.php.net/manual/en/function.imagesavealpha.php
oderhttp://de2.php.net/manual/en/function.imagesavealpha.php
sonst würd ich das ca so machen
$Transparent = imagecolortransparent($img); $nimg = imagecreate($width, $height); imagepalettecopy($nimg, $img); imagefill($nimg, 0, 0, $Transparent); imagecolortransparent($nimg, $Transparent); imagecopyresized($nimg, $img, 0, 0, 0, 0, $width, $height, $xwert, $ywert);
Beitrag zuletzt geändert: 18.9.2012 13:20:26 von dishonored -
jetzt habe ich die Funktion hinbekommen, das es funktioniert,
<?php // ---------------------------------------------------------- function resize_image($src, $dst, $new_width, $new_height) { list($old_width, $old_height, $type, $attr) = getimagesize($src); switch($type) { case (1): $image_source = imagecreatefromgif($src); break; case (2): $image_source = imagecreatefromjpeg($src); break; case (3): $image_source = imagecreatefrompng($src); break; default: echo "Error"; exit(); break; } $Transparent = imagecolortransparent($image_source); $new_image = imagecreate($new_width, $new_height); imagepalettecopy($new_image, $image_source); imagefill($new_image, 0, 0, $Transparent); if ($Transparent >= 0) { $tColor = imagecolorsforindex($image_source, $Transparent); imagecolortransparent($new_image, $Transparent); } else { $tColor = array('red' => 255, 'green' => 255, 'blue' => 255); imagecolorallocate($new_image, $tColor['red'], $tColor['green'], $tColor['blue']); } imagecopyresampled($new_image, $image_source, 0, 0, 0, 0, $new_width, $new_height, $old_width, $old_height); imagepng($new_image,$dst); imagedestroy($image_source); imagedestroy($new_image); } // ---------------------------------------------------------- ?>
jetzt brauche ich noch eine Rückgabe (return)
die mir sagt, ob das neue Bild erfolgreich erstellt und gespeichert wurde (true / false)
-
Die Funktion imagepng gibt dir doch true bei Erfolg und sonst false zurück, und das kannst du dann per return weitergeben... oder was meinst du sonst?
-
ja, das ist es im Grunde schon
$out= imagepng($new_image,$dst);
und dann
return $out;
und den Teil
werde ich auch noch ändern,switch($type) { ... }
also den case default, wenn Image-Type (key) nicht in case Liste,
dann anstatt dem echo "Error"; und exit(); ein return für falsches Image.Type von $src
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage