[PHP]こんな画像処理は可能ですか?


1.写真をモノクロに:できた
2.コントラストを上げる:未だ
3.不要な線と影をツブす:未だ
4.白黒を白赤に変える:未だ

2と3の意図するところは写真の細かい線を消してイラストっぽく仕上げたいということです。

欲しいイメージ的にはhttp://www.gac.jp/article/index.php?stats=question&category=5&id=13793&command=msg
これに近いです。

いいアイディアありましたらよろしくお願いします。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:
  • 終了:2006/06/28 22:36:53
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:bonlife No.1

回答回数421ベストアンサー獲得回数75

ポイント50pt

PHP5限定になりますが、imagefilter関数を使えばそこそこのことは出来ると思います。

sample.jpgをそれっぽく変更する簡単なソースを書いてみました。

(あまりイラストっぽくならないのですが、雰囲気は近づくと思います。)

今回はinputとoutputのファイルを全て変え、それぞれの段階での画像を後で確認できるようにしております。

(実際にはoutputは1つにしてしまって問題ありません。)

元の画像の明るさなども大きく影響しますので、引数として与える値は適宜変更してください。

<?php
// 輝度変更 (明るくします)
$im = imagecreatefromjpeg('sample.jpg');
if ($im &amp;&amp; imagefilter($im, IMG_FILTER_BRIGHTNESS,50)) {
	print "輝度変更完了<br />";
	imagepng($im, '01_sample_brightened.png');
} else {
	print '輝度変更失敗<br />';
}
imagedestroy($im);
// ぼかし処理 (不要?)
$im = imagecreatefrompng('01_sample_brightened.png');
if ($im &amp;&amp; imagefilter($im, IMG_FILTER_SELECTIVE_BLUR)) {
	print "ぼかし処理完了<br />";
	imagepng($im, '02_sample_blur.png');
} else {
	print "ぼかし処理失敗<br />";
}
imagedestroy($im);
// コントラスト変更 (ハイコントラストにします)
$im = imagecreatefrompng('02_sample_blur.png');
if ($im &amp;&amp; imagefilter($im, IMG_FILTER_CONTRAST,-200)) {
	print "コントラスト変更完了<br />";
	imagepng($im, '03_sample_high_contrast.png');
} else {
	print "コントラスト変更失敗<br />";
}
imagedestroy($im);
// グレースケール変更 (グレースケールに変換します)
$im = imagecreatefrompng('03_sample_high_contrast.png');
if ($im &amp;&amp; imagefilter($im, IMG_FILTER_GRAYSCALE)) {
	print "グレースケール変換完了<br />";
	imagepng($im, '04_sample_grayscale.png');
} else {
	print "グレースケール変換失敗<br />";
}
imagedestroy($im);
// 色変更 (赤くします)
$im = imagecreatefrompng('04_sample_grayscale.png');
if ($im &amp;&amp; imagefilter($im, IMG_FILTER_COLORIZE,255,0,0)) {
	print '赤変換完了<br />';
	imagepng($im, '05_sample_red.png');
} else {
	print "赤変換失敗<br />";
}
imagedestroy($im);
?>

尚、上記のソースでは1つ目の変換が失敗しても後続の処理が行われてしまいます。

(ソースの見易さを重視し、if文などを省略いたしました。)

if文をネストし、1回目の変換が成功したら次の処理、その変換が成功したら次の処理…とすれば良いと思います。

もっと良い方法があるような気がしますが、少しでも参考になれば幸いです。

id:catfrog

これはすごい!ありがとうございます。

というかPHP4で同じようなことができるクラスのようなものがあったりしますかね?

PHP5だと今使ってるレンタルサーバじゃ無理なのでmacminiをサーバーにしてやるかなあ。。

2006/06/28 12:15:36

その他の回答1件)

id:bonlife No.1

回答回数421ベストアンサー獲得回数75ここでベストアンサー

ポイント50pt

PHP5限定になりますが、imagefilter関数を使えばそこそこのことは出来ると思います。

sample.jpgをそれっぽく変更する簡単なソースを書いてみました。

(あまりイラストっぽくならないのですが、雰囲気は近づくと思います。)

今回はinputとoutputのファイルを全て変え、それぞれの段階での画像を後で確認できるようにしております。

(実際にはoutputは1つにしてしまって問題ありません。)

元の画像の明るさなども大きく影響しますので、引数として与える値は適宜変更してください。

<?php
// 輝度変更 (明るくします)
$im = imagecreatefromjpeg('sample.jpg');
if ($im &amp;&amp; imagefilter($im, IMG_FILTER_BRIGHTNESS,50)) {
	print "輝度変更完了<br />";
	imagepng($im, '01_sample_brightened.png');
} else {
	print '輝度変更失敗<br />';
}
imagedestroy($im);
// ぼかし処理 (不要?)
$im = imagecreatefrompng('01_sample_brightened.png');
if ($im &amp;&amp; imagefilter($im, IMG_FILTER_SELECTIVE_BLUR)) {
	print "ぼかし処理完了<br />";
	imagepng($im, '02_sample_blur.png');
} else {
	print "ぼかし処理失敗<br />";
}
imagedestroy($im);
// コントラスト変更 (ハイコントラストにします)
$im = imagecreatefrompng('02_sample_blur.png');
if ($im &amp;&amp; imagefilter($im, IMG_FILTER_CONTRAST,-200)) {
	print "コントラスト変更完了<br />";
	imagepng($im, '03_sample_high_contrast.png');
} else {
	print "コントラスト変更失敗<br />";
}
imagedestroy($im);
// グレースケール変更 (グレースケールに変換します)
$im = imagecreatefrompng('03_sample_high_contrast.png');
if ($im &amp;&amp; imagefilter($im, IMG_FILTER_GRAYSCALE)) {
	print "グレースケール変換完了<br />";
	imagepng($im, '04_sample_grayscale.png');
} else {
	print "グレースケール変換失敗<br />";
}
imagedestroy($im);
// 色変更 (赤くします)
$im = imagecreatefrompng('04_sample_grayscale.png');
if ($im &amp;&amp; imagefilter($im, IMG_FILTER_COLORIZE,255,0,0)) {
	print '赤変換完了<br />';
	imagepng($im, '05_sample_red.png');
} else {
	print "赤変換失敗<br />";
}
imagedestroy($im);
?>

尚、上記のソースでは1つ目の変換が失敗しても後続の処理が行われてしまいます。

(ソースの見易さを重視し、if文などを省略いたしました。)

if文をネストし、1回目の変換が成功したら次の処理、その変換が成功したら次の処理…とすれば良いと思います。

もっと良い方法があるような気がしますが、少しでも参考になれば幸いです。

id:catfrog

これはすごい!ありがとうございます。

というかPHP4で同じようなことができるクラスのようなものがあったりしますかね?

PHP5だと今使ってるレンタルサーバじゃ無理なのでmacminiをサーバーにしてやるかなあ。。

2006/06/28 12:15:36
id:typista No.2

回答回数359ベストアンサー獲得回数7

ポイント20pt

PHP5のGDなら、imagefilter() を使って、簡単にできそうです。

※使ったことはないので、保証の限りではないのですが・・・

http://cherry.makizou.com/phpdoc/function.imagefilter.html

1→IMG_FILTER_GRAYSCALE: 画像をグレースケールに変換します。

2→IMG_FILTER_CONTRAST: 画像のコントラストを 変更します。コントラストのレベルを arg1 で設定します。

3→IMG_FILTER_MEAN_REMOVAL: 平均を除去し、 「スケッチ風の」効果を得ます。

4→IMG_FILTER_COLORIZE: IMG_FILTER_GRAYSCALE と似ていますが、 色を指定することが可能です。 arg1、arg2 および arg3 を使用して red、blue、 green の値を指定します。 各値の範囲は 0 から 255 までです。

  ※1を実行せずに、まず4をred(arg1)のみでフィルターすれば良いように思えます。

id:catfrog

ありがとうございます。PHP4で同様の効果を得られるクラスのようなものがあったり、、しませんかね?

2006/06/28 12:35:04

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

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

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

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

回答リクエストを送信したユーザーはいません