phpについて質問です。

phpであるpng画像の半透明になっている部分を全て除去する手段はありますか?
もしご存知の方がいましたらご教授いただけると幸いです。
よろしくお願いいたします。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/08/04 16:57:06
  • 終了:2010/08/04 20:05:04

ベストアンサー

id:GoldenDawn No.3

GoldenDawn回答回数426ベストアンサー獲得回数812010/08/04 19:51:15

ポイント73pt

「ピクセルを除去」の意味がよく分からなかったので黒にしてみました。

意図と違ったらすみません。

<?php
header('Content-type: image/png') ;

$img = ImageCreateFromPng('image.png');

for ($y = 0; $y < imagesy($img); ++$y) {
  for ($x = 0; $x < imagesy($img); ++$x) {
    $c = imagecolorat($img, $x, $y) ;
    $a = ($c >> 24) & 0xFF ; // アルファ値
    imagesetpixel($img, $x, $y, $a > 0 ? 0 : $c) ; // アルファ値が 1以上なら黒に
  }
}

imagesavealpha($img, FALSE) ; // アルファ値を破棄
ImagePng($img) ;

ImageDestroy($img) ;
?>
id:n_maco2

ご回答いただきありがとうございました!

ご提示いただいた手法でうまくいきました!

正確にはその黒の値を透過色指定あげる必要がありましたが、なんとかなりました。

本当にありがとうございました!

2010/08/04 20:02:24

その他の回答(3件)

id:yamaneroom No.1

yamaneroom回答回数1040ベストアンサー獲得回数612010/08/04 17:36:10

id:n_maco2

ご回答ありがとうございます。

ImageMagickのマニュアルをざっと読んできたのですが、

私の求めることに使えそうな機能が見当たりませんでした。

大変お手数なのですがどうやればできるのか、もうすこし細かくお教えいただけませんでしょうか。

よろしくお願いいたします。

2010/08/04 17:50:31
id:guja No.2

guja回答回数40ベストアンサー獲得回数82010/08/04 18:48:03

ポイント51pt

↑↑ yamaneroomさん、なんでやり方を聞いているのに単にリンクだけしかしないんですかね。

同じ回答者として憤りを感じます。不確かな知識なら回答しないでほしいです。


関係ない話題ですみませんでした。半透明ということは、

http://www.kuronowish.com/~django/photo/alpha/png_alpha1.html

にある画像のようなアルファチャンネルの除去でよかったでしょうか。


でしたらGDライブラリが必要になってしまいますが、次の方法で除去ができます。

$im = ImageCreateFromPng('input.png');

imagesavealpha($im, FALSE);

ImagePng($im, 'output.png');

ImageDestroy($im);

http://www.php.net/manual/ja/function.imagesavealpha.php

これをすればアルファチャンネルを保存しなくなるので、要件を満たすとは思うのですがどうでしょうか。

id:n_maco2

ご親切にありがとうございます!

が、すみません、言葉不足でした・・・

「アルファ値の除去」

ではなく

「半透明(少しでもアルファ値を持つ)のピクセルを完全に除去する」

という意味でした。

ピクセルを除去なので見えないようになるという想定です。

言葉不足で申し訳ありません。

何か分かることなどあればお教えいただければと思います。

よろしくお願いいたします。

2010/08/04 18:54:09
id:GoldenDawn No.3

GoldenDawn回答回数426ベストアンサー獲得回数812010/08/04 19:51:15ここでベストアンサー

ポイント73pt

「ピクセルを除去」の意味がよく分からなかったので黒にしてみました。

意図と違ったらすみません。

<?php
header('Content-type: image/png') ;

$img = ImageCreateFromPng('image.png');

for ($y = 0; $y < imagesy($img); ++$y) {
  for ($x = 0; $x < imagesy($img); ++$x) {
    $c = imagecolorat($img, $x, $y) ;
    $a = ($c >> 24) & 0xFF ; // アルファ値
    imagesetpixel($img, $x, $y, $a > 0 ? 0 : $c) ; // アルファ値が 1以上なら黒に
  }
}

imagesavealpha($img, FALSE) ; // アルファ値を破棄
ImagePng($img) ;

ImageDestroy($img) ;
?>
id:n_maco2

ご回答いただきありがとうございました!

ご提示いただいた手法でうまくいきました!

正確にはその黒の値を透過色指定あげる必要がありましたが、なんとかなりました。

本当にありがとうございました!

2010/08/04 20:02:24
id:akhs2553 No.4

akhs2553回答回数43ベストアンサー獲得回数02010/08/04 19:53:32

質問者さんがもしある程度英語が読めるのならば、最初の解答者さんのリンク先の,[ImageMagic]のぺージの指示に従っていけばおそらく可能なのではな

いでしょうか.

id:n_maco2

?、リンク先は日本語ですよね?

あとImageMagicのマニュアルも読みましたが、自分の希望の処理を行うためにどういった機能を使って行けばいいのかが理解できませんでした。

多分知識のある方なら何かしら手段はあって気づけたのかもしれないですが・・

なにぶん知識が足りないもので申し訳ありません。

2010/08/04 20:04:03

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません