GD.pmでアルファチャンネルを持ったPNG合成がうまくいかない

このQ&Aのポイント
  • GD.pm 2.32 + Perlを使用して、アルファチャンネルを持ったPNG合成を試みていますが、うまくいきません。
  • アルファチャンネルの部分がスムーズに合成されず、透明ではないドットのように合成されます。
  • 合成したいPNGイメージには、赤い四角の画像と白い丸の画像(境界線はアルファチャンネルを持つ)が含まれています。
回答を見る
  • ベストアンサー

GD.pmでアルファチャンネルを持ったPNG合成がうまくいきません

GD.pm 2.32 + Perlで、二つのPNG画像合成を試みています。 しかしpngのアルファチャンネル部分がスムーズに合成できません。 以下のソースで合成はできたものの、アルファチャンネル部分が透明ではない通常のドットとして合成されます。 1.png・・・赤い四角い画像 2.png・・・白い丸画像で、境界線はアルファチャンネル(PNG32) -----ここから $png_image = "1.png"; $png_image2 = "2.png"; $image = new GD::Image(100,100); $image2 = newFromPng GD::Image($png_image); ($image2_width,$image2_height) = $image2->getBounds() ; $image->copy($image2,0,0,0,0,$image2_width,$image2_height); $image3 = newFromPng GD::Image($png_image2); ($image3_width,$image3_height) = $image3->getBounds() ; $image->copy($image3,0,0,0,0,$image3_width,$image3_height); $image = &image_tranparent_comp($png_image, 1, 1, $image); print "Content-type:image/png\n\n"; binmode STDOUT; print $image->png; -----ここまで 文字数の関係で「&image_tranparent_comp」を省略しています。 Googleで検索すれば、参考にしたサイトが出てきます。 原因がお分かりでしたら教えてください。 よろしくお願いいたします。

  • abiru
  • お礼率67% (37/55)
  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#43437
noname#43437
回答No.1

$image = new GD::Image(100,100);      ↓ $image = new GD::Image(100,100,1); こうしないと、8ビットイメージになってしまいます。 8ビットイメージ上では、アルファブレンドなどがきちんと行われません。

abiru
質問者

お礼

なるほど! ありがとうございました。m(_ _)m

関連するQ&A

  • GD.pmで作成した画像を保存する方法

    GD.pm 2.32 + Perlで、作った画像の保存を試みています。 しかし保存されません。 $png_data = $myImage->png; open (DISPLAY,"test.png") || die; binmode DISPLAY; print DISPLAY $png_data; close DISPLAY; フォルダのパーミッションは777 test.pngのパーミッションは666 原因は分かりますでしょうか。 宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • PHP GD 画像が縮小できない

    宜しくお願いします。 ※ローカル環境です。 (WinXP PHP5 Smarty PEAR MySQL ※GDはインストされています。) 下記のコードで、サーバーにもともと上げてある画像(jpeg)を縮小して、 それをブラウザに表示させようと思います。 ですが、縮小されずに、元の画像サイズのまま表示されてしまいます。 おかしな点をご指摘下さいませ。 また、(1)で、 jpegファイルを取り込むコードがありますが、これは、 もし画像がGIFであったりPNGの場合を顧慮するなら、 取り込む際にそれぞれを判定するのが基本でしょうか? もし、今回のようにサバー元の画像をリサイズするのであれば、拡張子もわかっていますので、 jpegファイルだけのことを考えればいいですが、 たとえば、任意のアップロードされたファイルを扱う場合は、上記3種類を判定すして処理すべきですよね? 以上、2点を回答下さいませ。 // -- (1) // 画像を読み込む。 $file_path = "http://www元画像.com/img/aa.jpg"; $image = ImageCreateFromJPEG($file_path); //JPEGファイルを読み込む /*********** $image = ImageCreateFromGIF($file_path); //GIFファイルを読み込む $image = ImageCreateFromPNG($file_path); //PNGファイルを読み込む ************/ // -- (2) // 画像のサイズを取得。 $width = ImageSX($image); //横幅(ピクセル) $height = ImageSY($image); //縦幅(ピクセル) // -- (3) // 縮小した画像のサイズを決める。 $new_width = 100; $rate = $new_width/$width; //圧縮比 $new_height = $rate*$height; // -- (4) // 空の画像を作成する。 $new_image = ImageCreateTrueColor($new_width, $new_height); // -- (5) // サンプリングしなおす  ImageCopyResampled($new_image,$image,0,0,0,0,$new_width,$new_height,$width,$height); // -- (6) // ブラウザに出力する場合。 ImageJPEG($image); //ImageJPEG($image,'simpletext.jpg'); //ImageGIF($image); //環境によっては使えない //ImagePNG($image); // -- (7) // メモリを解放する。 imagedestroy ($new_image); imagedestroy ($image);

    • ベストアンサー
    • PHP
  • GDでPNG画像の合成を試みているのですが、imagedestroyを

    GDでPNG画像の合成を試みているのですが、imagedestroyを使用しても画像がメモリから解放されていないのか 一度表示したPNG画像と同じファイル名で表示すると最初に表示した画像内容が表示されてしまいます。 例)最初の表示(表示ファイル名:test_img.png) → 一旦別の画面に遷移する。→同じファイル(test_img.png)の内容を更新→2度目の表示(表示ファイル名:test_img.png)で最初の画像内容で表示されてしまう。 2度目の表示をした際にキーボードのF5(更新)キーを押すと更新されたtest_img.pngが表示されます。 F5(更新)キーを押さずに同じファイル名であっても最新のファイルの内容を表示したいのですが、原因が全く分かりません。 分かる方がいましたら、お知恵を貸して下さい。 ちなみに画像を合成する処理のソースを抜粋して少し手を加えたものが下記のものです。下記のソース(sample.php)を使って次のようなテストを行いました。 最初の処理では下記のソースを実行します。次に下記のソースの $img2 = imagecreatefrompng("http://beauty-program.com/base_hair.png");の行の指定ファイルをtest3.pngに変更して実行します。 表示内容は変わりませんが、F5(更新)キーを押すと表示内容が最新のものとなり変わります。 ※下記のソースを実行して思うのは、単純にF5(更新)キーを押さないと処理が再実行されないのではないかと思いました。 しかし、実際に動かすソースについては、ファイル作成後、画面を遷移して同じファイル名を表示するので、 下記のソースでのテストのようにF5(更新)キーを押さなければ最新のファイル内容で再実行されないとは考えにくいです。 実際に動かすソースは、次のような順番で画像の合成や表示をしますが、更新したファイル内容で画面に表示するには、F5(更新)キーを押す必要があります。 (1)下記のような画像の合成処理でファイルを作り、一旦別の画面を経由してから、作成したファイルを画面に表示する。 (2)別の画像を合成して同じファイル名で内容を更新し、一旦別の画面を経由してから、作成したファイルを画面に表示する。 (3)表示するファイル名が同じであると、なぜか最初(上記(1)で表示したもの)の内容が表示される。 (4)F5(更新)キーを押すと表示内容が最新のもの(上記(2)で更新したファイルの内容)となり変わる。 ソース http://beauty-program.com/sample.txt ※ソースを見る場合は、上記リンクをクリックすると実行結果が表示されますが、画像が表示された画面で「右クリック→ソースを表示」でご覧下さい。 ■環境 windows vista xampp/apache 2.2.4 PHP Version 5.2.3

    • ベストアンサー
    • PHP
  • GDモジュールについて

    GDモジュールの中に、「newFromJpegData」がありますが、 使用例: $src_img1 = GD::Image->newFromJpegData($fdata) うまくいきません。何が、おかしいのか、教えてくだされば。 $fdataの中身は、 # if (open(OUT, ">d040805.jpg")) { # binmode($fdata); # print OUT $fdata; # close(OUT); # } とやれば、jpegファイルになります。

  • perlで画像表示

    htmlファイルから<img src="./aa.cgi">と書いて連続した画像を表示させたいのですが @aa =(1,2,3); foreach(@aa){ open(IMG, "./$_.gif"); binmode(IMG); binmode(STDOUT); print "Content-type: image/gif\n\n"; read(IMG, $img, 1024); print $img; close(IMG); } こう書いたらだめなのでしょうか?

    • ベストアンサー
    • Perl
  • GDが使えません・・・

    GDを使って、ためしに画像を作成してみたのですが、下のようなエラーが出てしまいます。 Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\test.php:9) in C:\xampp\htdocs\test.php on line 10 (以下、文字化けしていて読めません) test.phpのソースは <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>テスト</title> </head> <body> <?php header("Content-type: image/png"); $width = 320; $height = 240; $img = imagecreate($width, $height); imagecolorallocate($img, 0, 0, 0); imagepng($img); ?> </body> </html> 以上です。 phpinfo()で確認しましたが、ちゃんと PNG Support = enabled になっています。 どこがいけないのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 普通の html に cgi を使って画像を・・

    ソースお手本表を見ながら質問タイトルのようなことをやりたいと思いました。 結果はHTMLを実行すると通信が1分から3分ぐらい通信を行い、最後には画像を表示しないようなります。 どこがおかしいのかおしえていただけないでしょうか? どうかお願いします。 ------------------------------------------------ #!/usr/local/bin/perl #use DBI; print "Content-type: image/jpeg\n\n"; open FH,"<image.jpg"; binmode FH; binmode STDOUT; print while(FH); close FH; ------------------------------------------------

    • 締切済み
    • CGI
  • [PHP]GDを利用した画像リサイズについて

    [PHP]GDを利用した画像リサイズについて GDを利用した画像リサイズ処理を行うクラスを作ったのですが、 以下のようなエラー(文字化け)が出てしまい画像出力することができません。 有識者の方、どうか知恵をお貸しください。宜しくお願い致します。 ????JFIF??;CREATOR: gd-jpeg v1.0 (using IJG JPEG v70), quality = 75 ??C    $.' ",#(7),01444'9=82<.342??C  2!!22222222222222222222222222222222222222222222222222??II"?? ???}!1AQa"q2???#B??R??$3br? %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz??????????????????????????????????????????????????????????????????????????? ???w!1AQaq"2?B???? #3R?br? -------- 以下省略 ---------- ◆作成したPHPファイル ・test.php <?php require_once 'Image.php'; $path = './400x300.jpg'; $r = new Image($path, 75); $r->resize(75); ?> ・Images.php <?php class Image{ var $new_width; var $path; function Image($path, $new_width){ @header("Content-type: image/jpeg"); $this->path = $path; $this->new_width = $new_width; } function resize(){ global $new_width; global $path; // 画像パス $image = imagecreatefromjpeg($this->path); // 画像のサイズを取得 $width = 150; $height = 150; $rate = $this->new_width / $width; $new_height = $rate * $height; $thumb = imagecreatetruecolor($this->new_width, $new_height); imagecopyresized($thumb, $image, 0, 0, 0, 0, $this->new_width, $new_height, $width, $height); // imagecopyresampled($thumb, $image_path, 0, 0, 0, 0, $this->new_width, $new_height, $width, $height); imagejpeg($thumb, null, 75); imagedestroy($image); } } ?> ◆環境と状況 ・サーバ:WindowsXP(XAMPPを利用してローカル環境を構築) ・phpinfo()にて、GD Support=enabled、JPEG Support=enabledを確認 ・ステップ実行(デバック)にてimagejpeg($thumb, null, 75);まで問題なく実行可能。  ※imagejpeg($thumb, null, 75);実行後上記文字列が出力される。 ・コメントアウト個所のimagecopyresampledでも動作結果は同じ。 ・参考にしたサイト  http://goodjob.boy.jp/chirashinoura/id/79.html 恐れ入りますが、ご回答お願い致します。

    • ベストアンサー
    • PHP
  • libpngでpng操作がうまくいかない

    ■環境 Windows 7 VS2008 以下をみて http://gmoon.jp/png/#whats 下記のソースを書いたのですが 実行時エラーになります。。。 libpngとzlibは リソースに追加しています。 ほかにもlibpng12.dllを追加しています。 ほしい情報は、windows環境でpngを扱う方法です。 #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include "png.h" #define WIDTH (256) #define HEIGHT (128) void write_png(char *file_name, unsigned char **image); int main() { unsigned char **image; // image[HEIGHT][WIDTH]の形式です int i, j; image = (png_bytepp)malloc(HEIGHT * sizeof(png_bytep)); // 以下3行は2次元配列を確保します for (j = 0; j < HEIGHT; j++) image[j] = (png_bytep)malloc(WIDTH * sizeof(png_byte)); for (i = 0; i < WIDTH; i++) { // 以下5行は単純なテストパターンを作ります for (j = 0; j < HEIGHT; j++) { image[j][i] = (unsigned char)i; } } write_png("test.png", image); // PNGファイルを作成します for (j = 0; j < HEIGHT; j++) free(image[j]); // 以下2行は2次元配列を解放します free(image); return 0; } void write_png(char *file_name, unsigned char **image) { FILE *fp; png_structp png_ptr; png_infop info_ptr; fp = fopen(file_name, "wb"); // まずファイルを開きます png_ptr = png_create_write_struct( // png_ptr構造体を確保・初期化します PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); info_ptr = png_create_info_struct(png_ptr); // info_ptr構造体を確保・初期化します png_init_io(png_ptr, fp); // libpngにfpを知らせます png_set_IHDR(png_ptr, info_ptr, WIDTH, HEIGHT, // IHDRチャンク情報を設定します 8, PNG_COLOR_TYPE_GRAY, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); png_write_info(png_ptr, info_ptr); // PNGファイルのヘッダを書き込みます png_write_image(png_ptr, image); // 画像データを書き込みます png_write_end(png_ptr, info_ptr); // 残りの情報を書き込みます png_destroy_write_struct(&png_ptr, &info_ptr); // 2つの構造体のメモリを解放します fclose(fp); // ファイルを閉じます return; }

  • HTMLのファイルにCGI処理結果を表示する

    まずトップページはhtmlで作ります。 そのトップページにいつも変化する所があるのでcgiで処理を施したものをhtmlに貼り付けたいと思っています。 その場合に例えば画像を出力させる場合は <IMG src="cgi-local/top.cgi"> で指定し、 #!/usr/local/bin/perl print "Content-type: image/jpeg\n\n"; open FH,"<../image.jpg"; binmode FH; binmode STDOUT; print while(<FH>); close FH; をやれば動かせますが、これを画像ではなくhtmlを表示させるためには print "Content-type: image/jpeg\n\n"; を print "Content-type: text/html\n\n"; に変更する事により可能だと思いやってみたのですが、うまく出力できませんでした。 cgi処理をうまくhtmlに貼り付ける方法があるのでしょうか。どうか教えて頂けないでしょうか?お願します。(涙)

    • ベストアンサー
    • CGI

専門家に質問してみよう