Draw UPC Barcode

<?php

/**
 * draw_upc_barcode
 *
 * Draw a barcode for a UPC number.
 *
 * @version 0.3
 * @author Contributors at eXorithm
 * @link https://www.exorithm.com/algorithm/view/draw_upc_barcode Listing at eXorithm
 * @link https://www.exorithm.com/algorithm/history/draw_upc_barcode History at eXorithm
 * @license https://www.exorithm.com/home/show/license
 *
 * @param mixed $number The 12-digit UPC number.
 * @param bool $show_numbers Whether to draw the numbers at the bottom of the barcode.
 * @return resource GD image
 */
function draw_upc_barcode($number='925853043217',$show_numbers=true)
{
	$number = str_replace(array('-',' '), '', $number);
	
	if (strlen($number)!=12)
		throw new Exception("UPC number must have 12 digits");
	
	for ($i=0;$i<12;$i++) {
		if (!is_numeric($number[$i]))
			throw new Exception("UPC number must contain only digits");
	}
	
	$lcodes = array(
		'0001101',
		'0011001',
		'0010011',
		'0111101',
		'0100011',
		'0110001',
		'0101111',
		'0111011',
		'0110111',
		'0001011',
	);
	
	$rcodes = array(
		'1110010',
		'1100110',
		'1101100',
		'1000010',
		'1011100',
		'1001110',
		'1010000',
		'1000100',
		'1001000',
		'1110100',
	);
	
	$code = '101';
	for ($i=0;$i<6;$i++) {
		$code .= $lcodes[$number[$i]];
	}
	$code .= '01010';
	for ($i=6;$i<12;$i++) {
		$code .= $rcodes[$number[$i]];
	}
	$code .= '101';
	
	// create image
	$width=190;
	$height=100;
	$image = image_create_alpha($width, $height);
	
	$white = imagecolorallocate($image, 255, 255, 255);
	imagefilledrectangle($image, 0, 0, $width, $height, $white);
	
	// draw lines
	$black = imagecolorallocate($image, 0, 0, 0);
	for ($i=0;$i<strlen($code);$i++) {
		if ($code[$i]=='1') {
			imageline($image, $i*2,0, $i*2, $height, $black);
			imageline($image, $i*2+1,0, $i*2+1, $height, $black);
		}
	}
	
	// draw numbers
	if ($show_numbers) {
		imagefilledrectangle($image, 6, $height-16, 90, $height, $white);
		imagefilledrectangle($image, 98, $height-16, 182, $height, $white);
		for ($i=0;$i<6;$i++) {
			imagestring($image, 2, 11+$i*14, $height-14, $number[$i], $black);
		}
		for ($i=6;$i<12;$i++) {
			imagestring($image, 2, 19+$i*14, $height-14, $number[$i], $black);
		}
	}
	
	return $image;
}

/**
 * image_create_alpha
 *
 * Helper function to create a new blank image with transparency.
 *
 * @version 0.1
 * @author Contributors at eXorithm
 * @link https://www.exorithm.com/algorithm/view/image_create_alpha Listing at eXorithm
 * @link https://www.exorithm.com/algorithm/history/image_create_alpha History at eXorithm
 * @license https://www.exorithm.com/home/show/license
 *
 * @param mixed $width 
 * @param mixed $height 
 * @return resource GD image
 */
function image_create_alpha($width='',$height='')
{
	// Create a normal image and apply required settings
	$img = imagecreatetruecolor($width, $height);
	imagealphablending($img, false);
	imagesavealpha($img, true);
	
	// Apply the transparent background
	$trans = imagecolorallocatealpha($img, 0, 0, 0, 127);
	for ($x = 0; $x < $width; $x++)
	{
		for ($y = 0; $y < $height; $y++)
		{
			imagesetpixel($img, $x, $y, $trans);
		}
	}
	
	return $img;
}

?>