134 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * Color Wheel Generator
 | 
						|
 * 
 | 
						|
 * This file is used only to generate color wheel image and not needed 
 | 
						|
 * for the Wheel Color Picker plugin.
 | 
						|
 * 
 | 
						|
 * This script requires GD library.
 | 
						|
 * 
 | 
						|
 * Copyright © 2011 Fajar Yoseph Chandra. All rights reserved.
 | 
						|
 * Licensed under MIT License.
 | 
						|
 * http://www.opensource.org/licenses/mit-license.php
 | 
						|
 */
 | 
						|
 
 | 
						|
/**
 | 
						|
 * Converts hsv to rgb value
 | 
						|
 * $h - Hue in degree [0, 360]
 | 
						|
 * $s - Sat [0, 1]
 | 
						|
 * $v - Value [0, 1]
 | 
						|
 * Return: array of R, G, B
 | 
						|
 */
 | 
						|
function hsv2rgb($h, $s, $v) {
 | 
						|
	$c = $v * $s;
 | 
						|
	$h1 = $h/60;
 | 
						|
	$x = $c * (1 - abs($h1 % 2 - 1));
 | 
						|
	$rgb = array('r' => 0, 'g' => 0, 'b' => 0);
 | 
						|
	if($h >= 0 && $h < 1) {
 | 
						|
		$rgb[r] = $c;
 | 
						|
		$rgb[g] = $x;
 | 
						|
		$rgb[b] = 0;
 | 
						|
	}
 | 
						|
	elseif($h >= 1 && $h < 2) {
 | 
						|
		$rgb[r] = $x;
 | 
						|
		$rgb[g] = $c;
 | 
						|
		$rgb[b] = 0;
 | 
						|
	}
 | 
						|
	elseif($h >= 2 && $h < 3) {
 | 
						|
		$rgb[r] = 0;
 | 
						|
		$rgb[g] = $c;
 | 
						|
		$rgb[b] = $x;
 | 
						|
	}
 | 
						|
	elseif($h >= 3 && $h < 4) {
 | 
						|
		$rgb[r] = 0;
 | 
						|
		$rgb[g] = $x;
 | 
						|
		$rgb[b] = $c;
 | 
						|
	}
 | 
						|
	elseif($h >= 4 && $h < 5) {
 | 
						|
		$rgb[r] = $x;
 | 
						|
		$rgb[g] = 0;
 | 
						|
		$rgb[b] = $c;
 | 
						|
	}
 | 
						|
	elseif($h >= 5 && $h < 6) {
 | 
						|
		$rgb[r] = $c;
 | 
						|
		$rgb[g] = 0;
 | 
						|
		$rgb[b] = $x;
 | 
						|
	}
 | 
						|
	$m = $v - $c;
 | 
						|
	$rgb[r] = $rgb[r] + $m;
 | 
						|
	$rgb[g] = $rgb[g] + $m;
 | 
						|
	$rgb[b] = $rgb[b] + $m;
 | 
						|
	return $rgb;
 | 
						|
}
 | 
						|
 | 
						|
header("Content-type: image/png");
 | 
						|
header("Content-disposition: inline; filename=wheel.png");
 | 
						|
 | 
						|
$w = isset($_REQUEST['w']) ? $_REQUEST['w'] : 256;
 | 
						|
$h = isset($_REQUEST['h']) ? $_REQUEST['h'] : 256;
 | 
						|
$center = array('x' => $w/2, 'y' => $h/2);
 | 
						|
$r = ($w > $h) ? $h/2 : $w/2;
 | 
						|
 | 
						|
// Create transparent image
 | 
						|
$img = imagecreatetruecolor($w, $h);
 | 
						|
imagealphablending($img, false);
 | 
						|
$background = imagecolorallocatealpha($img, 0, 0, 0, 127);
 | 
						|
imagefill($img, 0, 0, $background);
 | 
						|
imagealphablending($img, true);
 | 
						|
 | 
						|
// Circle
 | 
						|
//imagefilledellipse($img, $center[x], $center[y], $r*2, $r*2, 0x00000000);
 | 
						|
 | 
						|
// Fill the wheel with colors
 | 
						|
for($y = 0; $y < $h; $y++) {
 | 
						|
	for($x = 0; $x < $h; $x++) {
 | 
						|
		// Get the offset from central position
 | 
						|
		$offset = sqrt(pow($x-$center['x'], 2) + pow($y-$center['y'], 2));
 | 
						|
		
 | 
						|
		// Skip pixel outside the circle area
 | 
						|
		if($offset > $r)
 | 
						|
			continue;
 | 
						|
			
 | 
						|
		// Get the position degree (hue)
 | 
						|
		$deg = (
 | 
						|
			($x-$center['x'] == 0 
 | 
						|
				? ($y < $center['x'] ? 90 : 270)
 | 
						|
				: rad2deg(atan(($center['y']-$y)/($x-$center['x'])))
 | 
						|
			)
 | 
						|
			+($x < $center['x'] ? 180 : 0)
 | 
						|
			+360
 | 
						|
		)%360;
 | 
						|
		
 | 
						|
		// Relative Offset (sat)
 | 
						|
		$sat = $offset/$r;
 | 
						|
		
 | 
						|
		// Value is always 1
 | 
						|
		$val = 1;
 | 
						|
		
 | 
						|
		// Calculate color
 | 
						|
		$cr = (abs($deg+360)+60)%360 < 120 ? 1
 | 
						|
			: ($deg > 240 ? (120-abs($deg-360))/60 
 | 
						|
			: ($deg < 120 ? (120-$deg)/60
 | 
						|
			: 0));
 | 
						|
		$cg = abs($deg-120) < 60 ? 1
 | 
						|
			: (abs($deg-120) < 120 ? (120-abs($deg-120))/60 
 | 
						|
			: 0);
 | 
						|
		$cb = abs($deg-240) < 60 ? 1
 | 
						|
			: (abs($deg-240) < 120 ? (120-abs($deg-240))/60 
 | 
						|
			: 0);
 | 
						|
		$pr = ($cr + (1-$cr)*(1-$sat)) * 255;
 | 
						|
		$pg = ($cg + (1-$cg)*(1-$sat)) * 255;
 | 
						|
		$pb = ($cb + (1-$cb)*(1-$sat)) * 255;
 | 
						|
		$rgb = sprintf("0x%02x%02x%02x", $pr, $pg, $pb);
 | 
						|
		imagesetpixel($img, $x, $y, $rgb);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Border
 | 
						|
//imageellipse($img, $center[x], $center[y], $r*2, $r*2, 0x00000000);
 | 
						|
 | 
						|
// Output resulting image
 | 
						|
imagesavealpha($img, true);
 | 
						|
imagepng($img);
 | 
						|
imagedestroy($img);
 |