2011-02-04 12 views
6

Este es el código que estoy usando:Cómo preservar la transparencia al cambiar el tamaño PNG usando Perl y GD

!/usr/bin/perl 
use GD; 
sub resize 
{ 
    my ($inputfile, $width, $height, $outputfile) = @_; 
    my $gdo = GD::Image->new($inputfile); 

    ## Begin resize 

    my $k_h = $height/$gdo->height; 
    my $k_w = $width/$gdo->width; 
    my $k = ($k_h < $k_w ? $k_h : $k_w); 
    $height = int($gdo->height * $k); 
    $width = int($gdo->width * $k); 

    ## The tricky part 

    my $image = GD::Image->new($width, $height, $gdo->trueColor); 
    $image->transparent($gdo->transparent()); 
    $image->copyResampled($gdo, 0, 0, 0, 0, $width, $height, $gdo->width, $gdo->height); 

    ## End resize 

    open(FH, ">".$outputfile);  
    binmode(FH); 
    print FH $image->png(); 
    close(FH); 
} 
resize("test.png", 300, 300, "tested.png"); 

La imagen de salida tiene un fondo negro y todos los canales alfa se pierden.

I'am utilizando esta imagen: http://i54.tinypic.com/33ykhad.png

Este es el resultado: http://i54.tinypic.com/15nuotf.png

He intentado todas las combinaciones de alfa() y la máxima transparencia(), etc cosas, ninguno de ellos trabajó ....

Gracias por ayudarme con este problema.

+0

posible duplicado de [Can imagen PNG transparencia preservarse cuando se utiliza GDlib de PHP imagecopyresampled?] (Http://stackoverflow.com/questions/32243/can-png-image-transparency-be -reservado-cuando-usa-phps-gdlib-imagecopyresampled) – daxim

Respuesta

7

Can PNG image transparency be preserved when using PHP's GDlib imagecopyresampled?

#!/usr/bin/env perl 
use strictures; 
use autodie qw(:all); 
use GD; 

sub resize { 
    my ($inputfile, $width, $height, $outputfile) = @_; 
    GD::Image->trueColor(1); 
    my $gdo = GD::Image->new($inputfile); 

    { 
     my $k_h = $height/$gdo->height; 
     my $k_w = $width/$gdo->width; 
     my $k = ($k_h < $k_w ? $k_h : $k_w); 
     $height = int($gdo->height * $k); 
     $width = int($gdo->width * $k); 
    } 

    my $image = GD::Image->new($width, $height); 
    $image->alphaBlending(0); 
    $image->saveAlpha(1); 
    $image->copyResampled($gdo, 0, 0, 0, 0, $width, $height, $gdo->width, $gdo->height); 

    open my $FH, '>', $outputfile; 
    binmode $FH; 
    print {$FH} $image->png; 
    close $FH; 
} 
resize('test.png', 300, 300, 'tested.png'); 
Cuestiones relacionadas