PHP Conference Japan 2024

imagejpeg

(PHP 4, PHP 5, PHP 7, PHP 8)

imagejpeg将图像输出到浏览器或文件

描述

imagejpeg(GdImage $image, 资源|字符串| $file = null, 整数 $quality = -1): 布尔值

imagejpeg() 从给定的 image 创建一个JPEG文件。

参数

image

一个GdImage 对象,由图像创建函数(例如 imagecreatetruecolor())返回。

file

保存文件的路径或打开的流资源(此函数返回后会自动关闭)。如果未设置或为 null,则会直接输出原始图像流。

quality

quality 是可选的,范围从 0(最差质量,文件较小)到 100(最佳质量,文件最大)。默认值(-1)使用默认的IJG质量值(约为 75)。

返回值

成功时返回 true,失败时返回 false

警告

但是,如果libgd未能输出图像,此函数将返回 true

错误/异常

如果 quality 无效,则抛出 ValueError

变更日志

版本 描述
8.4.0 现在如果 quality 无效,则会抛出 ValueError
8.0.0 image 现在期望一个 GdImage 实例;以前,期望一个有效的 gd 资源

示例

示例 #1 将JPEG图像输出到浏览器

<?php
// 创建一个空白图像并添加一些文本
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color);

// 设置内容类型头 - 在这种情况下为 image/jpeg
header('Content-Type: image/jpeg');

// 输出图像
imagejpeg($im);

// 释放内存
imagedestroy($im);
?>

上面的例子将输出类似于

Output of example : Outputting a JPEG image

示例 #2 将JPEG图像保存到文件

<?php
// 创建一个空白图像并添加一些文本
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color);

// 将图像保存为 'simpletext.jpg'
imagejpeg($im, 'simpletext.jpg');

// 释放内存
imagedestroy($im);
?>

示例 #3 将图像以 75% 的质量输出到浏览器

<?php
// 创建一个空白图像并添加一些文本
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color);

// 设置内容类型头 - 在这种情况下为 image/jpeg
header('Content-Type: image/jpeg');

// 使用 NULL 跳过文件参数,然后将质量设置为 75%
imagejpeg($im, NULL, 75);

// 释放内存
imagedestroy($im);
?>

注释

注意:

如果要输出渐进式JPEG,需要使用 imageinterlace() 打开隔行扫描。

参见

添加注释

用户贡献的注释 34 条注释

Ray.Paseur 有时使用 Gmail
14 年前
如果给出字符串 $filename 且它存在,它将被覆盖。
francesco@essensys
15 年前
我在网上找不到这样的例子,所以我把一些片段组合在一起……希望这能为其他人节省时间!

这是一个完整的解决方案,用于从文件系统读取任何图像(gif jpg png),将其缩放至最大宽度/高度,并将缩放后的图像保存到 BLOB 字段,同时保留原始图像类型。相当棘手……

<?php

function scaleImageFileToBlob($file) {

$source_pic = $file;
$max_width = 200;
$max_height = 200;

list(
$width, $height, $image_type) = getimagesize($file);

switch (
$image_type)
{
case
1: $src = imagecreatefromgif($file); break;
case
2: $src = imagecreatefromjpeg($file); break;
case
3: $src = imagecreatefrompng($file); break;
default: return
''; break;
}

$x_ratio = $max_width / $width;
$y_ratio = $max_height / $height;

if( (
$width <= $max_width) && ($height <= $max_height) ){
$tn_width = $width;
$tn_height = $height;
}elseif ((
$x_ratio * $height) < $max_height){
$tn_height = ceil($x_ratio * $height);
$tn_width = $max_width;
}else{
$tn_width = ceil($y_ratio * $width);
$tn_height = $max_height;
}

$tmp = imagecreatetruecolor($tn_width,$tn_height);

/* 检查此图像是 PNG 还是 GIF,然后设置是否透明 */
if(($image_type == 1) OR ($image_type==3))
{
imagealphablending($tmp, false);
imagesavealpha($tmp,true);
$transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127);
imagefilledrectangle($tmp, 0, 0, $tn_width, $tn_height, $transparent);
}
imagecopyresampled($tmp,$src,0,0,0,0,$tn_width, $tn_height,$width,$height);

/*
* imageXXX() 只有两个选项,保存为文件或发送到浏览器。
* 它不提供操作最终 GIF/JPG/PNG 文件流的机会
* 所以我启动输出缓冲,使用 imageXXX() 将数据流输出到浏览器,
* 获取流的内容,并使用 clean 静默丢弃缓冲的内容。
*/
ob_start();

switch (
$image_type)
{
case
1: imagegif($tmp); break;
case
2: imagejpeg($tmp, NULL, 100); break; // 最佳质量
case 3: imagepng($tmp, NULL, 0); break; // 无压缩
default: echo ''; break;
}

$final_image = ob_get_contents();

ob_end_clean();

return
$final_image;
}

?>

因此,假设您有一个用户可以上传图像的表单,并且您必须对其进行缩放并将其保存到数据库中。

<?php

[..] // 用户点击了提交按钮……

// 检查用户是否输入了图像
if ($_FILES['imagefile']['name'] != '') {
$image = scaleImageFileToBlob($_FILES['imagefile']['tmp_name']);

if (
$image == '') {
echo
'不支持的图像类型';
} else {
$image_type = $_FILES['imagefile']['type'];
$image = addslashes($image);

$query = "UPDATE yourtable SET image_type='$image_type', image='$image' WHERE ...";
$result = mysql_query($query);
if (
$result) {
echo
'图像已缩放并上传';
} else {
echo
'运行查询时出错';
}
}
}

?>
Bruno de Lima - bruno at tthedreamstone dot net
11 年前
[[编辑注:已删除 header() 调用,因为在输出内联图像数据时不需要它]]
一行代码,盲目搜索 3 小时后解决!

这里是

... ob_start();
imagejpeg( $img, NULL, 100 );
imagedestroy( $img );
$i = ob_get_clean();

echo "<img src='data:image/jpeg;base64," . base64_encode( $i )."'>"; // 救星代码!
Uplink
1 年前
如果您使用官方 Docker 镜像并使用 `docker-php-ext-install gd` 启用 gd,则默认情况下不会获得 JPEG 支持。

如果这是您的情况,并且您收到“Call to undefined function imagejpeg()”错误,则需要在 docker-php-ext-install 之前执行此操作

docker-php-ext-configure gd --with-jpeg

您还需要安装 libjpeg-dev 才能使其正常工作。
your [dot] sheepy [at] gmail [dot] com
18 年前
关于 Carl Gieringer 的评论,可以使用 UTF-8 格式的 PHP 文件。只需确保编辑器不输出 BOM,因为 BOM 在 UTF-8 中是不必要的。

除了微软的任何编辑器之外,大多数支持 UTF-8 的程序员编辑器都允许您禁止 BOM。
stefan at colulus dot com
16 年前
我编写了一个脚本,允许将字母数字数据放置在图像上。HTML 功能是 img src,PHP 功能是 imagettftext。这段简单的代码将在图像上从 1 增加到 3。

代码

<?php
//ImageCall.php -- 此脚本将调用一个脚本以生成图像。
for($next = 1;$next < 4; $next++){
print
"Image $next:<br>";
print
"<img src = 'Image.php?\$text=$next'>";
print
"<br><br>";
}
?>

<?php
//Image.php -- 此脚本创建一个正方形图像并在其上放置文本。

// 图像大小和颜色
$im = ImageCreate(77,77);
$color1 = ImageColorAllocate($im,0x66,0xCC,0x00);
$color2 = ImageColorAllocate($im,0x33,0x66,0x00);
$color3 = ImageColorAllocate($im,0x00,0x99,0x00);
$color4 = ImageColorAllocate($im,0x3D,0x3D,0x3D);

// 图像创建
ImageFilledRectangle($im,1,1,76,76,$color1);
ImageFilledpolygon($im, array (76,1,1,76,76,76),3,$color2);
ImageFilledRectangle($im,5,5,72,72,$color3);

//确定图像的数字中心
$size = ImageTTFBBox(45,0,'impact',$_GET['$text']);
$X = (77 - (abs($size[2]- $size[0])))/2;
$Y = ((77 - (abs($size[5] - $size[3])))/2 + (abs($size[5] - $size[3])));

//将数字信息放置在图像上
ImageTTFText($im,45,0,($X-1),$Y,$color4,'impact',$_GET['$text']);

//将完成的图像返回给调用脚本
Header('Content-Type: image/png');
Imagejpeg($im);

?>
Bram Van Dam
19年前
如果您希望将jpg数据捕获到变量中,而不是将其输出或保存到文件中(也许是为了将其放入数据库),您可能需要考虑使用输出缓冲。类似这样的代码应该可以工作

<?php
ob_start
(); // 开始一个新的输出缓冲区
imagejpeg( $newimage, NULL, 100 );
$ImageData = ob_get_contents();
ob_end_clean; // 停止此输出缓冲区
?>
viciousVelo
15 年前
对于那些收到“权限被拒绝”或“无法访问”消息的人:这看起来像是您对该文件夹的写入权限存在问题。无论您使用的是Windows服务器还是Linux服务器,请确保正确的用户具有对正确文件夹的写入权限。
Darren Kulp ( kulp at thekulp dot com )
18 年前
关于chris.calo的代码

// 下面的代码块检索源文件。它假设文件名扩展名与文件的格式匹配。
if ( strpos($source_file,".gif") ) { $img_source = imagecreatefromgif($source_file); }
if ( (strpos($source_file,".jpg")) || (strpos($source_file,".jpeg")) )
...等等。

它假设的条件更多,即文件名中*任何地方*都不包含字符串“.gif”、“.jpg”、“.jpeg”、“.bmp”或“.png”。一些具有特殊文件名的有效文件可能会破坏此功能;例如,名为“used.to.be.a.png.file.gif”的文件将导致此脚本尝试将文件加载为PNG。显然,这种情况很少见,但可以通过使用“else if”(使用更少的CPU时间)或检查扩展名是否紧挨字符串结尾或两者兼而有之来轻松避免此问题。

也就是说,如果PHP没有使用不同的函数来对不同的图像格式执行相同操作而弄乱命名空间,那么整个问题都可以避免。真糟糕。
Elliott Brueggeman
17年前
我使用imagejpeg()函数的图像质量参数创建jpeg时进行了一个实验。我发现考虑到文件大小的最佳图像质量为80 - 非常接近默认值75。

超过80只会导致文件大小不必要地增加,而图像质量却没有多大提高。

结果和示例图片:http://www.ebrueggeman.com/article_php_image_optimization.php
dklein at gmx dot de
22年前
看起来在脚本中使用imageJPEG()函数时,JPEG文件中任何指定的解析度设置都会丢失。
我有一个高分辨率的JPEG,我用imagestringup()向其中添加了文本,以便我的客户可以打印电子邮件中的JPEG作为填写好的表格,但是打印Photoshop中的两个图形显示,创建的任何JPEG都被下采样到72 dpi,而宽度和高度保持不变。
(72 dpi是标准的网络分辨率)
没什么好奇怪的,但也许如果您读到这篇文章,您就不需要挠头了 :)
flying man
5年前
零字节文件结果 - 原因如下!

请认真对待此函数上的注意事项。如果gdlib未能输出,它仍然返回true!我个人认为这是一个错误。

如果您的图像超过其最大的未公开尺寸65500像素,GD将无法输出。

您将得到一个零字节文件
tomas at dundacek dot cz
15 年前
在安全模式下尝试上传和调整图像大小时,我遇到了权限被拒绝的问题。这导致我无法创建我想用imagejpeg()重新采样图像的新文件,也无法在之后使用touch()和imagejpeg()创建。

这是我的解决方案,我没有测试,但这是可能的,它可能会占用一些内存

<?php
function resize($image, $target_file) {
// $image 为上传的图像
list($width, $height) = getimagesize($image['tmp_name']);

// 设置图像的新尺寸
$ratio = $width/$height;
$new_height = 500;
$new_width = $new_height * $ratio;

// 将文件移动到新位置
move_uploaded_file($image['tmp_name'], $target_file);

// 重新采样图像
$new_image = imagecreatetruecolor($new_width, $new_height);
$old_image = imagecreatefromjpeg($target_file);
imagecopyresampled($new_image,$old_image,0,0,0,0,$new_width, $new_height, $width, $height);

// 输出
imagejpeg($new_image, $target_file, 100);
}

?>

如你所见,此函数将上传的文件移动到你想要保存重新采样图像的位置(`move_uploaded_file`不受`safe_mode`限制),然后你可以重新采样图像,因为它已经通过移动创建了。

注意:你想要保存文件的目录必须设置权限为 0777。
[email protected]
16 年前
我来这里寻找类似于`getJPEGresolution`函数的东西,但是注意到上一篇文章中指出的缺点。因此,在参考了网上其他一些代码示例后,我整理了以下函数,它应该始终能正确返回正确的值。(但请记住,你仍然需要安装EXIF扩展才能使你的PHP实例正常工作!)

<?php

function jpeg_dpi($filename)
{
if (
exif_imagetype($filename) != IMAGETYPE_JPEG ) {
return
false;
} else {
$exif = exif_read_data($filename, 'IFD0');
}

$x = $y = 0;
if ( isset(
$exif['XResolution']) && isset($exif['YResolution']) ) {
$x = intval(preg_replace('@^(\\d+)/(\\d+)$@e', '$1/$2', $exif['XResolution']));
$y = intval(preg_replace('@^(\\d+)/(\\d+)$@e', '$1/$2', $exif['YResolution']));
}

if ( !
$x && !$y && $fp = fopen($filename, 'r') ) {
$string = fread($fp, 20);
fclose($fp);

$data = bin2hex(substr($string, 14, 4));
$x = hexdec(substr($data, 0, 4));
$y = hexdec(substr($data, 4, 4));
}

if (
$x || $y ) {
return array(
$x, $y);
}

return
false;
}

?>

此函数在可以确定x分辨率和y分辨率时返回包含它们的数组,否则返回FALSE。
[email protected]
16 年前
关于下面的代码,它只抓取JFIF模式下DPI信息的最后一个字节。我想知道为什么我的300 DPI文件被报告为44。当然,300 - 256 = 44。
[email protected]
16 年前
对于那些希望在不使用GD或ImageMagic的情况下获取JPEG图像分辨率的人……我编写了这个简单的函数。

太糟糕了,GD没有这个非常简单的函数供我们使用……

<?php
function getJPEGresolution($filename){
$outRez=array();
// 读取文件
ob_start(); // 开始一个新的输出缓冲区
$image = file_get_contents($filename);

// 从JPG头中获取DPI信息
$outRez["xDPI"] = ord($image[15]);
$outRez["yDPI"] = ord($image[17]);
ob_end_clean(); // 停止此输出缓冲区

//xDPI和yDPI的值应该相等……但我们还是都输出了……
return($outRez);
}
//end function getJPEGresolution
?>
匿名
16 年前
这是一个调整图像大小并保持纵横比的函数。它将调整jpeg、gif或png的大小,并且可以很容易地修改以添加bmp。name字段是文件的目标位置,不包括文件扩展名。

<?php
//名称:文件名(去除类型)
function createImage($uploadedfile,$newWidth,$name)
{
// 获取上传图片的原始大小
if(!$info=getimagesize($uploadedfile))
return
false;

switch (
$info['mime'])
{
case
'image/jpeg':
$src = imagecreatefromjpeg($uploadedfile);
break;
case
'image/gif':
$src = imagecreatefromgif($uploadedfile);
break;
case
'image/png':
$src = imagecreatefrompng($uploadedfile);
break;
default:
return
false;
}

//修改文件名以添加文件类型
$mime=split("image/",$info['mime']);
$filename=$name.".".$mime[1];

$size = getimagesize($uploadedfile);
$newHeight=aspect_ratio($size[0],$newWidth,$size[1]);

$tmp=imagecreatetruecolor($newWidth,$newHeight);

// 这行代码实际上执行图像大小调整,将图像从原始图像复制到 $tmp 图像
imagecopyresampled($tmp,$src,0,0,0,0,$newWidth,$newHeight,$info[0], $info[1]);

switch (
$info['mime'])
{
case
'image/jpeg':
imagejpeg($tmp,$filename,100); //100 是质量设置,取值范围为 0-100。
break;
case
'image/gif':
imagegif($tmp,$filename,100); //100 是质量设置,取值范围为 0-100。
break;
case
'image/png':
imagepng($tmp,$filename); //100 是质量设置,取值范围为 0-100。
break;
}

imagedestroy($src);
imagedestroy($tmp); // 注意:请求完成后,PHP 将清理它创建的临时文件。
return true;
}

if(!
createImage($uploadedfile,100, "uploaded_images/imgname"))
{
echo
"error";
}
?>
jongliertreff.de 的 webmaster
18 年前
这是一个动态创建缩略图的脚本。
当我为我的页面编写图片查看器脚本时,所有的图片都只保留了全尺寸和高质量,因为我希望访客能够下载这些图片。
但是,超过 4MP 的图片尺寸对于网站来说太大了,所以我创建了动态生成的缩略图和较小的图片。但我发现,这个脚本需要大量的 RAM,尤其是在缩略图概述中,当我需要同时动态创建超过 50 个缩略图时。

因此,我修改了我的图像创建器和查看器,使其能够存储已创建的图像。所以只有第一个访问者需要等待(通常是我来控制上传和更新),其他所有访问者都能获得存储的图像,速度快得多。

创建不同的文件夹。我有一个名为“imagesdb”的主文件夹和三个子文件夹:full(全尺寸图像)、show(图片查看器图像)和 thumb(概述中的缩略图)。

例如,将脚本存储为 image.php 并像这样链接它

<?PHP
$image_name
= "foo.jpg";
$style = "show";
// 我使用了文件夹名称,更简单。对于
//缩略图,将“show”替换为“thumb”。
$image_name = "imagesdb/$style/$image_name";
if(!
file_exists($image_name))
$image_name = "image.php?image_name=$image_name&style=$style";
// 只有在文件不存在时才调用动态创建文件
?>

现在是主脚本,存储在 image.php 文件中

<?PHP

$image_name
= $_GET['image_name'];
$style = $_GET['style'];

// 现在为不同的样式设置最大尺寸。
// 你可以设置额外的样式,但请记住
// 创建相应的子文件夹。

switch($style) {
case
"show":
$max_size = 800;
break;
case
"thumb":
$max_size = 125;
}

$dest_file = "imagesdb/$style/$image_name";
// 设置输出文件
$image_file = "imagesdb/full/$image_name";
// 设置源文件
$size = getimagesize($image_file);
// 获取原始尺寸

if($size[0] > $size[1]) {
$divisor = $size[0] / $max_size;
}
else {
$divisor = $size[1] / $max_size;
}
// 为始终获得相同尺寸的图片,这在图片查看器中通常需要,查看哪个更大:
// 宽度或高度

$new_width = $size[0] / $divisor;
$new_height = $size[1] / $divisor;
// 设置新的尺寸

settype($new_width, 'integer');
settype($new_height, 'integer');
// 尺寸应为整数

$image_big = imagecreatefromjpeg($image_file);
// 加载原始图像
$image_small = imagecreatetruecolor($new_width, $new_height);
// 创建新图像
imagecopyresampled($image_small, $image_big, 0,0, 0,0, $new_width,$new_height, $size[0],$size[1]);
// imageresampled 将产生比 imageresized 更高的质量
// 比 imageresized
imagedestroy($image_big);
// 原始数据不再使用

header("Content-type: image/jpeg");

if(
$style=="show" || $style=="thumb") {
if(!
file_exists($dest_file))
imagejpeg($image_small, $dest_file, 100);
}
// 如果你设置了额外的尺寸,也将其添加到
// if 语句中。
// 如果有人直接在浏览器中使用已存在的图像名称调用 image.php,则
// 它们不会被覆盖

imagejpeg($image_small, '', 100);
imagedestroy($image_small);
// 最后将图像发送到浏览器并销毁不再
// 需要的数据。

?>

由于这个网站过去多次帮助我创建了这个脚本,我希望这个脚本能够帮助其他人节省时间,从而开发出比始终动态创建脚本更高效的解决方案。
stuart at purpletoucan dot com
18 年前
感谢 Chris dot Calo 提供的缩略图代码片段。文件类型问题可以通过使用 getimagesize 从文件中获取类型轻松解决,你也可以在这个阶段处理不支持的类型。

list($img_width,$img_height, $type) = getimagesize($source_file); // 获取原始尺寸
if ($type != 1 && $type != 2 && $type != 3 && $type != 15) { die("你的文件格式不受支持"); }

…然后稍后再次检查类型以正确打开图像

if ( $type == 1 ) { $img_source = imagecreatefromgif($source_file); }
else if ( $type == 2 ) { $img_source = imagecreatefromjpeg($source_file); }
else if ( $type == 3 ) { $img_source = imagecreatefrompng($source_file); }
else if ( $type == 15 ) { $img_source = imagecreatefromwbmp($source_file); }
匿名用户
18 年前
你好

我在安全模式下遇到了类似的问题。我的解决方案是

在 imagejpeg() 等之前
写入
ini_set(safe_mode,Off);
所有操作之后
ini_set(safe_mode,On);

很奇怪,但它有效
感谢大家
moron at industrial dot org
19年前
请注意,针对此函数当前损坏的安全模式行为,已提交了一个错误报告。

http://bugs.php.net/?id=35060

根据已回复的 PHP 工作人员的说法,文档是错误的(我不同意,但我也不是他们的员工)。

解决方法是在使用 imagejpeg() 之前,先使用 touch()(或任何其他可以执行此操作的文件系统函数)来创建文件。
mbailey [at] aethon [dt] co [dt] uk
19年前
>>Bram Van Dam 的

下面的注释缺少 ob_end_clean 调用的 "()"。

ob_end_clean; // 停止此输出缓冲区

应改为

ob_end_clean(); // 停止此输出缓冲区

然后,你可以使用它来添加内容长度标头(例如,Flash 需要预先指定内容长度才能创建加载程序)。

例如:

...

ob_start(); // 开始新的输出缓冲区
imagejpeg( $newimage, "", 90 );
$ImageData = ob_get_contents();
$ImageDataLength = ob_get_length();
ob_end_clean(); // 停止此输出缓冲区

header("Content-type: image/jpeg") ;
header("Content-Length: ".$ImageDataLength);
echo $ImageData;

...
匿名用户
20年前
向浏览器输出图像时的一个警告……

确保你正在编辑的文件以及任何包含的文件中,<?php ?> 标记周围没有多余的空格。

我开始认为 GD 或其他东西有错误,我检查了我正在处理的文件,但我忘记了包含的文件……

浪费了几个小时……
ghokanso at cs dot ndsu dot edu
19年前
使用 imagepng 或 imagejpeg 显示图像时,你可能需要在 imagepng 和 imagejpeg 函数之前调用 "header("Content-type: image/jpeg")"
似乎某些服务器/浏览器会去除默认标头,因此图像不会呈现,而显示为原始数据。
(例如 Firefox 1.02+ 和 OSX Safari)
irishcybernerd at email dot com
21年前
与其使用上面描述的临时文件,你可以缓冲输出流。其他人向我展示了这个,它似乎工作得非常好。

// 开始缓冲输出流
ob_start();

// 将图像作为文件输出到输出流
Imagejpeg($im);

// 读取输出缓冲区
$buffer = ob_get_contents();

// 清除缓冲区
ob_end_clean();

// 随意使用 $buffer…
Michaelsoft
17年前
[编辑注:根据 roberto at ilpiola.it 的说明进行了修正]

我找不到使用 GD 库更改 JPG 文件的 DPI 信息的任何信息。由于更改此项不会调整实际图像的大小或比例,它只是一个标头设置。
以下代码段将把你的 $image 保存到 $file 并将 DPI 设置为 150。

<?php

imagejpeg
($image, $file, 75);

// 更改DPI
$dpi_x = 150;
$dpi_y = 150;

// 读取文件
$size = filesize($file);
$image = file_get_contents($file);

// 更新JPG头部中的DPI信息
$image[13] = chr(1);
$image[14] = chr(floor($dpi_x/256));
$image[15] = chr( $dpi_x%256);
$image[16] = chr(floor($dpi_y/256));
$image[17] = chr( $dpi_y%256);

// 写入新的JPG
$f = fopen($file, 'w');
fwrite($f, $msg, $size);
fclose($f);

?>

附注:尚未完全测试,但我的图片可以使用……
Kokesh
20年前
这是一个简单但功能强大的脚本,用于动态创建缩略图。
您可以将此脚本
直接包含到网页中 - 只需将其放入<img src= 标签中。
宽度为150像素。
此调整大小脚本会保持纵横比。
以下是脚本
<?php
// 使用方法:resize.php?pic=imageurl&width=width_in_pixels
// [email protected] 2004
header("Content-type: image/jpeg");
$im = imagecreatefromjpeg($pic);
$orange = imagecolorallocate($im, 220, 210, 60);
$px = (imagesx($im) - 7.5 * strlen($string)) / 2;

$old_x=imageSX($im);
$old_y=imageSY($im);

$new_w=(int)($width);
if ((
$new_w<=0) or ($new_w>$old_x)) {
$new_w=$old_x;
}

$new_h=($old_x*($new_w/$old_x));

if (
$old_x > $old_y) {
$thumb_w=$new_w;
$thumb_h=$old_y*($new_h/$old_x);

}
if (
$old_x < $old_y) {
$thumb_w=$old_x*($new_w/$old_y);
$thumb_h=$new_h;
}
if (
$old_x == $old_y) {
$thumb_w=$new_w;
$thumb_h=$new_h;
}
$thumb=ImageCreateTrueColor($thumb_w,$thumb_h);
imagecopyresized($thumb,$im,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y);

imagejpeg($thumb,"",90);
imagedestroy($thumb);
?>
gzink at zinkconsulting dot com
20年前
不要忘记JPEG压缩会有伪影!而且并非所有伪影都很明显。PHP的JPEG压缩相当不错,但它似乎通常会

-整体使图像变亮,亮度相当可观(以前从未见过这种情况,但这会让平面设计师抓狂,您可能需要在压缩图像之前先将其调暗)
-降低饱和度,尤其是在图像中许多不同颜色的点彼此相邻几个像素的情况下(这是JPEG的一个已记录的功能)
-严重影响蓝色,这在所有JPEG中都很常见,但在某些情况下,蓝色和黑色或其他细节丰富的蓝色部分会非常烦人

如果上述任何情况影响到您,或者您的图像不太像照片,您可能需要考虑使用imagepng()并输出PNG图像而不是JPEG图像。有时我会让一个算法比较JPEG和PNG图像,并将较小的版本发送给用户。

此外,使用imagepng()时,95% 的情况下都应该在它之前使用imageinterlace()。交错JPEG会渐进式加载,图像加载时的质量会不断提高,因此在较慢连接上的用户可以看到低质量的完整图像。所有这些都不会影响文件大小(实际上,有时文件大小会更小!)或最终质量。

希望这对一些人有所帮助。如果没有大量的尝试,这些都不是很明显。

-Galen
http://zinkconsulting.com/
bernytech at gmail dot com
13年前
不要像我一样,绞尽脑汁几个小时试图弄清楚为什么我的xxx.php文件输出https://127.0.0.1/xxx.php作为单行响应。

为什么?

最有可能的是,您:

1. 在PHP标签之前或之后有空格
2. 需要设置header('Content-type: image/jpeg');
3. 如果你有需要的文件……确保没有任何输出……没有测试打印语句,因为页面需要图像信息
4. 代码中存在错误

在我的情况下,是4. 函数调用base64decode不起作用是有原因的……

实际上是:base64_decode()

顺便说一句,验证以base64编码的图像的其他方法是使用以下标签

echo '<img src="data:image/jpeg;base64,'.$row['IMAGE'].'" alt="photo">';

我正在从MySQL数据库中提取以base64编码的blob数据,并试图在一个页面上渲染它

希望这对某人有所帮助。
chris dot calo at gmail dot com
18 年前
感谢Stuart和Darren对create_thumbnail函数的更正。关于该函数的另一个说明:imagecreatefromwbmp的使用不正确。WBMP是无线位图,而不是Windows位图(感谢clambert at whitecrown),因此目前的缩略图例程将无法处理Windows位图。请参阅http://us2.php.net/manual/en/function.imagecreatefromwbmp.php中的说明,了解有关处理Windows位图的技巧。
Kenneth Keiter
18 年前
所以……在与这个复杂的函数搏斗了几个小时后,我发现它既没有保留用于创建图像的资源,imagepng()或imagegif()也没有。我的意思是,您不能对同一个资源运行两次imagejpeg()、imagepng()或imagegif()调用。另一个可能未记录的怪癖……:-(
wojteksw at go2 dot pl
19年前
我修改了 Kokesh 脚本中的一行代码
2004年6月25日06:42 上述代码修改后,现在可以生成更高质量的缩略图。
您需要将 `imagecopyresized()` 函数更改为 `imagecopyresampled()` 函数。
John Luetke <johnl1479 gmail com>
19年前
将手册中的示例改写成以下创建缩略图图像的函数:

function thumbnail_jpeg ($original, $thumbnail, $width, $height, $quality) {
list($width_orig, $height_orig) = getimagesize($original);
if ($width && ($width_orig < $height_orig)) {
$width = ($height / $height_orig) * $width_orig;
}
} else {
$height = ($width / $width_orig) * $height_orig;
}
$image_p = imagecreatetruecolor($width, $height);
$image = imagecreatefromjpeg($originial);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
imagejpeg($image_p, $thumbnail, $quality);
return;
}
Pedja (pedja at supurovic dot net)
17年前
这是一个创建源 JPEG 文件缩略图的示例函数。缩略图将为正方形(宽度和高度相同),并裁剪原始图像以适应。

参数

$p_thumb_file - 缩略图保存到的文件名(包括路径)

$p_photo_file - 要创建缩略图的源 JPEG 文件名(包括路径)

$p_max_size - 缩略图图像的像素宽度和高度(两者相同)

$p_quality - jpeg 缩略图的质量

<?php

function photoCreateCropThumb ($p_thumb_file, $p_photo_file, $p_max_size, $p_quality = 75) {

$pic = @imagecreatefromjpeg($p_photo_file);

if (
$pic) {
$thumb = @imagecreatetruecolor ($p_max_size, $p_max_size) or die ("无法创建图像!");
$width = imagesx($pic);
$height = imagesy($pic);
if (
$width < $height) {
$twidth = $p_max_size;
$theight = $twidth * $height / $width;
imagecopyresized($thumb, $pic, 0, 0, 0, ($height/2)-($width/2), $twidth, $theight, $width, $height);
} else {
$theight = $p_max_size;
$twidth = $theight * $width / $height;
imagecopyresized($thumb, $pic, 0, 0, ($width/2)-($height/2), 0, $twidth, $theight, $width, $height);
}

ImageJPEG ($thumb, $p_thumb_file, $p_quality);
}

}

?>
To Top