2

始める前に、私はPHPの初心者であることに注意したいと思います。私がやりたいのは、PNG画像を1色に着色することです。したがって、すべての透明ピクセルは透明のままになり、すべての非透明ピクセルはその色になります。私はこの答えを求めて多くのサイトを検索しましたが、何らかの理由で私が欲しいものを見つけることができません。

これが私が見つけたさまざまな例に基づく私の最初の試みです:

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

$color = $_GET['color'];
$im = imagecreatefrompng($_GET['img']);
$width = imagesx($im);
$height = imagesy($im);
$imn = imagecreatetruecolor($width, $height);
imagealphablending($imn,false);
$col=imagecolorallocatealpha($imn,255,255,255,127);
imagesavealpha($imn,true);
imagefilledrectangle($imn,0,0,$width,$height,$col);
imagealphablending($imn,true);
imagecopy($imn, $im, 0, 0, 0, 0, $width, $height);
imagefilter($imn, IMG_FILTER_GRAYSCALE);


if ($color[0] == '#')
$color = substr($color, 1);

if (strlen($color) == 6)
$r = $color[0].$color[1];
$g = $color[2].$color[3];
$b = $color[4].$color[5];

$r = hexdec($r); 
$g = hexdec($g); 
$b = hexdec($b);

imagefilter($imn, IMG_FILTER_COLORIZE, $r, $g, $b);

imagepng($imn);
imagedestroy($imn);

?>

本質的に私が欲しいものの完璧な例はここで見ることができます。唯一の変更点は、黒ではなく、ユーザーが指定した色に変換することです。 不透明なピクセルを黒に変換します

ありがとうございました

===============================2012年10月17日更新

したがって、xceptionの回答に基づいて、彼のスクリプトを実行するために使用したコードは次のとおりです。

<?php

$source = "test.png";
$temp = "temp.png";
$color = "red";
$final = "FINAL.png";

exec("convert $source -alpha extract -threshold 0 -negate -transparent white $temp");
exec("convert $temp -fill $color -opaque black $final");
?>

動作しましたが、小さな問題があります。以下のスクリーンショットに示されているように、ギザギザのエッジがあります。スクリーンショットの前と同じように画像を滑らかにする方法について何かアイデアはありますか?

前:

前

後:

後

4

1 に答える 1

1

あなたが指摘したリンクに基づいた2つのステップの例:

convert <source> -alpha extract -threshold 0 -negate -transparent white <tmp>
convert <tmp> -fill red -opaque black <destination>

、、を適切なファイル名に置き換え、必要な色<source>に置き換えます。<tmp><destination>red

編集:質問の作者が見つけた短いバージョン:

exec("convert $source -threshold 100% +level-colors '#00FF00', $final");
于 2012-10-15T23:59:04.290 に答える