[PHP]GDを使ってグラデーション画像をつくる

PHP の GD を使ってグラデーションを描画するサンプルです。

256階調を最大とし、開始色と終了色のミックス量を決めて混色するシンプルな仕組みです。
太さ 1px の線状にグラデーションを作り、 imagecopyresampled() を使って引き伸ばすことで高速化を図っています。

<?php
//キャンバスサイズ
$width   = 300;
$height  = 200;
 
//開始色
$start_r = 255;
$start_g = 255;
$start_b = 0;
 
//終了色
$end_r = 0;
$end_g = 255;
$end_b = 255;

//方向("vertical" 又は "horizontal")
$direction = "vertical";

$image = imagecreatetruecolor($width, $height);

if($direction === "horizontal"){
	$grad_w = 256;
	$grad_h = 1;
} else if($direction === "vertical"){
	$grad_w = 1;
	$grad_h = 256;
}
$gradient = imagecreatetruecolor( $grad_w, $grad_h);	
	
for($i=0;$i<=255;$i++){

	$mix = $i / 255;

	$current_r = $start_r * (1 - $mix) + $end_r * $mix;
	$current_g = $start_g * (1 - $mix) + $end_g * $mix;
	$current_b = $start_b * (1 - $mix) + $end_b * $mix;

	$color = imagecolorallocate($gradient, $current_r, $current_g, $current_b);

	if($direction === "horizontal"){
		imagesetpixel($gradient, $i, 0, $color);
	} else if($direction === "vertical"){
		imagesetpixel($gradient, 0, $i, $color);
	}
}

imagecopyresampled($image, $gradient, 0, 0, 0, 0, $width, $height, $grad_w, $grad_h);

header("Content-type: image/jpeg");
imagejpeg($image);
imagedestroy($image);
imagedestroy($gradient);

grad_h
水平方向

grad_v
垂直方向

グラデーションの開始と終了を RGB 値(それぞれ0~255)で指定します。
グラデーションの方向は垂直(vertical)と水平(horizontal)が選べます。

[PHP]画像を上下反転、左右反転する(垂直・水平方向の鏡像)

最初にこの記事を書いた時点では GD による画像反転の関数は用意されていなかったので独自に imageflip() という関数を書いたのがこの記事です。
しかし PHP 5.5 以降で全く同じ名前の関数 imageflip() が使えるようになりました。

使い方は簡単で imageflip() に画像リソースと反転方向を与えるだけです。

<?php
$file	 = "sample.jpg";
$image	 = imagecreatefromjpeg($file);
imageflip($image, IMG_FLIP_HORIZONTAL);

header("Content-type: image/jpeg");
imagejpeg($image);
imagedestroy($image);

反転方向の指定は水平反転を行う IMG_FLIP_HORIZONTAL、垂直反転を行う IMG_FLIP_VERTICAL、両方を行う IMG_FLIP_BOTH の3つです。

PHP 5.5より古いバージョンであっても画像の拡大縮小コピーを行う関数 imagecopyresampled のコピー元の幅や高さにマイナスを指定することで反転を行うことができます。

<?php
function imageflip_alt(&$image, $direction, $alpha=false){
	$width	 = imagesx($image);
	$height	 = imagesy($image);

	$new_image = imagecreatetruecolor($width, $height);
	
	// PNGなどの不透明度情報を持つ場合
	if($alpha){
		imagealphablending($new_image, false);
		imagesavealpha($new_image, true);
	}
	
	if($direction === 'vertical'){
		imagecopyresampled($new_image, $image, 0, 0, 0, $height - 1,
			$width, $height, $width, -1 * $height);
	} else if($direction === 'horizontal'){
		imagecopyresampled($new_image, $image, 0, 0, $width - 1, 0,
			$width, $height, -1 * $width, $height);
	} else if($direction === 'both'){
		imagecopyresampled($new_image, $image, 0, 0, $width - 1, $height - 1,
			$width, $height, -1 * $width, -1 * $height);
	} else {
		return false;
	}
	
	imagedestroy($image);
	$image = $new_image;
	
	return true;
}

$file	 = "sample.jpg";
$image	 = imagecreatefromjpeg($file);
imageflip_alt($image, 'horizontal');

header("Content-type: image/jpeg");

imagejpeg($image);

imagedestroy($image);

sample
元画像(sample.jpg)

horizontal
水平反転

vertical
垂直反転

使い方は、imageflip( 画像リソース, 方向 ) のように指定します。PNG 画像の場合は第三引数 $alpha を true にして下さい。 方向にはそれぞれ vertical(垂直)、horizontal(水平)、both(両方)が指定出来ます。

単に幅や高さをマイナスにするだけでは 1 ピクセルだけずれてしまうので座標を修正しています。

[PHP]円グラフを表示する(GD)

piegraph

円グラフを PHP で作るには GD に含まれる imagefilledarc() を使うのが便利です。
この関数は塗りつぶした楕円弧を描くためのものです

<?php
//値
$values = array(30, 40, 60, 80, 20);

//グラフに使う色
$colorset = array(
	'ff3b3b', 'bc3bff', '44aeff', 'aeff3b', 'ffa53b'
);

$width	 = 240;
$height	 = 240;

$cx = round( $width / 2 );
$cy = round( $height / 2 );

$image = imagecreatetruecolor($width, $height);

//背景
$bg		 = imagecolorallocate( $image, 255, 255, 255 );
imagefill($image, 0, 0, $bg);

list($red, $green, $blue) = parse_color($colorset[0]);

rsort($values);
$scale = 360 / array_sum($values);
$count = count($values);

$start = -90;
$end = $start;

foreach($values as $key => $value){
	list($red, $green, $blue) = parse_color( current($colorset) );
	$start = $end;
	$end = ($key === $count - 1) ? 270 : $end = $value * $scale + $start;
	$color = imagecolorallocate($image, $red, $green, $blue);
	imagefilledarc($image, $cx, $cy, $width, $height, $start, $end, $color, IMG_ARC_PIE);
	$res = next($colorset);
	if($res === false) reset($colorset);
}

// 画像を出力します
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);

function parse_color($rgb){
	$res = str_split($rgb, 2);
	$red	 = intval($res[0], 16);
	$green	 = intval($res[1], 16);
	$blue	 = intval($res[2], 16);
	return array( $red, $green, $blue );
}

配列の数値を大きいものから順に並び替え、360 度で表せるように倍率を調整しています。
丸め誤差によりぴったりと円が閉じないことがあるので最後の値の時は確実に閉じるように処理を加えてあります。

この関数の 0 度は 3 時方向からスタートするので、12 時方向からスタートさせるために -90 度させています。

グラフに使う色は 16 進数で指定できるようにしました。直接 RGB の数値をそれぞれ入力させてもいいのですが馴染みやすいのでこの表示を使っています。
カラーセットで用意した色数よりも多い値が与えられても、繰り返し使用するので色が不足することはありませんが、数によっては開始の色と最後の値の色が同じになってしまうので、値が奇数個の時と偶数個の時でカラーセットの数を調整する仕組みをつけたほうがいいと思います。