GD 和图像函数

目录

添加备注

用户贡献的注释 9 个注释

chuckstudios at gmail dot com
15 年前
我编写了一个简单的函数将图像资源转换为 PGM(可移植灰度图),以便将其提供给 OCR 程序。它像其他图像输出函数一样工作,并将为您转换为灰度。

<?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;
}
}
?>
michal-ok at o2 dot pl
18 年前
下面提供的图像锐化函数(由 Alex R. Austin 提供)似乎非常占用资源,我无法在两台不同的服务器上使其工作——尝试锐化 413 x 413 的图像,最终导致“致命错误:允许的内存大小为 8388608 字节耗尽”或“内部服务器错误”,或者脚本终止而没有通知。由于我无权更改这些服务器上的默认内存限制,所以我开始寻找其他锐化函数。我偶然发现了一个 PHP 非锐化掩码函数,它在处理过的两台服务器上都运行良好。它可以在 http://vikjavev.no/hovudsida/umtestside.php. 找到。
felipensp at gmail dot com
18 年前
用于 GD 库函数的十六进制表示的颜色的十进制表示。

<?php

// 十六进制表示
$var = '#FFFFFF';

function
getRgbFromGd($color_hex) {

return
array_map('hexdec', explode('|', wordwrap(substr($color_hex, 1), 2, '|', 1)));

}

print_r(getRgbFromGd($var));

// 输出:Array ( [0] => 255 [1] => 255 [2] => 255 )

?>
shd at earthling dot net
18 年前
如果您碰巧需要一种输出 Windows BMP 文件的方法(例如,在使用 PEAR ExcelWriter 时),请随时使用以下代码。

<?php
function imagebmp ($im, $fn = false)
{
if (!
$im) return false;

if (
$fn === false) $fn = 'php://output';
$f = fopen ($fn, "w");
if (!
$f) return false;

// 图像尺寸
$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;
}
?>

它的工作方式与常规的 imagejpeg/imagepng 相同,并且只支持 GD2.0 真彩色位图(这是 ExcelWriter 所需的)。
ingo at jache dot de
12 年前
我知道这在其他人看来可能有点多余,但我曾经遇到过需要对图像进行 *强力* 模糊处理而没有安装 ImageMagick 的情况。在同一图像上多次执行卷积滤镜非常慢,而且仍然无法获得良好的模糊效果。

下面的函数接受一个真彩色图像和一个介于 0.0 到 1.0 之间的模糊因子。注意:它仍然相当慢。

<?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;

//-------------------------------------------------
// 第一行的特殊情况
//-------------------------------------------------
$x = $srcw;
$y = $srch-1;
while (
$x--)
{
// 水平模糊
$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));
}
//-------------------------------------------------

//-------------------------------------------------
// 现在处理整个图像
//-------------------------------------------------
$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--)
{
// 水平
$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;


// 垂直
$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();


?>
jeff at lushmedia dot com
20 年前
我写了一个关于图像函数的在线概述,大家可能会觉得有用。除了对各种函数类别和代码示例的总体概述外,我还包含了许多函数的交互式示例,允许查看者尝试不同的参数,并实时查看结果。演示文稿位于纽约 PHP 网站。
http://www.nyphp.org/content/presentations/GDintro/
delabahan at gmail dot com
7 年前
这是一个获取高分辨率图像的示例。

<?php
/**
* 类名 : resizeImage
* 创建者 : wang
* 描述 : 该类用于将图像从原始大小调整为新大小
*/
class resizeImage
{
/**
* 函数名 : resize_img
* 描述 : 该函数用于调整图像大小
* @param : $origimg 变量是原始图像
* @param : $newimg 变量是新的图像
* @param : $w 变量是图像的宽度
* @param : $f 变量是图像的高度
*/
public function resize_img($origimg,$newimg,$w,$h){
$info = getimagesize($origimg);
$mime = $info['mime'];

// 确保请求的文件实际上是图像
if(substr($mime, 0, 6) != 'image/')
{
header('HTTP/1.1 400 Bad Request');
return
'Error: requested file is not an accepted type: ' .$origimg;
exit();
}

// 检查图像扩展名
$extension = image_type_to_extension($info[2]);
if(
strtolower($extension) == '.png'){
$img = $this->resize_imagepng($origimg,$w, $h);
imagepng($img,$newimg);
imagedestroy($img);
}elseif(
strtolower($extension) == '.jpeg'){
$img = $this->resize_imagejpeg($origimg, $w, $h);
imagejpeg($img, $newimg);
imagedestroy($img);
}elseif(
strtolower($extension == '.gif')){
$img = $this->resize_imagegif($origimg, $w, $h);
imagegif($img,$newimg);
imagedestroy($img);
}

}
/**
* 结束函数名 : resize_img
*/

/**
* 函数名 : resize_imagepng
* 描述 : 该函数用于调整 png 图像大小
* @param : $file 变量是原始图像
* @param : $w 变量是图像的宽度
* @param : $f 变量是图像的高度
*/
private function resize_imagepng($file, $w, $h) {
list(
$width, $height) = getimagesize($file);
$src = imagecreatefrompng($file);
$dst = imagecreatetruecolor($w, $h);
imagecopyresampled($dst, $src, 0, 0, 0, 0, $w, $h, $width, $height);
return
$dst;
}
/**
* 结束函数名 : resize_imagepng
*/

/**
* 函数名 : resize_imagejpeg
* 描述 : 该函数用于调整 jpeg 图像大小
* @param : $file 变量是原始图像
* @param : $w 变量是图像的宽度
* @param : $f 变量是图像的高度
*/
private function resize_imagejpeg($file, $w, $h) {
list(
$width, $height) = getimagesize($file);
$src = imagecreatefromjpeg($file);
$dst = imagecreatetruecolor($w, $h);
imagecopyresampled($dst, $src, 0, 0, 0, 0, $w, $h, $width, $height);
return
$dst;
}
/**
* 结束函数名 : resize_imagejpeg
*/

/**
* 函数名 : resize_imagegif
* 描述 : 该函数用于调整 gif 图像大小
* @param : $file 变量是原始图像
* @param : $w 变量是图像的宽度
* @param : $f 变量是图像的高度
*/
private function resize_imagegif($file, $w, $h) {
list(
$width, $height) = getimagesize($file);
$src = imagecreatefromgif($file);
$dst = imagecreatetruecolor($w, $h);
imagecopyresampled($dst, $src, 0, 0, 0, 0, $w, $h, $width, $height);
return
$dst;
}
/**
* 结束函数名 : resize_imagegif
*/
}
/**
* 结束类名 : resizeImage
*/
?>
mpyw
7 年前
这是一个黑白图像 bmp() 实现的示例。

<?php

/**
* 将黑白 BMP 图像输出到浏览器或文件。
*
* @param resource $image
* 图像资源,由图像创建函数之一返回,
* 例如 imagecreatetruecolor()。
*
* @param string|null $to
* 保存文件的路径或打开的流资源
* (该资源在该函数返回后会自动关闭)
* 。
* 如果未设置或为 NULL,则会直接输出原始图像流。
*
* @param float $threshold
* 0.0 到 1.0 范围内的数字。
* 较大的数字表示较亮,较小的数字表示较暗。
*
* @return bool 成功时返回 TRUE,失败时返回 FALSE。
*
*/
function imagebwbmp($image, $to = null, $threshold = 0.5)
{
if (
func_num_args() < 1) {
$fmt = "imagebwbmp() 需要至少 1 个参数,实际传入 %d 个";
trigger_error(sprintf($fmt, func_num_args()), E_USER_WARNING);
return;
}
if (!
is_resource($image)) {
$fmt = "imagebwbmp() 需要参数 1 为资源,实际传入 %s";
trigger_error(sprintf($fmt, gettype($image)), E_USER_WARNING);
return;
}
if (!
is_numeric($threshold)) {
$fmt = "imagebwbmp() 需要参数 3 为浮点数,实际传入 %s";
trigger_error(sprintf($fmt, gettype($threshold)), E_USER_WARNING);
return;
}

if (
get_resource_type($image) !== 'gd') {
$msg = "imagebwbmp(): 传入的资源不是有效的 gd 资源";
trigger_error($msg, E_USER_WARNING);
return
false;
}
switch (
true) {
case
$to === null:
break;
case
is_resource($to) && get_resource_type($to) === 'stream':
case
is_string($to) && $to = fopen($to, 'wb'):
if (
preg_match('/[waxc+]/', stream_get_meta_data($to)['mode'])) {
break;
}
default:
$msg = "imagebwbmp(): 第二个参数无效,必须是可写的文件名或可写的流";
trigger_error($msg, E_USER_WARNING);
return
false;
}

if (
$to === null) {
$to = fopen('php://output', 'wb');
}

$biWidth = imagesx($image);
$biHeight = imagesy($image);
$biSizeImage = ((int)ceil($biWidth / 32) * 32 / 8 * $biHeight);
$bfOffBits = 54 + 4 * 2; // 使用两种颜色(黑色和白色)
$bfSize = $bfOffBits + $biSizeImage;

fwrite($to, 'BM');
fwrite($to, pack('VvvV', $bfSize, 0, 0, $bfOffBits));
fwrite($to, pack('VVVvvVVVVVV', 40, $biWidth, $biHeight, 1, 1, 0, $biSizeImage, 0, 0, 0, 0));
fwrite($to, "\xff\xff\xff\x00"); // 白色
fwrite($to, "\x00\x00\x00\x00"); // 黑色

for ($y = $biHeight - 1; $y >= 0; --$y) {
$byte = 0;
for (
$x = 0; $x < $biWidth; ++$x) {
$rgb = imagecolorsforindex($image, imagecolorat($image, $x, $y));
$value = (0.299 * $rgb['red'] + 0.587 * $rgb['green'] + 0.114 * $rgb['blue']) / 0xff;
$color = (int)($value > $threshold);
$byte = ($byte << 1) | $color;
if (
$x % 8 === 7) {
fwrite($to, pack('C', $byte));
$byte = 0;
}
}
if (
$x % 8) {
fwrite($to, pack('C', $byte << (8 - $x % 8)));
}
if (
$x % 32) {
fwrite($to, str_repeat("\x00", (int)((32 - $x % 32) / 8)));
}
}

return
true;
}
?>
ph_corp at yahoo dot fr
16 年前
<?php

/**
HSL/RGB 颜色转换函数
对许多应用程序非常有用
**/

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 );
}

?>
To Top