PHP Conference Japan 2024

imagecopyresized

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

imagecopyresized复制并调整图像的一部分大小

描述

imagecopyresized(
    GdImage $dst_image,
    GdImage $src_image,
    int $dst_x,
    int $dst_y,
    int $src_x,
    int $src_y,
    int $dst_width,
    int $dst_height,
    int $src_width,
    int $src_height
): bool

imagecopyresized() 将图像的一部分复制到另一幅图像。 dst_image 是目标图像,src_image 是源图像标识符。

换句话说,imagecopyresized() 将从 src_image 中宽度为 src_width,高度为 src_height 的矩形区域(位于 (src_x,src_y) 位置)复制到 dst_image 中宽度为 dst_width,高度为 dst_height 的矩形区域(位于 (dst_x,dst_y) 位置)。

如果源和目标坐标以及宽度和高度不同,则会执行相应的图像片段拉伸或收缩。坐标指左上角。此函数可用于复制同一图像内的区域(如果 dst_imagesrc_image 相同),但如果区域重叠,则结果不可预测。

参数

dst_image

目标图像资源。

src_image

源图像资源。

dst_x

目标点的 x 坐标。

dst_y

目标点的 y 坐标。

src_x

源点的 x 坐标。

src_y

源点的 y 坐标。

dst_width

目标宽度。

dst_height

目标高度。

src_width

源宽度。

src_height

源高度。

返回值

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

变更日志

版本 描述
8.0.0 dst_imagesrc_image 现在需要 GdImage 实例;以前需要 resource

范例

示例 #1 调整图像大小

此示例将以一半大小显示图像。

<?php
// 文件和新大小
$filename = 'test.jpg';
$percent = 0.5;

// 内容类型
header('Content-Type: image/jpeg');

// 获取新大小
list($width, $height) = getimagesize($filename);
$newwidth = $width * $percent;
$newheight = $height * $percent;

// 加载
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);

// 调整大小
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

// 输出
imagejpeg($thumb);
?>

以上示例将输出类似于以下内容

Output of example : Resizing an image

图像将以一半大小输出,但使用 imagecopyresampled() 可以获得更好的质量。

注释

注意:

由于调色板图像限制 (255+1 种颜色),存在问题。重新采样或过滤图像通常需要超过 255 种颜色,因此使用一种近似方法来计算新的重新采样像素及其颜色。对于调色板图像,我们尝试分配一种新颜色,如果失败,则选择最接近的(理论上)计算颜色。这并不总是最接近的视觉颜色。这可能会产生奇怪的结果,例如空白(或视觉上空白)图像。要跳过此问题,请使用真彩色图像作为目标图像,例如由 imagecreatetruecolor() 创建的图像。

参见

添加注释

用户贡献注释 33 条注释

robby at planetargon dot com
19 年前
下面的大多数示例都没有正确保持比例。它们继续使用 if/else 来处理高度/宽度……并忘记您可能同时具有最大高度和最大宽度,而不是一个或另一个。

/**
* 调整图像大小并保持比例
* @author Allison Beckwith <[email protected]>
* @param string $filename
* @param integer $max_width
* @param integer $max_height
* @return image
*/
function resizeImage($filename, $max_width, $max_height)
{
list($orig_width, $orig_height) = getimagesize($filename);

$width = $orig_width;
$height = $orig_height;

# 高度更高
if ($height > $max_height) {
$width = ($max_height / $height) * $width;
$height = $max_height;
}

# 宽度更宽
if ($width > $max_width) {
$height = ($max_width / $width) * $height;
$width = $max_width;
}

$image_p = imagecreatetruecolor($width, $height);

$image = imagecreatefromjpeg($filename);

imagecopyresampled($image_p, $image, 0, 0, 0, 0,
$width, $height, $orig_width, $orig_height);

return $image_p;
}
method studios的jesse
19 年前
imagecopyresized() 函数不进行任何重采样,因此速度极快。如果质量很重要,请使用 imagecopyresampled()。
vladislav dot net的email
13年前
我之前没有在这里找到任何能够正确处理 GIF 和 PNG 透明图像的脚本,所以我提供我的脚本。
这是“image.php”脚本的代码,用于生成任何类型(JPEG、GIF、PNG)图像的调整大小或原始大小的图像,并考虑 GIF 和 PNG 的透明度。
以下脚本可用于 HTML 标签 IMG(显示数据库中标记为 ID 等于 1 并调整大小为最大 100 像素的图像),如下所示
<img src="image.php?id=1&size=100" />。

<?php
/* *************************
* A. Vladislav I. 编写的脚本
* ************************* */
$id = $_GET['id'];
$size = $_GET['size'];
if(!empty(
$id))
{
/* 你可以从任何你想要的地方获取源图像路径:当前目录、数据库等。
我使用 $_GET['id'] 为脚本提供数据库中图像的 ID,其中存储了图像的真实名称。
我稍后考虑 $f 变量负责存储文件名,$type 变量负责存储图像的 MIME 类型。 你可以使用 GetImageSize() 函数来发现 MIME 类型。
所以不要忘记设置 */
$f = /*...*/ ;
/* 和 */
$type = /*...*/ ;
/* ... */
}
$imgFunc = '';
switch(
$type)
{
case
'image/gif':
$img = ImageCreateFromGIF($f);
$imgFunc = 'ImageGIF';
$transparent_index = ImageColorTransparent($img);
if(
$transparent_index!=(-1)) $transparent_color = ImageColorsForIndex($img,$transparent_index);
break;
case
'image/jpeg':
$img = ImageCreateFromJPEG($f);
$imgFunc = 'ImageJPEG';
break;
case
'image/png':
$img = ImageCreateFromPNG($f);
ImageAlphaBlending($img,true);
ImageSaveAlpha($img,true);
$imgFunc = 'ImagePNG';
break;
default:
die(
"ERROR - 未找到图像");
break;
}
header("Content-Type: ".$type);
if(!empty(
$size))
{

list(
$w,$h) = GetImageSize($f);
if(
$w==0 or $h==0 ) die("ERROR - 图像大小为零");
$percent = $size / (($w>$h)?$w:$h);
if(
$percent>0 and $percent<1)
{
$nw = intval($w*$percent);
$nh = intval($h*$percent);
$img_resized = ImageCreateTrueColor($nw,$nh);
if(
$type=='image/png')
{
ImageAlphaBlending($img_resized,false);
ImageSaveAlpha($img_resized,true);
}
if(!empty(
$transparent_color))
{
$transparent_new = ImageColorAllocate($img_resized,$transparent_color['red'],$transparent_color['green'],$transparent_color['blue']);
$transparent_new_index = ImageColorTransparent($img_resized,$transparent_new);
ImageFill($img_resized, 0,0, $transparent_new_index);
}
if(
ImageCopyResized($img_resized,$img, 0,0,0,0, $nw,$nh, $w,$h ))
{
ImageDestroy($img);
$img = $img_resized;

}
}
}
$imgFunc($img);
ImageDestroy($img);
?>

附注:
此脚本可以写得更好(优化等),但我希望你能自己完成。
lab-9 dot com的development
19 年前
如果从数据库 Blob 读取图像数据并使用上述函数将图像调整大小为缩略图以大幅改善流量,则必须创建文件的临时副本,以便这些函数可以访问它们。

这是一个示例

// 遍历图像类型
$extension = "jpg";
if(mysql_result($query, 0, 'type') == "image/pjpeg")
{ $extension = "jpg"; } // 覆盖
else if(mysql_result($query, 0, 'type') == "image/gif")
{ $extension = "gif"; } // 覆盖

// 获取临时文件名
// 使用 microtime() 获取唯一文件名
// 如果你请求多个文件(例如,通过创建大量缩略图),服务器可能不够快,无法保存所有这些不同的文件,你将获得重复的副本,并且 resizepics() 将经常调整大小并输出相同的内容。

$filename = microtime()."_temp.".$extension;

// 打开
$tempfile = fopen($filename, "w+");

// 写入
fwrite($tempfile, mysql_result($query, 0, 'image'));

// 关闭
fclose($tempfile);

// 调整大小并输出内容
echo resizepics($filename, '100', '70');

// 删除临时文件
unlink($filename);

注意:此脚本必须放在发送正确标头信息到浏览器的文件中,否则你将看不到除一个大红叉以外的任何内容 :-)
ali dot com dot au的hodgman
18年前
使用此函数的用户应该注意,此函数在某些情况下可能会返回 false!我假设这是失败的指示。

这些注释中显示的示例代码均未考虑这一点,因此所有这些示例都包含可能导致程序崩溃的弱点,如果使用不当。

但是,文档中没有说明哪些情况会导致它失败,以及如果操作失败会发生什么副作用(如果它不是原子的),因此我们必须等到文档更新后才能在此函数中使用可靠的(防崩溃)代码。

[[我之前发布了此信息,但我的措辞是问题,因此编辑将其删除了]]
skurrilo dot de的skurrilo
24年前
如果你对调整大小的图像质量不满意,只需试用一下 ImageMagick。(https://imagemagick.org.cn) 这是一个用于转换和查看图像的命令行工具。
smwebdesigns dot com的smelban
19 年前
按比例调整图像大小,其中你指定最大宽度或最大高度。

<?php
header
('Content-type: image/jpeg');
// $myimage = resizeImage('filename', 'newwidthmax', 'newheightmax');
$myimage = resizeImage('test.jpg', '150', '120');
print
$myimage;

function
resizeImage($filename, $newwidth, $newheight){
list(
$width, $height) = getimagesize($filename);
if(
$width > $height && $newheight < $height){
$newheight = $height / ($width / $newwidth);
} else if (
$width < $height && $newwidth < $width) {
$newwidth = $width / ($height / $newheight);
} else {
$newwidth = $width;
$newheight = $height;
}
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
return
imagejpeg($thumb);
}
?>
[email protected]
19 年前
这段代码会在需要将图像(不拉伸)放入最大高度/宽度并非1:1比例的目标图像时(我的比例是4:3)调整图像大小。

<?
// 比例
$image_ratio = $width / $height; // 实际图像的比例
$destination_ratio = $max_width / $max_height; // 目标占位符的比例

// 图像较高
if($image_ratio < $destination_ratio)
{
// 太高了
if($height > $max_height)
{
$height = $max_height;
$width = ceil($height / $image_ratio);
}
}
// 图像较宽/比例均衡且太宽了
else if ($width > $max_width)
{
$width = $max_width;
$height = ceil($width / $image_ratio);
}
?>
[email protected]
19 年前
我一直在搜索一个不会动态调整大小,而是将调整大小后的文件复制到其他位置的脚本,经过长时间的搜索后,我完成了这个函数。我希望它对某些人有用。
(这不是原始代码,我从某处获取并进行了一些修改 :))
<?php
function resize($cur_dir, $cur_file, $newwidth, $output_dir)
{
$dir_name = $cur_dir;
$olddir = getcwd();
$dir = opendir($dir_name);
$filename = $cur_file;
$format='';
if(
preg_match("/.jpg/i", "$filename"))
{
$format = 'image/jpeg';
}
if (
preg_match("/.gif/i", "$filename"))
{
$format = 'image/gif';
}
if(
preg_match("/.png/i", "$filename"))
{
$format = 'image/png';
}
if(
$format!='')
{
list(
$width, $height) = getimagesize($filename);
$newheight=$height*$newwidth/$width;
switch(
$format)
{
case
'image/jpeg':
$source = imagecreatefromjpeg($filename);
break;
case
'image/gif';
$source = imagecreatefromgif($filename);
break;
case
'image/png':
$source = imagecreatefrompng($filename);
break;
}
$thumb = imagecreatetruecolor($newwidth,$newheight);
imagealphablending($thumb, false);
$source = @imagecreatefromjpeg("$filename");
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
$filename="$output_dir/$filename";
@
imagejpeg($thumb, $filename);
}
}
?>
调用此函数,使用:
<?
resize("./input folder", "picture_file_name", "width", "./output folder");
?>
[email protected]
19 年前
我不久前编写了一个函数,可以从大型图片中创建缩略图。与本页上的其他说明不同,这段代码是一个函数,因此可以在同一个脚本中多次使用。该函数允许程序员设置最大高度和宽度,并按比例调整图片大小。
<?php
function saveThumbnail($saveToDir, $imagePath, $imageName, $max_x, $max_y) {
preg_match("'^(.*)\.(gif|jpe?g|png)$'i", $imageName, $ext);
switch (
strtolower($ext[2])) {
case
'jpg' :
case
'jpeg': $im = imagecreatefromjpeg ($imagePath);
break;
case
'gif' : $im = imagecreatefromgif ($imagePath);
break;
case
'png' : $im = imagecreatefrompng ($imagePath);
break;
default :
$stop = true;
break;
}

if (!isset(
$stop)) {
$x = imagesx($im);
$y = imagesy($im);

if ((
$max_x/$max_y) < ($x/$y)) {
$save = imagecreatetruecolor($x/($x/$max_x), $y/($x/$max_x));
}
else {
$save = imagecreatetruecolor($x/($y/$max_y), $y/($y/$max_y));
}
imagecopyresized($save, $im, 0, 0, 0, 0, imagesx($save), imagesy($save), $x, $y);

imagegif($save, "{$saveToDir}{$ext[1]}.gif");
imagedestroy($im);
imagedestroy($save);
}
}
?>

目前此函数仅支持jpg、gif和png文件,但这很容易更改。
这是一个易于使用和理解的函数,我希望它对某些人有用。
Halit Yesil,邮箱:halityesil@com
17年前
此类用于图像缩放或裁剪,
可在图像上添加您的版权文本和徽标。

完整类代码 => http://www.phpbuilder.com/snippet/download.php?type=snippet&id=2188
/**
* 作者:Halit YESIL
* 网站:www.halityesil.com, www.prografik.net, www.trteknik.net
* 邮箱:[email protected], [email protected], [email protected]
* 手机:+90.535 648 3504
* 创建时间:2007年3月21日
*
*
* 脚本:图像缩放和裁剪类。
* 使用此类,您可以添加版权文本和徽标到图像上
*
*
* $obj = new pg_image($arg);
*
*
* 变量信息
* [0] type => (POST | FILE) => 源文件发送类型 _FILES 或目录
* [1] file => ({如果 POST 数组文件 = $_FILES['yourfile']}|{如果 FILE 为 false}) => 源文件文件源
* [2] path => ({如果 FILE 为字符串 [ dirname/filename.extension ]}) => 源文件根路径
* [3] target => ({如果 FILE 为字符串 [ dirname/filename.extension ]}) => 目标文件根路径
* [4] width => (整数) => 目标文件宽度
* [5] height => (整数) => 目标文件高度
* [6] quality => (整数 1 - 100) => 目标文件质量 0-100 %
* [7] action => (crop | resize) => 目标操作 "resize" 或 "crop"
* [8] bordersize => (整数 0-5) => 目标边框大小
* [9] bordercolor => (十六进制颜色) => 目标边框颜色
* [10] bgcolor => (十六进制颜色) => 目标背景颜色
* [11] copytext => (字符串) => 版权内容文本
* [12] copycolor => (十六进制颜色) => 版权文本颜色
* [13] copyshadow => (十六进制颜色) => 版权文本阴影颜色
* [14] copybgcolor => (十六进制颜色) => 版权背景颜色
* [15] copybgshadow => (十六进制颜色) => 版权背景阴影颜色
* [16] copybordersize => (整数 0-5) => 版权边框大小 1-3
* [17] copybordercolor => (十六进制颜色) => 版权边框颜色
* [18] copyposition => (top | topright | topleft | center | left | right | bottom | bottomright | bottomleft) => 版权位置
* [19] logoposition => (top | topright | topleft | center | left | right | bottom | bottomright | bottomleft) => 徽标图像位置
* [20] logoimage => (字符串 [ dirname/filename.extension] 允许扩展名 (PNG | GIF | JPG)) => 徽标图像根路径 "PNG" 或 "GIF" 或 "JPG"
*
*
*
*
*/

<?php

$source
= ($_REQUEST['img'] != '')?$_REQUEST['img']:'braille3.jpg';
$arg =array( type =>'FILE',
file =>false,
path =>$source,
target =>'',
width =>150,
height =>50,
quality =>80,
action =>'resize',
bordersize =>1,
bordercolor =>'#00CCFF',
bgcolor =>'#000000',
copytext =>'Bodrum 1998',
copycolor =>'#FFFFFF',
//copyshadow =>'#000000',
//copybgcolor =>'#D0FFCC',
//copybgshadow =>'#656565',
copybordersize =>0,
copybordercolor =>'#FFFFFF',
copyposition =>'bottom',
logoposition =>'topleft',
logoimage =>'logo.png');

//$arg = "$source,,400,300,80,resize";
new pg_image($arg);

?>
[email protected]
19 年前
如果您需要删除或调整文件系统中的图像大小(而不是数据库中的图像),而又不损失图像质量……
我已经尽可能多地注释了代码,以便新手(像我一样)也能理解它。;)

<?php

/*

作者:
Finnur Eiriksson, (http://www.centrum.is/finnsi)
基于在 www.PHP.net 上发布的代码片段
如有任何问题,请给我发邮件。

注意:
此代码用于删除或调整文件系统中图片的大小,因此,如果您的图片存储在数据库中,
您需要进行一些更改。此外,如果您使用的图片格式不是 .gif 或 .jpg,
您还需要添加一些代码(阅读注释以了解在哪里添加)。

重要提示:
$_GET['resizepic'] 变量仅包含要删除/调整大小的文件的名称。

互联网访客帐户(WINDOWS 上的 IUSR_SERVERNAME)必须具有读取和写入权限(不需要执行权限)
在您的图片目录中(例如 $dir_name = "FooBar")。最好为用户可以上传和操作内容的图片创建一个单独的目录。
理想情况下,您应该为网站使用的图片创建一个目录,
以及另一个上传目录

*/

$dir_name = "FooBar"; // 输入包含图片的目录名称
$olddir = getcwd(); // 获取当前 Windows 目录,以便在脚本结束时能够切换回该目录
$dir = opendir($dir_name); // 创建目录句柄
// 删除图片
if(isset($_GET['delpic'])){
chdir('images');
$delpic = $_GET['delpic'];
@
unlink($delpic);
chdir($olddir);
}
// 调整图片大小
if(isset($_GET['resize'])){
// $_GET['resize'] 包含调整大小的百分比(例如 80 和 40,分别表示 80% 和 40%。要将图像大小加倍,用户输入 200 等)
// 文件和新大小
$percent = ($_GET['resize']/100);
chdir('images');// 将 Windows 目录更改为图像目录
$filename = $_GET['resizepic'];

// 确定内容类型,注意:此代码仅对 .gif 和 .jpg 文件执行
// 如果您想要 .gif 和 .jpg 以外的其他格式,请在此处以相同的方式添加您的代码:
$format='';
if(
preg_match("/.jpg/i", "$filename")){
$format = 'image/jpeg';
header('Content-type: image/jpeg');
}
if (
preg_match("/.gif/i", "$filename")){
$format = 'image/gif';
header('Content-type: image/gif');
}
if(
$format!=''){ // 这就是实际调整大小过程的开始...
// 获取新尺寸
list($width, $height) = getimagesize($filename);
$newwidth = $width * $percent;
$newheight = $height * $percent;

// 加载图像
switch($format){
case
'image/jpeg':
$source = imagecreatefromjpeg($filename);
break;
case
'image/gif';
$source = imagecreatefromgif($filename);
break;
}
// 获取图像
$thumb = imagecreatetruecolor($newwidth,$newheight);
// 必须将其设置为 false,才能能够用透明像素覆盖背景中的黑色
// 像素。否则,新的
// 像素只会应用在黑色背景的顶部。
imagealphablending($thumb, false);
// 创建临时文件句柄
$source = @imagecreatefromjpeg($filename);
// 调整大小
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
// 将图像写入目标文件
@imagejpeg($thumb, $filename);
// 切换回旧目录...我不确定这是否必要
chdir($olddir);
// 指定操作后要将用户重定向到的位置:
header('Location: foobar.php');
}
}


?>
来自quidware的david
15年前
如果脚本应该调整大小并保存缩略图,我使用这段简单的代码,我对上一段代码做了一些修改,并增加了调整最大高度的可能性。

<?php
/**
* 从JPEG、PNG、GIF源文件生成缩略图
*
* $tmpname = $_FILES['source']['tmp_name'];
* $size - 最大宽度
* $save_dir - 目标文件夹
* $save_name - 缩略图新名称
* $maxisheight - 是否以最大高度为准 (否则以最大宽度为准)
*
* 作者:David Taubmann http://www.quidware.com (根据LEDok修改 - http://www.citadelavto.ru/)
*/

/*/ // 现在如何快速使用此函数:
if ($_POST[pic])
{
$tmpname = $_FILES['pic']['tmp_name'];
@img_resize( $tmpname , 600 , "../album" , "album_".$id.".jpg");
@img_resize( $tmpname , 120 , "../album" , "album_".$id."_small.jpg");
@img_resize( $tmpname , 60 , "../album" , "album_".$id."_maxheight.jpg", 1);
}
else
echo "没有通过POST上传图片";
/**/

function img_resize( $tmpname, $size, $save_dir, $save_name, $maxisheight = 0 )
{
$save_dir .= ( substr($save_dir,-1) != "/") ? "/" : "";
$gis = getimagesize($tmpname);
$type = $gis[2];
switch(
$type)
{
case
"1": $imorig = imagecreatefromgif($tmpname); break;
case
"2": $imorig = imagecreatefromjpeg($tmpname);break;
case
"3": $imorig = imagecreatefrompng($tmpname); break;
default:
$imorig = imagecreatefromjpeg($tmpname);
}

$x = imagesx($imorig);
$y = imagesy($imorig);

$woh = (!$maxisheight)? $gis[0] : $gis[1] ;

if(
$woh <= $size)
{
$aw = $x;
$ah = $y;
}
else
{
if(!
$maxisheight){
$aw = $size;
$ah = $size * $y / $x;
} else {
$aw = $size * $x / $y;
$ah = $size;
}
}
$im = imagecreatetruecolor($aw,$ah);
if (
imagecopyresampled($im,$imorig , 0,0,0,0,$aw,$ah,$x,$y))
if (
imagejpeg($im, $save_dir.$save_name))
return
true;
else
return
false;
}
?>
haker4o at haker4o dot org
19 年前
<?php
// 调整图像大小。
// 作者:Smelban & Haker4o
// 邮箱 [email protected] & [email protected]
// 此代码仅用于处理 jpg、gif、png 格式图像
// $picname = resizepics('pics', '新的最大宽度', '新的最大高度');
// 示例:$picname = resizepics('stihche.jpg', '180', '140');
$picname = resizepics('picture-name.format', '180', '140');
echo
$pickname;
//错误
die( "<font color=\"#FF0066\"><center><b>文件不存在 :(<b></center></FONT>");
// 函数 resizepics
function resizepics($pics, $newwidth, $newheight){
if(
preg_match("/.jpg/i", "$pics")){
header('Content-type: image/jpeg');
}
if (
preg_match("/.gif/i", "$pics")){
header('Content-type: image/gif');
}
list(
$width, $height) = getimagesize($pics);
if(
$width > $height && $newheight < $height){
$newheight = $height / ($width / $newwidth);
} else if (
$width < $height && $newwidth < $width) {
$newwidth = $width / ($height / $newheight);
} else {
$newwidth = $width;
$newheight = $height;
}
if(
preg_match("/.jpg/i", "$pics")){
$source = imagecreatefromjpeg($pics);
}
if(
preg_match("/.jpeg/i", "$pics")){
$source = imagecreatefromjpeg($pics);
}
if(
preg_match("/.jpeg/i", "$pics")){
$source = Imagecreatefromjpeg($pics);
}
if(
preg_match("/.png/i", "$pics")){
$source = imagecreatefrompng($pics);
}
if(
preg_match("/.gif/i", "$pics")){
$source = imagecreatefromgif($pics);
}
$thumb = imagecreatetruecolor($newwidth, $newheight);
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
return
imagejpeg($thumb);
if(
preg_match("/.jpg/i", "$pics")){
return
imagejpeg($thumb);
}
if(
preg_match("/.jpeg/i", "$pics")){
return
imagejpeg($thumb);
}
if(
preg_match("/.jpeg/i", "$pics")){
return
imagejpeg($thumb);
}
if(
preg_match("/.png/i", "$pics")){
return
imagepng($thumb);
}
if(
preg_match("/.gif/i", "$pics")){
return
imagegif($thumb);
}
}
?>
kartoon.net 的 del
19 年前
这段代码允许您从大型图像的中心裁剪缩略图。这曾用于客户端艺术图片库,用于显示图像的预览(仅一小部分)。您可以动态地调整此值。我还加入了一个缩放因子,以防您想先缩小后再裁剪。

<?php
// 文件名
$filename = 'moon.jpg';
$percent = 1.0; // 如果要先缩小
$imagethumbsize = 200; // 缩略图大小(从图像中间裁剪的区域)
// 内容类型
header('Content-type: image/jpeg');

// 获取新的尺寸
list($width, $height) = getimagesize($filename);
$new_width = $width * $percent;
$new_height = $height * $percent;

// 重采样
$image_p = imagecreatetruecolor($imagethumbsize , $imagethumbsize); // 使用真彩色以获得最佳质量
$image = imagecreatefromjpeg($filename);

// 基本上,取这一行并将其放在你的版本中,将 -($new_width/2) + ($imagethumbsize/2) & -($new_height/2) + ($imagethumbsize/2) 用于
// imagecopyresampled 的第 3 和第 4 个位置
// -($new_width/2) + ($imagethumbsize/2)
// 和
// -($new_height/2) + ($imagethumbsize/2)
// 是诀窍
imagecopyresampled($image_p, $image, -($new_width/2) + ($imagethumbsize/2), -($new_height/2) + ($imagethumbsize/2), 0, 0, $new_width , $new_width , $width, $height);

// 输出

imagejpeg($image_p, null, 100);
?>
[email protected]
7年前
我不确定为什么 yahoo.com 的 nworld3d 的 https://php.net/manual/en/function.imagecopyresized.php#69123 被投了反对票——它正是我一直在寻找的用于合成多个 alpha 通道图像的方法,就像 Photoshop 一样。我需要从透明度开始,然后将几个 alpha 图像一个接一个地堆叠在其上。在使用内置的 PHP 函数折腾了一番之后,我担心我需要通过移除所有 alpha 并最终使用透明颜色来作弊,但这看起来会根据我将其放置在其上的背景而有所不同。yahoo.com 的 nworld3d 的评论使我不必走那条路,我给了他一个 +1。
kvslaap
15年前
这是一个脚本,它循环遍历当前设置为“files”的目录,并调整所有图像的大小,同时保持图像比例。

<?php
//如果出现内存不足错误,请取消此行注释 (删除 '//')
//ini_set ( "memory_limit", "48M");

$target_width = 800;
$target_height = 600;

if (
ob_get_level() == 0) ob_start();
if (
$handle = opendir('files/')) {
while (
false !== ($file = readdir($handle))) {
if (
$file != "." && $file != "..") {
$destination_path = './files/';
$target_path = $destination_path . basename($file);

$extension = pathinfo($target_path);
$allowed_ext = "jpg, gif, png, bmp, jpeg, JPG";
$extension = $extension[extension];
$allowed_paths = explode(", ", $allowed_ext);
$ok = 0;
for(
$i = 0; $i < count($allowed_paths); $i++) {
if (
$allowed_paths[$i] == "$extension") {
$ok = "1";
}
}

if (
$ok == "1") {

if(
$extension == "jpg" || $extension == "jpeg" || $extension == "JPG"){
$tmp_image=imagecreatefromjpeg($target_path);
}

if(
$extension == "png") {
$tmp_image=imagecreatefrompng($target_path);
}

if(
$extension == "gif") {
$tmp_image=imagecreatefromgif($target_path);
}

$width = imagesx($tmp_image);
$height = imagesy($tmp_image);

//计算图片比例
$imgratio = ($width / $height);

if (
$imgratio>1) {
$new_width = $target_width;
$new_height = ($target_width / $imgratio);
} else {
$new_height = $target_height;
$new_width = ($target_height * $imgratio);
}

$new_image = imagecreatetruecolor($new_width,$new_height);
ImageCopyResized($new_image, $tmp_image,0,0,0,0, $new_width, $new_height, $width, $height);
//获取新的图片
imagejpeg($new_image, $target_path);
$image_buffer = ob_get_contents();
ImageDestroy($new_image);
ImageDestroy($tmp_image);
echo
" $file 已调整大小为 $new_width x $new_height <br> \n";
echo
str_pad('',4096)."\n";
ob_flush();
flush();
}
}
}
closedir($handle);
echo
"完成。";
ob_end_flush();
}
?>
来自 chmzap dot ru
16年前
如果脚本需要调整大小并保存缩略图,我使用这段简单的代码

<?php
/**
* 从JPEG、PNG、GIF源文件生成缩略图
*
* $tmpname = $_FILES['source']['tmp_name'];
* $size - 最大宽度
* $save_dir - 目标文件夹
* $save_name - 缩略图新文件名
*
* 作者:LEDok - http://www.citadelavto.ru/
*/

function img_resize( $tmpname, $size, $save_dir, $save_name )
{
$save_dir .= ( substr($save_dir,-1) != "/") ? "/" : "";
$gis = GetImageSize($tmpname);
$type = $gis[2];
switch(
$type)
{
case
"1": $imorig = imagecreatefromgif($tmpname); break;
case
"2": $imorig = imagecreatefromjpeg($tmpname);break;
case
"3": $imorig = imagecreatefrompng($tmpname); break;
default:
$imorig = imagecreatefromjpeg($tmpname);
}

$x = imageSX($imorig);
$y = imageSY($imorig);
if(
$gis[0] <= $size)
{
$av = $x;
$ah = $y;
}
else
{
$yc = $y*1.3333333;
$d = $x>$yc?$x:$yc;
$c = $d>$size ? $size/$d : $size;
$av = $x*$c; //原始图片高度
$ah = $y*$c; //原始图片长度
}
$im = imagecreate($av, $ah);
$im = imagecreatetruecolor($av,$ah);
if (
imagecopyresampled($im,$imorig , 0,0,0,0,$av,$ah,$x,$y))
if (
imagejpeg($im, $save_dir.$save_name))
return
true;
else
return
false;
}

?>

现在如何快速使用此函数

<?php
if ($_POST[pic])
{
$tmpname = $_FILES['pic']['tmp_name'];
@
img_resize( $tmpname , 600 , "../album" , "album_".$id.".jpg");
@
img_resize( $tmpname , 120 , "../album" , "album_".$id."_small.jpg");
@
img_resize( $tmpname , 60 , "../album" , "album_".$id."verysmall.jpg");
}
else
echo
"没有通过POST上传图像";
?>
andrvm at andrvm dot ru
17年前
设置图像内存的另一个版本(见下文)

<?php

function setMemoryForImage($filename)
{
$imageInfo = getimagesize($filename);
$memoryNeeded = round(($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $imageInfo['channels'] / 8 + Pow(2, 16)) * 1.65);

$memoryLimit = (int) ini_get('memory_limit')*1048576;

if ((
memory_get_usage() + $memoryNeeded) > $memoryLimit)
{
ini_set('memory_limit', ceil((memory_get_usage() + $memoryNeeded + $memoryLimit)/1048576).'M');
return (
true);
}
else return(
false);
}

?>
//有效,没问题!
feip at feip dot net
18年前
此代码将图像转换为缩略图。
其工作原理:
检查源图像 - 宽度和高度,
从原始图像中裁剪最大部分,
将裁剪后的图像调整为用户定义的大小

// makeIcons_MergeCenter($src, $dst, $dstx, $dsty);

<?php

function makeIcons_MergeCenter($src, $dst, $dstx, $dsty){

// $src = 原图像路径
// $dst = 目标图像路径
// $dstx = 用户定义的图像宽度
// $dsty = 用户定义的图像高度

$allowedExtensions = 'jpg jpeg gif png';

$name = explode(".", $src);
$currentExtensions = $name[count($name)-1];
$extensions = explode(" ", $allowedExtensions);

for(
$i=0; count($extensions)>$i; $i=$i+1){
if(
$extensions[$i]==$currentExtensions)
{
$extensionOK=1;
$fileExtension=$extensions[$i];
break; }
}

if(
$extensionOK){

$size = getImageSize($src);
$width = $size[0];
$height = $size[1];

if(
$width >= $dstx AND $height >= $dsty){

$proportion_X = $width / $dstx;
$proportion_Y = $height / $dsty;

if(
$proportion_X > $proportion_Y ){
$proportion = $proportion_Y;
}else{
$proportion = $proportion_X ;
}
$target['width'] = $dstx * $proportion;
$target['height'] = $dsty * $proportion;

$original['diagonal_center'] =
round(sqrt(($width*$width)+($height*$height))/2);
$target['diagonal_center'] =
round(sqrt(($target['width']*$target['width'])+
(
$target['height']*$target['height']))/2);

$crop = round($original['diagonal_center'] - $target['diagonal_center']);

if(
$proportion_X < $proportion_Y ){
$target['x'] = 0;
$target['y'] = round((($height/2)*$crop)/$target['diagonal_center']);
}else{
$target['x'] = round((($width/2)*$crop)/$target['diagonal_center']);
$target['y'] = 0;
}

if(
$fileExtension == "jpg" OR $fileExtension=='jpeg'){
$from = ImageCreateFromJpeg($src);
}elseif (
$fileExtension == "gif"){
$from = ImageCreateFromGIF($src);
}elseif (
$fileExtension == 'png'){
$from = imageCreateFromPNG($src);
}

$new = ImageCreateTrueColor ($dstx,$dsty);

imagecopyresampled ($new, $from, 0, 0, $target['x'],
$target['y'], $dstx, $dsty, $target['width'], $target['height']);

if(
$fileExtension == "jpg" OR $fileExtension == 'jpeg'){
imagejpeg($new, $dst, 70);
}elseif (
$fileExtension == "gif"){
imagegif($new, $dst);
}elseif (
$fileExtension == 'png'){
imagepng($new, $dst);
}
}
}
}

?>
kyle dot florence at gmail dot com
18年前
下面的函数将根据最大宽度和高度调整图像大小,然后从调整大小后的图像中心创建一个指定宽度和高度的缩略图。此函数不会将图像大小调整为 max_w 像素乘以 max_h 像素,这些只是图像可以达到的最大宽度和高度,它会将图像大小调整为小于 max_w 和 max_h 的第一个 1:1 比例。

例如,如果您有一张 800x600 的图像,并将新图像指定为 400x200,它将根据最小数字(在本例中为 200)调整大小并保持图像的 1:1 比例。因此,您的最终图像尺寸将类似于 262x200。

更新:我已更新此函数,如果要将图像保存到与脚本不同的目录中,则添加了“newdir”选项。我还修复了缩略图切片,使其现在完全位于中心,并修复了“ob at babcom dot biz”提到的错误,因此您现在可以安全地根据宽度或高度调整大小。

<?
/**********************************************************
* resizejpeg 函数
*
* = 基于最大宽度创建调整大小的图像
* 并从
* 图像中间的矩形区域生成缩略图。
*
* @dir = 图像存储的目录
* @newdir = 新图像将存储到的目录
* @img = 图像名称
* @max_w = 调整大小后图像的最大宽度
* @max_h = 调整大小后图像的最大高度
* @th_w = 缩略图的宽度
* @th_h = 缩略图的高度
*
**********************************************************/

function resizejpeg($dir, $newdir, $img, $max_w, $max_h, $th_w, $th_h)
{
// 设置目标目录
if (!$newdir) $newdir = $dir;

// 获取原始图像的宽度和高度
list($or_w, $or_h, $or_t) = getimagesize($dir.$img);

// 确保图像为 jpeg
if ($or_t == 2) {

// 获取图像的比例
$ratio = ($or_h / $or_w);

// 原始图像
$or_image = imagecreatefromjpeg($dir.$img);

// 是否调整图像大小?
if ($or_w > $max_w || $or_h > $max_h) {

// 按高度调整大小,然后按宽度调整大小(高度为主导)
if ($max_h < $max_w) {
$rs_h = $max_h;
$rs_w = $rs_h / $ratio;
}
// 按宽度调整大小,然后按高度调整大小(宽度为主导)
else {
$rs_w = $max_w;
$rs_h = $ratio * $rs_w;
}

// 将旧图像复制到新图像
$rs_image = imagecreatetruecolor($rs_w, $rs_h);
imagecopyresampled($rs_image, $or_image, 0, 0, 0, 0, $rs_w, $rs_h, $or_w, $or_h);
}
// 图像不需要调整大小
else {
$rs_w = $or_w;
$rs_h = $or_h;

$rs_image = $or_image;
}

// 生成调整大小后的图像
imagejpeg($rs_image, $newdir.$img, 100);

$th_image = imagecreatetruecolor($th_w, $th_h);

// 从调整大小后的图像中裁剪一个矩形并存储到缩略图中
$new_w = (($rs_w / 2) - ($th_w / 2));
$new_h = (($rs_h / 2) - ($th_h / 2));

imagecopyresized($th_image, $rs_image, 0, 0, $new_w, $new_h, $rs_w, $rs_h, $rs_w, $rs_h);

// 生成缩略图
imagejpeg($th_image, $newdir.'thumb_'.$img, 100);

return true;
}

// 图像类型不是jpeg!
else {
return false;
}
}
?>

示例

<?php
$dir
= './';
$img = 'test.jpg';

resizejpeg($dir, '', $img, 600, 400, 300, 150);
?>

此示例将图像“test.jpg”调整为600x400或更小(保持图像的1:1比例),并创建大小为300x150的文件“thumb_test.jpg”。
kyle(dot)florence(_[at]_)gmail(dot)com
18年前
下面的函数将根据最大宽度和高度调整图像大小,然后从调整大小后的图像中心裁剪一个指定宽度和高度的矩形来创建缩略图。

<?php
/**********************************************************
* 函数 resizejpeg:
*
* = 根据指定的最大宽度创建调整大小的图像
* 并从图像的中间矩形生成缩略图。
*
* @dir = 图像存储的目录
* @img = 图像名称
* @max_w = 调整大小后图像的最大宽度
* @max_h = 调整大小后图像的最大高度
* @th_w = 缩略图的宽度
* @th_h = 缩略图的高度
*
**********************************************************/

function resizejpeg($dir, $img, $max_w, $max_h, $th_w, $th_h)
{
// 获取原始图像的宽度和高度
list($or_w, $or_h, $or_t) = getimagesize($dir.$img);

// 确保图像是jpeg
if ($or_t == 2) {

// 获取图像的比例
$ratio = ($or_h / $or_w);

// 原始图像
$or_image = imagecreatefromjpeg($dir.$img);

// 调整图像大小
if ($or_w > $max_w || $or_h > $max_h) {

// 首先按宽度调整大小(小于 $max_w)
if ($or_w > $max_w) {
$rs_w = $max_w;
$rs_h = $ratio * $max_h;
} else {
$rs_w = $or_w;
$rs_h = $or_h;
}

// 然后按高度调整大小(小于 $max_h)
if ($rs_h > $max_h) {
$rs_w = $max_w / $ratio;
$rs_h = $max_h;
}

// 将旧图像复制到新图像
$rs_image = imagecreatetruecolor($rs_w, $rs_h);
imagecopyresampled($rs_image, $or_image, 0, 0, 0, 0, $rs_w, $rs_h, $or_w, $or_h);
} else {
$rs_w = $or_w;
$rs_h = $or_h;

$rs_image = $or_image;
}

// 生成调整大小后的图像
imagejpeg($rs_image, $dir.$img, 100);

$th_image = imagecreatetruecolor($th_w, $th_h);

// 从调整大小后的图像中裁剪一个矩形并存储到缩略图中
$new_w = (($rs_w / 4));
$new_h = (($rs_h / 4));

imagecopyresized($th_image, $rs_image, 0, 0, $new_w, $new_h, $rs_w, $rs_h, $rs_w, $rs_h);

// 生成缩略图
imagejpeg($th_image, $dir.'thumb_'.$img, 100);

return
true;
}

// 图像类型不是jpeg!
else {
return
false;
}
}
?>

示例

<?php
$dir
= './';
$img = 'test.jpg';

resizejpeg($dir, $img, 600, 600, 300, 150);
?>

此示例将图像“test.jpg”调整为600x600或更小(1:1比例),并创建大小为300x150的文件“thumb_test.jpg”。
06madsenl at westseneca dot wnyric dot org
18年前
几天前我一直在尝试弄清楚如何调整我网站上原始图像的大小,但是这个网站

http://www.sitepoint.com/article/image-resizing-php

有一个关于使用PHP调整图像大小而无需创建缩略图的很好的教程。这正是我想要做的。
konteineris at yahoo dot com
18年前
此函数从源图像创建缩略图,调整其大小以使其适合所需的缩略图宽度和高度,或者通过获取最大图像部分并调整其大小来填充它,最后将其写入目标。

<?

function thumb($filename, $destination, $th_width, $th_height, $forcefill)
{
list($width, $height) = getimagesize($filename);

$source = imagecreatefromjpeg($filename);

if($width > $th_width || $height > $th_height){
$a = $th_width/$th_height;
$b = $width/$height;

if(($a > $b)^$forcefill)
{
$src_rect_width = $a * $height;
$src_rect_height = $height;
if(!$forcefill)
{
$src_rect_width = $width;
$th_width = $th_height/$height*$width;
}
}
else
{
$src_rect_height = $width/$a;
$src_rect_width = $width;
if(!$forcefill)
{
$src_rect_height = $height;
$th_height = $th_width/$width*$height;
}
}

$src_rect_xoffset = ($width - $src_rect_width)/2*intval($forcefill);
$src_rect_yoffset = ($height - $src_rect_height)/2*intval($forcefill);

$thumb = imagecreatetruecolor($th_width, $th_height);
imagecopyresized($thumb, $source, 0, 0, $src_rect_xoffset, $src_rect_yoffset, $th_width, $th_height, $src_rect_width, $src_rect_height);

imagejpeg($thumb,$destination);
}
}

?>
backglancer at hotmail
19 年前
简洁的脚本,可以创建高度和宽度都不大于150(或用户指定)的缩略图。

<?PHP
$picture
="" # 图片文件名,此处不需要地址
$max=150; # 图片单边最大尺寸。
/*
此处可以插入任何具体的“if-else”
或“switch”类型的图片类型检测器。
在此示例中,我将使用标准JPG
*/

$src_img=ImagecreateFromJpeg($picture);

$oh = imagesy($src_img); # 原图高度
$ow = imagesx($src_img); # 原图宽度

$new_h = $oh;
$new_w = $ow;

if(
$oh > $max || $ow > $max){
$r = $oh/$ow;
$new_h = ($oh > $ow) ? $max : $max*$r;
$new_w = $new_h/$r;
}
// 注意 TrueColor 是 256 色,而不是 8 色
$dst_img = ImageCreateTrueColor($new_w,$new_h);

ImageCopyResized($dst_img, $src_img, 0,0,0,0, $new_w, $new_h, ImageSX($src_img), ImageSY($src_img));

ImageJpeg($dst_img, "th_$picture");

?>
jack at computerrageprevention dot ca
11 年前
这里有很多用户笔记都处理了创建缩略图的问题,但我编写了一个函数,可以在上传图片时创建该图片的缩略图。它只是文件上传器和缩略图制作器的组合,但现在使用起来非常简单。

以下是包含上传表单、函数以及如何使用函数示例的 index.php 文件。“thumb”函数中的最后两个值是生成的缩略图的宽度和高度限制。无论原始图片大小如何,缩略图都始终符合指定的尺寸。

<?php

if ($_POST[formname] =="upload")
{
if (
$_FILES)
{
foreach (
$_FILES as $key => $value)
{
$m = thumb($value, realpath(dirname(__FILE__)) . "/" . "image_1", realpath(dirname(__FILE__)) . "/" . "thumb_1", 150, 150);

// 显示任何消息,无论是成功还是失败
if ($m) { foreach($m as $text) { print "$text<br>"; } }
}
}
}

function
thumb($file, $bigname, $thumbname, $maxwidth, $maxheight)
{
if (
is_uploaded_file($file[tmp_name]))
{
// 确定图片类型
if ($file[type] == "image/jpeg") { $ext = ".jpg"; }
if (
$file[type] == "image/png") { $ext = ".png"; }
if (
$file[type] == "image/gif") { $ext = ".gif"; }

$newfile = $bigname . $ext;

if (
move_uploaded_file($file[tmp_name], $newfile))
{
$message[] = "上传完成";

// 获取旧图片大小并转换为最大宽度/高度组合
$size = getimagesize($newfile);

// 只有在宽度大于零时才进行转换,否则可能会出现除零错误
if ($size[1] != 0)
{

// 根据允许的最大尺寸和原始尺寸计算缩略图的宽度和高度
if ($size[0]/$size[1] > $maxwidth/$maxheight)
{
$newwidth = $maxwidth; $newheight = floor(($size[1] * $maxwidth) / $size[0]); }
else
{
$newheight = $maxheight; $newwidth = ceil(($size[0] * $maxheight) / $size[1]); }

// 创建缩略图
$i = imagecreate($newwidth, $newheight);

if (
$ext == ".jpg") { $j = imagecreatefromjpeg($newfile); }
if (
$ext == ".png") { $j = imagecreatefrompng($newfile); }
if (
$ext == ".gif") { $j = imagecreatefromgif($newfile); }

if (
$j)
{
// 复制原始图像并粘贴到新的图像中,调整大小
if (imagecopyresized($i, $j, 0, 0, 0, 0, $newwidth, $newheight, $size[0], $size[1]))
{
if (
imagejpeg($i, $thumbname . $ext, 100))
{
$message[] = "图片缩略图创建成功";
} else {
$message[] = "图片缩略图无法导出";
}
} else {
$message[] = "图片调整大小失败";
}
} else {
$message[] = "无法识别的图片类型";
}
} else {
// size[1] != 0
$message[] = "无效的图片大小";
}
}
// move_uploaded_file
} // is_uploaded_file

return $message;
}

print
"
<html>
<head>
<title>图片上传和创建缩略图</title>
</head>

<body>

<form action='index.php' method='POST' enctype='multipart/form-data'>
<input type='hidden' name='formname' value='upload'>
<input type='file' name='fileupload'>
<input type='submit' value='上传'>
</form>

</body>
</html>
"
;

?>

注意:这不会处理调整调色板或透明颜色,但如果需要,可以添加。
nworld3d at yahoo dot com
18年前
以下是允许您调整透明PNG大小并将其合成到另一个图像中的代码片段。该代码经过测试,可在PHP5.1.2、GD2下运行,但我认为它也可以与其他版本的PHP和GD一起使用。

代码已添加注释以帮助您阅读。调整透明PNG图像大小的思路是创建一个完全透明的新目标图像,然后关闭此新图像的imageAlphaBlending,以便复制PNG源文件时,其alpha通道仍然保留。

<?php
/**
* 将PNG文件合成到源文件上。
* 如果定义了新的宽度/高度,则调整PNG的大小(并保留所有透明度信息)
* 作者:Alex Le - http://www.alexle.net
*/
function imageComposeAlpha( &$src, &$ovr, $ovr_x, $ovr_y, $ovr_w = false, $ovr_h = false)
{
if(
$ovr_w && $ovr_h )
$ovr = imageResizeAlpha( $ovr, $ovr_w, $ovr_h );

/* 现在合成两张图像 */
imagecopy($src, $ovr, $ovr_x, $ovr_y, 0, 0, imagesx($ovr), imagesy($ovr) );
}

/**
* 将具有透明度的PNG文件调整为给定尺寸
* 并保留alpha通道信息
* 作者:Alex Le - http://www.alexle.net
*/
function imageResizeAlpha(&$src, $w, $h)
{
/* 使用新的宽度和高度创建一个新图像 */
$temp = imagecreatetruecolor($w, $h);

/* 使新图像透明 */
$background = imagecolorallocate($temp, 0, 0, 0);
ImageColorTransparent($temp, $background); // 使新的临时图像完全透明
imagealphablending($temp, false); // 关闭alpha混合以保留alpha通道

/* 调整PNG文件大小 */
/* 使用imagecopyresized可以提高性能,但会损失一些质量 */
imagecopyresized($temp, $src, 0, 0, 0, 0, $w, $h, imagesx($src), imagesy($src));
/* 如果您更关注质量,可以使用imagecopyresampled */
//imagecopyresampled($temp, $src, 0, 0, 0, 0, $w, $h, imagesx($src), imagesy($src));
return $temp;
}
?>
示例用法

<?php
header
('Content-type: image/png');

/* 打开照片和叠加图像 */
$photoImage = ImageCreateFromJPEG('images/MiuMiu.jpg');
$overlay = ImageCreateFromPNG('images/hair-trans.png');

$percent = 0.8;
$newW = ceil(imagesx($overlay) * $percent);
$newH = ceil(imagesy($overlay) * $percent);

/* 将叠加照片合成到目标图像上 */
imageComposeAlpha( $photoImage, $overlay, 86, 15, $newW, $newH );

/* 打开另一个PNG文件,然后调整大小并合成它 */
$watermark = imagecreatefrompng('images/watermark.png');
imageComposeAlpha( $photoImage, $watermark, 10, 20, imagesx($watermark)/2, imagesy($watermark)/2 );

/**
* 打开相同的PNG文件,然后在不调整大小的情况下进行合成
* 由于原始的$watermark是通过引用传递的,它已经被调整了大小。
* 所以我们必须重新打开它。
*/
$watermark = imagecreatefrompng('images/watermark.png');
imageComposeAlpha( $photoImage, $watermark, 80, 350);
Imagepng($photoImage); // 输出到浏览器

ImageDestroy($photoImage);
ImageDestroy($overlay);
ImageDestroy($watermark);
?>
licson0729 at gmail dot com
13年前
我没有找到任何可以调整图像大小并为其添加边框的脚本。所以我自己做了一个。希望对您有所帮助。

<?php
function imagecopyresizedwithborder(&$src,$width,$height,$borderthickess,$bordercolor=NULL)
{
list(
$width_orig, $height_orig) = array(imagesx($src),imagesy($src));

if (
$width && ($width_orig < $height_orig))
{
$width = ($height / $height_orig) * $width_orig;
}
else
{
$height = ($width / $width_orig) * $height_orig;
}

$dst = imagecreatetruecolor($width+2*$borderthickess,$height+2*$borderthickess);
imagecolortransparent($dst,imagecolorallocate($dst,0,0,0));
imagealphablending($dst,false);
imagesavealpha($dst,true);
imagefill($dst,0,0,(isset($bordercolor) ? $bordercolor : imagecolorallocate($dst,255,255,255)));
imagecopyresampled($dst,$src,$borderthickess,$borderthickess,0,0,$width,$height,imagesx($src),imagesy($src));
return
$dst;
}

?>
babcom.biz的ob
18年前
关于Kyle Florence在2006年8月3日提出的注释和函数

我尝试在我的图库中使用他的resizejpeg()函数来调整图像大小。据我所知,它包含一个小错误。

只要我指定相同的最大宽度和最大高度,调整大小就能正常工作。我希望所有缩略图都具有相同的高度——这样我的图像就能在我的网站上以纵向和横向格式呈直线显示——我很快遇到了一个问题,即使用不同的最大宽度和最大高度值进行调整大小将无法正常工作。

如果您正在使用此脚本,请更改计算调整大小的宽度和高度的以下两行:

<?php
$rs_h
= $ratio * $max_h;
?>
应改为
<?php
$rs_h
= $ratio * $rs_w;
?>

以及
<?php
$rs_w
= $max_w / $ratio;
?>
应改为
<?php
$rs_w
= $rs_h / $ratio;
?>

以下函数基于Kyle Florence的函数。我省略了缩略图部分,而是添加了为图像定义新目录和新文件名的可能性。如果您需要调整大小然后创建缩略图,只需运行该函数两次即可。在这里,缩略图将包含完整图片,而不是原始图像的剪裁。

该函数支持JPG、GIF和PNG图像的调整大小。对于JPG,质量作为最后一个参数$Quality传递给函数。

变量名应说明其用途。

<?php
function Resize($Dir,$Image,$NewDir,$NewImage,$MaxWidth,$MaxHeight,$Quality) {
list(
$ImageWidth,$ImageHeight,$TypeCode)=getimagesize($Dir.$Image);
$ImageType=($TypeCode==1?"gif":($TypeCode==2?"jpeg":
(
$TypeCode==3?"png":FALSE)));
$CreateFunction="imagecreatefrom".$ImageType;
$OutputFunction="image".$ImageType;
if (
$ImageType) {
$Ratio=($ImageHeight/$ImageWidth);
$ImageSource=$CreateFunction($Dir.$Image);
if (
$ImageWidth > $MaxWidth || $ImageHeight > $MaxHeight) {
if (
$ImageWidth > $MaxWidth) {
$ResizedWidth=$MaxWidth;
$ResizedHeight=$ResizedWidth*$Ratio;
}
else {
$ResizedWidth=$ImageWidth;
$ResizedHeight=$ImageHeight;
}
if (
$ResizedHeight > $MaxHeight) {
$ResizedHeight=$MaxHeight;
$ResizedWidth=$ResizedHeight/$Ratio;
}
$ResizedImage=imagecreatetruecolor($ResizedWidth,$ResizedHeight);
imagecopyresampled($ResizedImage,$ImageSource,0,0,0,0,$ResizedWidth,
$ResizedHeight,$ImageWidth,$ImageHeight);
}
else {
$ResizedWidth=$ImageWidth;
$ResizedHeight=$ImageHeight;
$ResizedImage=$ImageSource;
}
$OutputFunction($ResizedImage,$NewDir.$NewImage,$Quality);
return
true;
}
else
return
false;
}
?>

调用该函数前,应检查对JPG、PNG或GIF的支持。
[email protected]
19 年前
此示例允许使用各种类型的图像并使用ImageCopyResized()调整图像大小,同时保持比例。

<?php
// 选择正确的函数类型

$imgfile = 'namefile.jpg';
Header("Content-type: image/".$_GET["type"]);

switch(
$_GET["type"]){
default:
$function_image_create = "ImageCreateFromJpeg";
$function_image_new = "ImageJpeg";
break;
case
"jpg":
$function_image_create = "ImageCreateFromJpeg";
$function_image_new = "ImageJpeg";
case
"jpeg":
$function_image_create = "ImageCreateFromJpeg";
$function_image_new = "ImageJpeg";
break;
case
"png":
$function_image_create = "ImageCreateFromPng";
$function_image_new = "ImagePNG";
break;
case
"gif":
$function_image_create = "ImageCreateFromGif";
$function_image_new = "ImagePNG";
break;
}

list(
$width, $height) = getimagesize($imgfile);

// 缩略图的新宽度

$newheight = 80;

// 保持比例

$newwidth = (int) (($width*80)/$height);

$thumb = ImageCreateTrueColor($newwidth,$newheight);
$source = @function_image_create($imgfile);

ImageCopyResized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

@
$function_image_new($thumb);
?>
[email protected]
17年前
关于 babcom.biz 的 Resize($Dir,$Image,$NewDir,$NewImage,$MaxWidth,$MaxHeight,$Quality) 函数

请确保不要对 png 图片使用 9 或更高的质量进行缩放。

PHP 将输出类似以下的错误:
致命错误 libpng error: zlib failed to initialize compressor

gd-png error: setjmp returns error condition
MaLaZ
19 年前
一个简单的脚本,用于创建带有处理信息并保持原始比例的缩略图,并保存到新的目标位置……非常适合与上传或已上传的图像一起使用。

<?php

// 上传------------------------------------
if(isset( $submit ))
{
if (
$_FILES['imagefile']['type'] == "image/jpeg"){
copy ($_FILES['imagefile']['tmp_name'], "../images/".$_FILES['imagefile']['name'])
or die (
"无法复制");
echo
"";
echo
"图像名称: ".$_FILES['imagefile']['name']."";
echo
"<br>图像大小: ".$_FILES['imagefile']['size']."";
echo
"<br>图像类型: ".$_FILES['imagefile']['type']."";
echo
"<br>图像复制完成....<br>";
}
else {
echo
"<br><br>";
echo
"文件类型错误(".$_FILES['imagefile']['name'].")<br>";exit;
}
//-----上传结束

//------开始缩略图生成

$thumbsize=120;
echo
"缩略图信息: <br><br> 1.缩略图定义大小: - OK: $thumbsize<br>";
$imgfile = "../images/$imagefile_name";//处理后的图像
echo "
2.图像目标位置: - OK:
$imgfile<br>";
header('Content-type: image/jpeg');
list(
$width, $height) = getimagesize($imgfile);
echo
"3.图像大小 - OK: W=$width x H=$height<br>";
$imgratio=$width/$height;
echo
"3.图像比例 - OK: $imgratio<br>";
if (
$imgratio>1){
$newwidth = $thumbsize;
$newheight = $thumbsize/$imgratio;}
else{
$newheight = $thumbsize;
$newwidth = $thumbsize*$imgratio;}
echo
"4.缩略图新大小 -OK: W=$newwidth x H=$newheight<br>";
$thumb = ImageCreateTrueColor($newwidth,$newheight);
echo
"5.TrueColor - OK<br>";
$source = imagecreatefromjpeg($imgfile);
echo
"6.从 JPG 创建 - OK<br>";
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
imagejpeg($thumb,"../images/thumbs/thumb_$imagefile_name",100);echo "7.完成... - OK<br>";
//-----------结束--------------
?>

或者,不带任何信息,只进行缩放

<?php
//------开始缩略图生成
$thumbsize=120;
$imgfile = "../images/$imagefile_name";
header('Content-type: image/jpeg');
list(
$width, $height) = getimagesize($imgfile);
$imgratio=$width/$height;
if (
$imgratio>1){
$newwidth = $thumbsize;
$newheight = $thumbsize/$imgratio;}
else{
$newheight = $thumbsize;
$newwidth = $thumbsize*$imgratio;}
$thumb = ImageCreateTrueColor($newwidth,$newheight);
$source = imagecreatefromjpeg($imgfile);
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
imagejpeg($thumb,"../images/thumbs/thumb_$imagefile_name",100);
//-----------结束--------------
?>

希望对您有所帮助。
[email protected]
19 年前
我昨晚一直在尝试这个函数,但结果都不成功,直到我在 imagecopyresampled 页面上发现了 fluffle <<at>> gmail 的这篇笔记,我做了一点修改,你可以直接复制粘贴。

澄清一下,src_w 和 src_h 不一定需要是源图像的宽度和高度,它们指定的是从源图像中裁剪的矩形的尺寸,其左上角位于 (src_x, src_y) 位置。

例如,下面的代码将一个 jpeg 图片裁剪成正方形,正方形位于原始图像的中心,然后将其调整大小为 100x100 的缩略图。

function ($image_filename, $thumb_location, $image_thumb_size){
//@$image_filename - 你想要获取缩略图的图片文件名(相对于此函数的位置)。
//
//
//@$thumb_location - 保存缩略图的 URL(相对于此函数的位置)。
//
//@$image_thumb_size - 缩略图的 x-y 尺寸(以像素为单位)。
//

list($ow, $oh) = getimagesize($image_filename);
$image_original = imagecreatefromjpeg($image_filename);
$image_thumb = imagecreatetruecolor($image_thumb_size,$image_thumb_size);
if ($ow > $oh) {
$off_w = ($ow-$oh)/2;
$off_h = 0;
$ow = $oh;
} elseif ($oh > $ow) {
$off_w = 0;
$off_h = ($oh-$ow)/2;
$oh = $ow;
} else {
$off_w = 0;
$off_h = 0;
}
imagecopyresampled($image_thumb, $image_original, 0, 0, $off_w, $off_h, 100, 100, $ow, $oh);

imagejpeg($image_thumb, $thumb_location);
}//end function
To Top