kostenloser Webspace werbefrei: lima-city


image resize Thumbnail (von gif) und transparentez

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    sportinfo

    sportinfo hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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
  4. Autor dieses Themas

    sportinfo

    sportinfo hat kostenlosen Webspace.

    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)


  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    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?
  6. Autor dieses Themas

    sportinfo

    sportinfo hat kostenlosen Webspace.

    ja, das ist es im Grunde schon

    $out= imagepng($new_image,$dst);
    und dann
    return $out;

    und den Teil
    switch($type) { ... }
    werde ich auch noch ändern,
    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



  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!