I know this might look somewhat superfluous to others, but i once came across a situation where i needed a *strong* blur on an image without having ImageMagick installed. Executing the convolution-filter several times on the same image is awfully slow and still doesn't give a good blur.
The function below accepts a truecolor-image and a blur-factor between 0.0 and 1.0. Beware: It's still quite slow.
<?php
function blurImage($srcimg,$blur)
{
$blur = $blur*$blur;
$blur = max(0,min(1,$blur));
$srcw = imagesx($srcimg);
$srch = imagesy($srcimg);
$dstimg = imagecreatetruecolor($srcw,$srch);
$f1a = $blur;
$f1b = 1.0 - $blur;
$cr = 0; $cg = 0; $cb = 0;
$nr = 0; $ng = 0; $nb = 0;
$rgb = imagecolorat($srcimg,0,0);
$or = ($rgb >> 16) & 0xFF;
$og = ($rgb >> 8) & 0xFF;
$ob = ($rgb) & 0xFF;
//-------------------------------------------------
// first line is a special case
//-------------------------------------------------
$x = $srcw;
$y = $srch-1;
while ($x--)
{
//horizontal blurren
$rgb = imagecolorat($srcimg,$x,$y);
$cr = ($rgb >> 16) & 0xFF;
$cg = ($rgb >> 8) & 0xFF;
$cb = ($rgb) & 0xFF;
$nr = ($cr * $f1a) + ($or * $f1b);
$ng = ($cg * $f1a) + ($og * $f1b);
$nb = ($cb * $f1a) + ($ob * $f1b);
$or = $nr;
$og = $ng;
$ob = $nb;
imagesetpixel($dstimg,$x,$y,($nr << 16) | ($ng << 8) | ($nb));
}
//-------------------------------------------------
//-------------------------------------------------
// now process the entire picture
//-------------------------------------------------
$y = $srch-1;
while ($y--)
{
$rgb = imagecolorat($srcimg,0,$y);
$or = ($rgb >> 16) & 0xFF;
$og = ($rgb >> 8) & 0xFF;
$ob = ($rgb) & 0xFF;
$x = $srcw;
while ($x--)
{
//horizontal
$rgb = imagecolorat($srcimg,$x,$y);
$cr = ($rgb >> 16) & 0xFF;
$cg = ($rgb >> 8) & 0xFF;
$cb = ($rgb) & 0xFF;
$nr = ($cr * $f1a) + ($or * $f1b);
$ng = ($cg * $f1a) + ($og * $f1b);
$nb = ($cb * $f1a) + ($ob * $f1b);
$or = $nr;
$og = $ng;
$ob = $nb;
//vertical
$rgb = imagecolorat($dstimg,$x,$y+1);
$vr = ($rgb >> 16) & 0xFF;
$vg = ($rgb >> 8) & 0xFF;
$vb = ($rgb) & 0xFF;
$nr = ($nr * $f1a) + ($vr * $f1b);
$ng = ($ng * $f1a) + ($vg * $f1b);
$nb = ($nb * $f1a) + ($vb * $f1b);
$vr = $nr;
$vg = $ng;
$vb = $nb;
imagesetpixel($dstimg,$x,$y,($nr << 16) | ($ng << 8) | ($nb));
}
}
//-------------------------------------------------
return $dstimg;
}
$srcimg = imagecreatefromjpeg("test.jpg");
$dstimg = blurImage($srcimg,0.2);
header('Content-type: image/jpeg');
echo( imagejpeg($dstimg) );
exit();
?>
LXII. Imagens, Funções de
Introdução
O PHP não esta limitado a criar apenas saída em HTML. Ele também pode ser usado para criar e manipular arquivos de imagem em uma diversidade de formatos, incluindo gif, png, jpg, wbmp, e xpm. E ainda mais convenietemente, o PHP pode enviar streams de saída de imagem diratamente para o browser. Você precisará compilar o PHP com a biblioteca GD de imagens de funções para isto funcionar. O PHP e GD também podem requerer outras bibliotecas, dependendo dos formatos de imagens com os quais você queira trabalhar.
Você pode usar as funções de imagem no PHP para obter o tamanho de imagens JPEG, GIF, PNG, SWF, TIFF and JPEG2000.
Nota: Leia a seção sobre requerimentos sobre como expandir as capacidades de imagem para ler, escrever e modificar imagens e para ler meta dados de fotos tiradas por cameras digitais.
Dependências
Se você tiver a biblioteca GD (disponível em http://www.boutell.com/gd/) você poderá também criar e manipular imagens.
O formato das imagens que você pode manipilar dependem da versão da GD que você instalou, e de quaisquer outras bibliotecas que o GD possa precisar para acessar estes formatos de imagens. Versões do GD anteriores a gd-1.6 suportam imagens GIF, e não suportam PNG, enquanto versões posteriores a gd-1.6 suportam PNG, não GIF.
Nota: Apartir do PHP 4.3 existe uma versão empacotada da biblioteca GD. Esta versão empacotada tem algumas melhorias como alpha blending, e deve ser usada em preferência da biblioteca externa, já que seu código-fonte é melhor mantido e mais estável.
Você pode querer melhorar o GD para manipular mais formatos de imagens.
Tabela 1. Formatos de imagens suportados
| Formato da imagens | Biblioteca para baixar | Notas |
|---|---|---|
| gif | Suportado apenas em versões do GD anteriores a gd-1.6. Suporte Apenas para leitura esta disponível com o PHP 4.3.0 e a biblioteca GD empacotada. Suporte para Escrita esta disponível desde o PHP 4.3.9 e PHP 5.0.1. | |
| jpeg-6b | ftp://ftp.uu.net/graphics/jpeg/ | |
| png | http://www.libpng.org/pub/png/libpng.html | Apenas suportados em versões do GD maiores do que gd-1.6. |
| xpm | ftp://metalab.unc.edu/pub/Linux/libs/X/!INDEX.html | É provavel que você já tenha esta biblioteca disponível, se o seu sistema tiver um ambiênte X instalado. |
Voce pode querer melhorar o GD para lidar com fontes diferentes. As seguintes bibliotecas de fontes são suportadas:
Tabela 2. Bibliotes de fontes suportadas
| Biblioteca de fonte | Download | Notas |
|---|---|---|
| FreeType 1.x | http://www.freetype.org/ | |
| FreeType 2 | http://www.freetype.org/ | |
| T1lib | ftp://sunsite.unc.edu/pub/Linux/libs/graphics/) | Suporte para fontes Type 1. |
Se você tiver o PHP compilado com --enable-exif você poderá trabalhar com as informações guardadas nos cabeçalhos de imagens JPEG e TIFF. Deste jeito você poderá ler meta dados gerados por cameras digitais como mencionado acia. Estas funções não precisam da biblioteca GD.
Instalação
Para ativar suporte ao GD, configure o PHP com --with-gd[=DIR], aonde DIR é o diretório de instalação. Para usar a versão recomendada da biblioteca GD que acompanha o PHP (a qual foi embutida pela primeira vez no PHP 4.3.0), use a opção de configuração --with-gd.
No Windows, você irá incluir a DLL do GD2 php_gd2.dll como uma extensão no php.ini. A DLL GD1 php_gd.dll foi removida a partir do PHP 4.3.2. Também note que as funções de imagens truecolor, como imagecreatetruecolor(), requerem GD2.
Nota: Para ativar o suporte a exif no Windows, php_mbstring.dll deve ser carregada antes de php_exif.dll no php.ini.
Para desabilitar o suporte ao GD no PHP 3 adicione --without-gd na sua linha de configuração.
Melhore as capacidades do GD para manipular mais formatos de imagens especificando a opção --with-XXXX na sua linha de configuração do PHP.
Tabela 3. Formatos de imagens suportados
| Formato de Imagem | Opção de Configuração |
|---|---|
| jpeg-6b | Para ativar suporte a jpeg-6b adicione --with-jpeg-dir=DIR. |
| png | Para ativar suporte para png adicione --with-png-dir=DIR. Note que, libpng precisa de zlib library, portanto adicione a opção --with-zlib-dir[=DIR] na sua linha de configuração. |
| xpm | Para ativar suporte a xpm adicione --with-xpm-dir=DIR. Se o configure não for capaz de encontrar as bibliotecas necessárias, você deverá adicionar o caminho até as suas bibliotecas X11. |
Nota: Ao compilar o PHP com a libpng, você deve usar a mesma versão que foi ligada com a biblioteca GD.
Melhore as capacidades do GD para lidar com fontes diferentes especificando a opção de configuração --with-XXXX na linha de configuração do PHP.
Tabela 4. Bibliotecas de Fontes Suportadas
| Biblioteca de Fonte | Opção de Configuração |
|---|---|
| FreeType 1.x | Para ativar suporte a FreeType 1.x adicione --with-ttf[=DIR]. |
| FreeType 2 | Para ativar suporte a FreeType 2 adicione --with-freetype-dir=DIR. |
| T1lib | Para ativar suporte a T1lib (Type 1 fonts) adicione --with-t1lib[=DIR]. |
| Native TrueType string function | Para ativar suporte a native TrueType string function adicione --enable-gd-native-ttf. |
Configurações em execução
Não existem configurações especificas para imagens, mas você pode estar interresado nas diretivas da extensão exif.
Tipos Resource
Esta extensão não possui nenhum tipo resource.
Constantes pré-definidas
As contantes abaixo são definidas por esta extensão e somente estarão disponíveis quando a extensão foi compilada com o PHP ou carregada dinamicamente durante a execução.
- IMG_GIF (integer)
- IMG_JPG (integer)
- IMG_JPEG (integer)
- IMG_PNG (integer)
- IMG_WBMP (integer)
- IMG_XPM (integer)
- IMG_COLOR_TILED (integer)
- IMG_COLOR_STYLED (integer)
- IMG_COLOR_BRUSHED (integer)
- IMG_COLOR_STYLEDBRUSHED (integer)
- IMG_COLOR_TRANSPARENT (integer)
- IMG_ARC_ROUNDED (integer)
- IMG_ARC_PIE (integer)
- IMG_ARC_CHORD (integer)
- IMG_ARC_NOFILL (integer)
- IMG_ARC_EDGED (integer)
- IMAGETYPE_GIF (integer)
- IMAGETYPE_JPEG (integer)
- IMAGETYPE_PNG (integer)
- IMAGETYPE_SWF (integer)
- IMAGETYPE_PSD (integer)
- IMAGETYPE_BMP (integer)
- IMAGETYPE_WBMP (integer)
- IMAGETYPE_XBM (integer)
- IMAGETYPE_TIFF_II (integer)
- IMAGETYPE_TIFF_MM (integer)
- IMAGETYPE_IFF (integer)
- IMAGETYPE_JB2 (integer)
- IMAGETYPE_JPC (integer)
- IMAGETYPE_JP2 (integer)
- IMAGETYPE_JPX (integer)
- IMAGETYPE_SWC (integer)
Exemplos
- Índice
- gd_info -- Obtém informações sobre a biblioteca GD instalada atualmente
- getimagesize -- Obtém o tamanho de uma imagem
- image_type_to_extension -- Get file extension for image type
- image_type_to_mime_type -- Obtém o Mime-Type para um tipo de imagem retornado por getimagesize, exif_read_data, exif_thumbnail, exif_imagetype
- image2wbmp -- Envia uma imagem para o browser ou arquivo
- imagealphablending -- Set the blending mode for an image
- imageantialias -- Indica se as funções de antialias devem ser usadas ou não
- imagearc -- Desenha um elipse parcial
- imagechar -- Desenha um caractere horizontalmente
- imagecharup -- Desenha um caractere verticalmente
- imagecolorallocate -- Aloca uma cor para uma imagem
- imagecolorallocatealpha -- Aloca cor para uma imagem
- imagecolorat -- Retorna o índice da cor de um pixel
- imagecolorclosest -- Retorna o índice da cor mais próxima da cor especificada
- imagecolorclosestalpha -- Retorna o índice da cor mais próxima da cor especificada + transparencia
- imagecolorclosesthwb -- Get the index of the color which has the hue, white and blackness nearest to the given color
- imagecolordeallocate -- Desaloca uma cor para uma imagem
- imagecolorexact -- Retorna o índice da cor especificada
- imagecolorexactalpha -- Retorna o índice da cor especificada + transparencia
- imagecolormatch -- Faz com que a versão das cores da paleta sejam mais próximas da versão truecolor
- imagecolorresolve -- Retorna o índice da cor especificada ou a alternativa mais próxima possível
- imagecolorresolvealpha -- Retorna o índice da cor especificada + transparência ou a sua alternativa mais próxima
- imagecolorset -- Set the color for the specified palette index
- imagecolorsforindex -- Retorna as cores de um índice
- imagecolorstotal -- Retorna o número de cores na paleta de uma imagem
- imagecolortransparent -- Define uma cor como tansparente
- imageconvolution -- Apply a 3x3 convolution matrix, using coefficient div and offset
- imagecopy -- Copia parte de uma imagem
- imagecopymerge -- Copia e combina uma parte de uma imagem
- imagecopymergegray -- Copy and merge part of an image with gray scale
- imagecopyresampled -- Copy and resize part of an image with resampling
- imagecopyresized -- Copy and resize part of an image
- imagecreate -- Cria uma nova imagem baseada em paleta
- imagecreatefromgd2 -- Cria uma nova imagem apartir de um arquivo GD2 ou URL
- imagecreatefromgd2part -- Cria uma nova imagem apartir de uma parte de um arquivo GD ou URL
- imagecreatefromgd -- Cria uma nova imagem apartir de um arquivo GD ou URL
- imagecreatefromgif -- Cria uma nova imagem a partir de um arquivo ou URL
- imagecreatefromjpeg -- Cria uma nova imagem a apratir de um arquivo ou URL
- imagecreatefrompng -- Cria uma nova imagem a apratir de um arquivo ou URL
- imagecreatefromstring -- Cria uma nova imagem a apartir da imagem na string
- imagecreatefromwbmp -- Cria uma nova imagem a apratir de um arquivo ou URL
- imagecreatefromxbm -- Cria uma nova imagem a apratir de um arquivo ou URL
- imagecreatefromxpm -- Cria uma nova imagem a apratir de um arquivo ou URL
- imagecreatetruecolor -- Cria uma nova imagem true color
- imagedashedline -- Desenha uma linha pontilhada
- imagedestroy -- Destroi uma imagem
- imageellipse -- Desenha um elipse
- imagefill -- Flood fill
- imagefilledarc -- Draw a partial ellipse and fill it
- imagefilledellipse -- Desenha um elipse prenchido
- imagefilledpolygon -- Desenha um poligono prenchido
- imagefilledrectangle -- Desenha um retângulo prenchido
- imagefilltoborder -- Flood fill to specific color
- imagefilter -- Applies a filter to an image
- imagefontheight -- Retorna a altura da fonte
- imagefontwidth -- Retorna a largura da fonte
- imageftbbox -- Give the bounding box of a text using fonts via freetype2
- imagefttext -- Escreve texto na imagem usando fontes FreeType 2
- imagegammacorrect -- Apply a gamma correction to a GD image
- imagegd2 -- Envia uma imagem GD2
- imagegd -- Envia a imagem GD para o browser ou um arquivo
- imagegif -- Envia uma imagem para o browser ou arquivo
- imageinterlace -- Ativa ou desativa o entrelaçamento
- imageistruecolor -- Indica quando uma imagem é uma imagem truecolor
- imagejpeg -- Envia a imagem para o borwser ou arquivo
- imagelayereffect -- Set the alpha blending flag to use the bundled libgd layering effects
- imageline -- Desenha uma linha
- imageloadfont -- Carrega uma nova fonte
- imagepalettecopy -- Copia a paleta de uma imagem para a outra
- imagepng -- Envia uma imagem PNG para o browser ou para um arquivo
- imagepolygon -- Desenha um poligono
- imagepsbbox -- Give the bounding box of a text rectangle using PostScript Type1 fonts
- imagepsencodefont -- Change the character encoding vector of a font
- imagepsextendfont -- Extend or condense a font
- imagepsfreefont -- Libera a memória usada por uma fonte PostScript Type
- imagepsloadfont -- Carrega uma fonte PostScript Type 1 a partir de um arquivo
- imagepsslantfont -- Slant a font
- imagepstext -- To draw a text string over an image using PostScript Type1 fonts
- imagerectangle -- Desenha um retângulo
- imagerotate -- Gira uma imagem com o ângulo dado
- imagesavealpha -- Define a opção para salvar a informação completa do alpha channel (ao invés de a transparencia de uma cor só) quando estiver salvando imagens PNG.
- imagesetbrush -- Set the brush image for line drawing
- imagesetpixel -- Define um único pixel
- imagesetstyle -- Set the style for line drawing
- imagesetthickness -- Define a espessura para o desenho de linhas
- imagesettile -- Set the tile image for filling
- imagestring -- Desenha uma string horizontalmente
- imagestringup -- Desenha uma string verticalmente
- imagesx -- Obtem a largura da imagem
- imagesy -- Obtém a altura da imagem
- imagetruecolortopalette -- Converte uma imagem true color para uma imagem de paleta
- imagettfbbox -- Retorna uma caixa com o limites de um texto usando fontes TrueType
- imagettftext -- Escreve texto na imagem usando fontes TrueType
- imagetypes -- Retorna os tipos de imagens suportados por esta instalação do PHP
- imagewbmp -- Envia uma imagem para o browser ou arquivo
- imagexbm -- Output XBM image to browser or file
- iptcembed -- Embute dados binários IPTC em uma imagem JPEG
- iptcparse -- Interpreta um bloco IPTC http://www.iptc.org/ binário em tags simples.
- jpeg2wbmp -- Converte um arquivo de imagem JPEG para um arquivo de imagem WBMP
- png2wbmp -- Converte um arquivo de imagem PNG para um arquivo de imagem WBMP
I wrote a simple function to convert an image resource to PGM (portable graymap) in order to feed it to an OCR program. It works just like the rest of the image output functions, and will convert to grayscale for you:
<?php
function imagepgm($image, $filename = null)
{
$pgm = "P5 ".imagesx($image)." ".imagesy($image)." 255\n";
for($y = 0; $y < imagesy($image); $y++)
{
for($x = 0; $x < imagesx($image); $x++)
{
$colors = imagecolorsforindex($image, imagecolorat($image, $x, $y));
$pgm .= chr(0.3 * $colors["red"] + 0.59 * $colors["green"] + 0.11 * $colors["blue"]);
}
}
if($filename != null)
{
$fp = fopen($filename, "w");
fwrite($fp, $pgm);
fclose($fp);
}
else
{
return $pgm;
}
}
?>
I've developed a well-documented, fairly rock-solid API for creating on the fly, anti-aliased, rounded corner images, including full alpha transparency support for all you PNG lovers.
go here to download the package:
http://sourceforge.net/projects/roundedphp/
go here for a live demo:
http://dev.kingthief.com/demos/roundedphp/
Installation is similar to PEAR.
Enjoy!
<?php
/**
HSL/RGB conversion functions
very useful for a lot of applications
**/
function RBGtoHSL ( $R, $G, $B )
{
$var_R = ( $R / 255 );
$var_G = ( $G / 255 );
$var_B = ( $B / 255 );
$var_Min = min( $var_R, $var_G, $var_B )
$var_Max = max( $var_R, $var_G, $var_B )
$del_Max = $var_Max - $var_Min
$L = ( $var_Max + $var_Min ) / 2;
if ( $del_Max == 0 )
{
$H = 0
$S = 0
}
else
{
if ( $L < 0.5 )
{
$S = $del_Max / ( $var_Max + $var_Min );
}
else
{
$S = $del_Max / ( 2 - $var_Max - $var_Min );
}
$del_R = ( ( ( $var_Max - $var_R ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
$del_G = ( ( ( $var_Max - $var_G ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
$del_B = ( ( ( $var_Max - $var_B ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
if ( $var_R == $var_Max )
{
$H = $del_B - $del_G;
}
else if ( $var_G == $var_Max )
{
$H = ( 1 / 3 ) + $del_R - $del_B;
}
else if ( $var_B == $var_Max )
{
$H = ( 2 / 3 ) + $del_G - $del_R;
}
if ( $H < 0 )
{
$H += 1;
}
if ( $H > 1 )
{
$H -= 1
}
}
return array( $H, $S, $L );
}
function HuetoRGB( $v1, $v2, $vH )
{
if ( $vH < 0 )
{
$vH += 1;
}
if ( $vH > 1 )
{
$vH -= 1;
}
if ( ( 6 * $vH ) < 1 )
{
return ( $v1 + ( $v2 - $v1 ) * 6 * $vH );
}
if ( ( 2 * $vH ) < 1 )
{
return ( $v2 );
}
if ( ( 3 * $vH ) < 2 )
{
return ( $v1 + ( $v2 - $v1 ) * ( ( 2 / 3 ) - $vH ) * 6 );
}
return ( $v1 )
}
function HSLtoRGB ( $H, $S, $L )
{
if ( $S == 0 )
{
$R = $L * 255;
$G = $L * 255;
$B = $L * 255;
}
else
{
if ( $L < 0.5 )
{
$var_2 = $L * ( 1 + $S );
}
else
{
$var_2 = ( $L + $S ) - ( $S * $L );
}
$var_1 = 2 * $L - $var_2;
$R = 255 * HuetoRGB( $var_1, $var_2, $H + ( 1 / 3 ) );
$G = 255 * HuetoRGB( $var_1, $var_2, $H );
$B = 255 * HuetoRGB( $var_1, $var_2, $H - ( 1 / 3 ) );
}
return array( $R, $G, $B );
}
function distance ( $R1, $G1, $B1, $R2, $G2, $B2 )
{
$result = sqrt ( ( $R1 - $R2 )*( $R1 - $R2 ) + ( $G1 - $G2 )*( $G1 - $G2 ) + ( $B1 - $B2 )*( $B1 - $B2 ) );
return ( $result );
}
?>
If you happen to need a way to output a Windows BMP file (e.g. when using the PEAR ExcelWriter), feel free to use the following code:
<?php
function imagebmp ($im, $fn = false)
{
if (!$im) return false;
if ($fn === false) $fn = 'php://output';
$f = fopen ($fn, "w");
if (!$f) return false;
//Image dimensions
$biWidth = imagesx ($im);
$biHeight = imagesy ($im);
$biBPLine = $biWidth * 3;
$biStride = ($biBPLine + 3) & ~3;
$biSizeImage = $biStride * $biHeight;
$bfOffBits = 54;
$bfSize = $bfOffBits + $biSizeImage;
//BITMAPFILEHEADER
fwrite ($f, 'BM', 2);
fwrite ($f, pack ('VvvV', $bfSize, 0, 0, $bfOffBits));
//BITMAPINFO (BITMAPINFOHEADER)
fwrite ($f, pack ('VVVvvVVVVVV', 40, $biWidth, $biHeight, 1, 24, 0, $biSizeImage, 0, 0, 0, 0));
$numpad = $biStride - $biBPLine;
for ($y = $biHeight - 1; $y >= 0; --$y)
{
for ($x = 0; $x < $biWidth; ++$x)
{
$col = imagecolorat ($im, $x, $y);
fwrite ($f, pack ('V', $col), 3);
}
for ($i = 0; $i < $numpad; ++$i)
fwrite ($f, pack ('C', 0));
}
fclose ($f);
return true;
}
?>
It works the same way as regular imagejpeg/imagepng do and only supports GD2.0 true colour bitmaps (which is what's required by ExcelWriter).
Representation decimal of a color in hexadecimal for use on functions of library GD.
<?php
// Representation hexadecimal
$var = '#FFFFFF';
function getRgbFromGd($color_hex) {
return array_map('hexdec', explode('|', wordwrap(substr($color_hex, 1), 2, '|', 1)));
}
print_r(getRgbFromGd($var));
// Output: Array ( [0] => 255 [1] => 255 [2] => 255 )
?>
While I was searching for a good way to draw a graph, I stumbled on skumar2k15's script.
I have taken the liberty to improve multiple aspects of it.
1. The array can grow and shrink in size, the graph will adjust accordingly.
2. All the values in the array are recalculated so they won't get bigger than the height of the graph.
3. I inserted the possibility to keep a percentage off the height away from the edge.
4. You can adjust the size of the grid.
5. Everything will adjust when you change the height of width.
<?
header("Content-type: image/png");
// Define variables
$Values=array(50,90,30,155,50,40,320,50,40,86,240,128,650,540,320);
$imgWidth=500;
$imgHeight=200;
$grid=25;
$graphspacing=0.05;
//Creation of new array with hight adjusted values
while (list($key, $val) = each($Values))
{if($val>$max){$max=$val;}}
for ($i=0; $i<count($Values); $i++){
$graphValues[$i] = $Values[$i] * (($imgHeight*(1-$graphspacing))/$max);
}
// Create image and define colors
$image=imagecreate($imgWidth, $imgHeight);
$colorWhite=imagecolorallocate($image, 255, 255, 255);
$colorGrey=imagecolorallocate($image, 192, 192, 192);
$colorBlue=imagecolorallocate($image, 0, 0, 255);
// Create border around image
imageline($image, 0, 0, 0, $imgHeight, $colorGrey);
imageline($image, 0, 0, $imgWidth, 0, $colorGrey);
imageline($image, $imgWidth-1, 0, $imgWidth-1, $imgHeight-1, $colorGrey);
imageline($image, 0, $imgHeight-1, $imgWidth-1, $imgHeight-1, $colorGrey);
// Create grid
for ($i=1; $i<($imgWidth/$grid); $i++)
{imageline($image, $i*$grid, 0, $i*$grid, $imgHeight, $colorGrey);}
for ($i=1; $i<($imgHeight/$grid); $i++)
{imageline($image, 0, $i*$grid, $imgWidth, $i*$grid, $colorGrey);}
// Create line graph
if($imgWidth/$grid>count($graphValues)){$space=$grid;}
else{$space = $imgWidth/(count($graphValues)-1);}
for ($i=0; $i<count($graphValues)-1; $i++)
{imageline($image, $i*$space, ($imgHeight-$graphValues[$i]), ($i+1)*$space, ($imgHeight-$graphValues[$i+1]), $colorBlue);}
// Output graph and clear image from memory
imagepng($image);
imagedestroy($image);
?>
The image sharpen function (by Alex R. Austin) provided below seems to be very resource hungry and I couldn't make it work on two different servers - trying to sharpen a 413 x 413 image I ended up with "Fatal error: Allowed memory size of 8388608 bytes exhausted" or "Internal Server Error" or the script terminated without notice. Because I had no priviliges to change the default memory limit on these servers I started looking for other sharpen functions. I have come across a php Unsharp Mask function which works like a charm on both of the servers I dealt with. It can be found at http://vikjavev.no/hovudsida/umtestside.php.
For fedora core 4 users that find that the gd library isn't installed, you can issue the command (as root)
# yum install php-gd
it should download and install the gd library. You will need to restart apache... phpinfo() should then tell you "GD Support enabled".
To sharpen an image, rather than using the code below that produces a sharpening filter with php, use the built-in GD function "imageconvolution" which is designed for this purpose. Matrices can be used for sharpening, blurring, edge detection, etc, ala Photoshop.
A sharpening example:
<?php
$sharpenMatrix = array(-1,-1,-1,-1,16,-1,-1,-1,-1);
$divisor = 8;
$offset = 0;
imageconvolution($myImage, $sharpenMatrix, $divisor, $offset);
?>
Below is some information on building different kinds of matrices. (If you have photoshop (or PSP, GIMP) you can test out your matrices before applying them in PHP)
http://loriweb.pair.com/8udf-basics.html (covers blurs)
http://loriweb.pair.com/8udf-sharpen.html
http://loriweb.pair.com/8udf-edges.html
http://loriweb.pair.com/8udf-emboss.html
I wrote an online overview of the image functions that people might find useful. In addition to a general overview of the various function categories and code samples, I have included many interactive examples of the functions, allowing viewers to experiment with the parameters, and seeing the results in real time. The presentation is located at New York PHP
http://www.nyphp.org/content/presentations/GDintro/
A fun little function to output UPC-A 11-digit barcodes.
Thanks to barcodeisland.com for the specs.
<?php
function UPCAbarcode($code) {
$lw = 2; $hi = 100;
$Lencode = array('0001101','0011001','0010011','0111101','0100011',
'0110001','0101111','0111011','0110111','0001011');
$Rencode = array('1110010','1100110','1101100','1000010','1011100',
'1001110','1010000','1000100','1001000','1110100');
$ends = '101'; $center = '01010';
/* UPC-A Must be 11 digits, we compute the checksum. */
if ( strlen($code) != 11 ) { die("UPC-A Must be 11 digits."); }
/* Compute the EAN-13 Checksum digit */
$ncode = '0'.$code;
$even = 0; $odd = 0;
for ($x=0;$x<12;$x++) {
if ($x % 2) { $odd += $ncode[$x]; } else { $even += $ncode[$x]; }
}
$code.=(10 - (($odd * 3 + $even) % 10)) % 10;
/* Create the bar encoding using a binary string */
$bars=$ends;
$bars.=$Lencode[$code[0]];
for($x=1;$x<6;$x++) {
$bars.=$Lencode[$code[$x]];
}
$bars.=$center;
for($x=6;$x<12;$x++) {
$bars.=$Rencode[$code[$x]];
}
$bars.=$ends;
/* Generate the Barcode Image */
$img = ImageCreate($lw*95+30,$hi+30);
$fg = ImageColorAllocate($img, 0, 0, 0);
$bg = ImageColorAllocate($img, 255, 255, 255);
ImageFilledRectangle($img, 0, 0, $lw*95+30, $hi+30, $bg);
$shift=10;
for ($x=0;$x<strlen($bars);$x++) {
if (($x<10) || ($x>=45 && $x<50) || ($x >=85)) { $sh=10; } else { $sh=0; }
if ($bars[$x] == '1') { $color = $fg; } else { $color = $bg; }
ImageFilledRectangle($img, ($x*$lw)+15,5,($x+1)*$lw+14,$hi+5+$sh,$color);
}
/* Add the Human Readable Label */
ImageString($img,4,5,$hi-5,$code[0],$fg);
for ($x=0;$x<5;$x++) {
ImageString($img,5,$lw*(13+$x*6)+15,$hi+5,$code[$x+1],$fg);
ImageString($img,5,$lw*(53+$x*6)+15,$hi+5,$code[$x+6],$fg);
}
ImageString($img,4,$lw*95+17,$hi-5,$code[11],$fg);
/* Output the Header and Content. */
header("Content-Type: image/png");
ImagePNG($img);
}
UPCAbarcode('12345678901');
?>
