2024 年 PHP 日本大会

GD 和图像函数

目录

添加备注

用户贡献的备注 8 条备注

chuckstudios at gmail dot com
16 年前
我编写了一个简单的函数,用于将图像资源转换为 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
19 年前
下面提供的图像锐化函数(由 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 所需的)。
[email protected]
13年前
我知道这对于其他人来说可能显得有些多余,但我曾经遇到过一种情况,需要对图像进行*强烈*模糊处理,而没有安装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
21年前
我编写了一个图像函数在线概述,大家可能会觉得有用。除了对各种函数类别和代码示例的总体概述外,我还包含了许多函数的交互式示例,允许查看者试验参数,并实时查看结果。演示文稿位于纽约PHP
http://www.nyphp.org/content/presentations/GDintro/
delabahan at gmail dot com
8年前
这是一个获取高分辨率图像的示例。

<?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
'错误:请求的文件不是可接受的类型:' .$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
8年前
这是一个黑白图像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;
}
?>
To Top