2011-02-04 19 views
6

を使用してPNGのサイズを変更する際の透明性を維持する方法:これは私が使用しているコードで、Perlと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"); 

出力画像は、黒の背景を持っており、すべてのアルファチャネルが失われます。この画像を用い

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

これは結果である:など私は(アルファのすべての組み合わせを試しhttp://i54.tinypic.com/15nuotf.png

)とtransparancy()のもの、それらのどれも働いていない....

この問題で私を助けてください。

+0

の可能複製[はPNG画像の透明性がPHPのGDlibがimagecopyresampled使用しているときに保存することができますか?](http://stackoverflow.com/questions/32243/can-png-image-transparency-be -preserved-when-using-phps-gdlib-imagecopyresampled) – daxim

答えて

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'); 
関連する問題