フルカラーから透明にする必要がある画像の上にグラデーションをレンダリングしようとしています。これが私のコードです。黒の画像が表示され、startを0より大きくすると、白のグラデーションが表示されますが、画像は表示されません。出力画像は338x100ピクセルですが、画像が狭い場合は入力画像を右揃えにする必要があります。
function hex2rgb($hex) {
$rgb[0] = hexdec(substr($hex, 0, 2));
$rgb[1] = hexdec(substr($hex, 2, 2));
$rgb[2] = hexdec(substr($hex, 4, 2));
return $rgb;
}
function int2rgb($color) {
$result[] = ($color >> 16) & 0xFF;
$result[] = ($color >> 8) & 0xFF;
$result[] = $color & 0xFF;
return $result;
}
if (isset($_GET['start']) && isset($_GET['stop']) && isset($_GET['color'])) {
$input = imagecreatefrompng('file.png');
$width = imagesx($input);
$output = imagecreatetruecolor(338, 100);
$color = hex2rgb($_GET['color']);
$fill = imagecolorallocate($output, $color[0], $color[1], $color[2]);
for ($x=0; $x<$_GET['start']; ++$x) {
for ($y=0; $y<100; ++$y) {
imagesetpixel($output, $x, $y, $fill);
}
}
$range = $_GET['stop']-$_GET['start'];
for ($x=$_GET['start']; $x<$_GET['stop']; ++$x) {
$alpha = round(255-($x*255/$range));
$correct_x = $width < 338 ? $x+$width-338 : $x;
for ($y=0; $y<100; ++$y) {
$input_color = int2rgb(imagecolorat($input, $correct_x, $y));
$new_color = imagecolorallocate($output,
(($color[0]-$alpha)*$input_color[0])/255,
(($color[1]-$alpha)*$input_color[1])/255,
(($color[2]-$alpha)*$input_color[2])/255);
imagesetpixel($output, $x, $y, $new_color);
}
}
if ($_GET['stop']<338) {
$stop = $width < 338 ? $_GET['stop']+$width-338 : $_GET['stop'];
imagecopy($input, $output, $stop, 0, $_GET['stop'], 0, 338-$stop, 100);
header('Content-Type: image/png');
imagepng($output);
}
}
でスクリプトを実行し、gradient.php?start=20&stop=200&color=ff0000
赤いグラデーションの代わりにこれを取得しました。
そのグラデーションをフルカラーからフルトランスペアレントに赤にする方法は?したがって、次のようになります。