imagecopyresampled

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagecopyresampled复制并使用重采样调整图像的一部分大小

描述

imagecopyresampled(
    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

imagecopyresampled() 将一个图像的矩形部分复制到另一个图像,平滑地插值像素值,因此,特别是缩小图像尺寸仍然保留了很大的清晰度。

换句话说,imagecopyresampled() 将从 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);
$new_width = $width * $percent;
$new_height = $height * $percent;

// 重采样
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

// 输出
imagejpeg($image_p, null, 100);
?>

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

Output of example : Simple example

示例 #2 按比例重采样图像

此示例将显示一个图像,其最大宽度或高度为 200 像素。

<?php
// 文件名
$filename = 'test.jpg';

// 设置最大高度和宽度
$width = 200;
$height = 200;

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

// 获取新尺寸
list($width_orig, $height_orig) = getimagesize($filename);

$ratio_orig = $width_orig/$height_orig;

if (
$width/$height > $ratio_orig) {
$width = $height*$ratio_orig;
} else {
$height = $width/$ratio_orig;
}

// 重采样
$image_p = imagecreatetruecolor($width, $height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);

// 输出
imagejpeg($image_p, null, 100);
?>

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

Output of example : Resampling an image proportionally

注意

注意:

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

参见

添加注释

用户贡献的注释 37 notes

wbcarts at juno dot com
11 年前
四个矩形

$src_image $dst_image
+------------+---------------------------------+ +------------+--------------------+
| | | | | |
| | | | $dst_y |
| | | | | |
| $src_y | +-- $dst_x --+----$dst_width----+ |
| | | | | | |
| | | | | 重采样 | |
| | | | | | |
+-- $src_x --+------ $src_width ------+ | | $dst_height | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | +------------------+ |
| | 样本 | | | |
| | | | | |
| | | | | |
| $src_height | | | |
| | | | +---------------------------------+
| | | |
| | | |
| +------------------------+ |
| |
| |
+----------------------------------------------+
promaty at gmail dot com
13 年前
这是我最终的图像调整器,它为 gif 和 png 保留透明度,并且可以选择将图像裁剪为固定尺寸(默认情况下保留图像比例)

<?php
function image_resize($src, $dst, $width, $height, $crop=0){

if(!list(
$w, $h) = getimagesize($src)) return "不支持的图片类型!";

$type = strtolower(substr(strrchr($src,"."),1));
if(
$type == 'jpeg') $type = 'jpg';
switch(
$type){
case
'bmp': $img = imagecreatefromwbmp($src); break;
case
'gif': $img = imagecreatefromgif($src); break;
case
'jpg': $img = imagecreatefromjpeg($src); break;
case
'png': $img = imagecreatefrompng($src); break;
default : return
"不支持的图片类型!";
}

// 调整大小
if($crop){
if(
$w < $width or $h < $height) return "图片太小!";
$ratio = max($width/$w, $height/$h);
$h = $height / $ratio;
$x = ($w - $width / $ratio) / 2;
$w = $width / $ratio;
}
else{
if(
$w < $width and $h < $height) return "图片太小!";
$ratio = min($width/$w, $height/$h);
$width = $w * $ratio;
$height = $h * $ratio;
$x = 0;
}

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

// 保留透明度
if($type == "gif" or $type == "png"){
imagecolortransparent($new, imagecolorallocatealpha($new, 0, 0, 0, 127));
imagealphablending($new, false);
imagesavealpha($new, true);
}

imagecopyresampled($new, $img, 0, 0, $x, 0, $width, $height, $w, $h);

switch(
$type){
case
'bmp': imagewbmp($new, $dst); break;
case
'gif': imagegif($new, $dst); break;
case
'jpg': imagejpeg($new, $dst); break;
case
'png': imagepng($new, $dst); break;
}
return
true;
}
?>

我在将新图像上传到服务器时使用的示例。

这将原始图片保存为以下形式
original.type

并创建一个新的缩略图
100x100.type

<?php
$pic_type
= strtolower(strrchr($picture['name'],"."));
$pic_name = "original$pic_type";
move_uploaded_file($picture['tmp_name'], $pic_name);
if (
true !== ($pic_error = @image_resize($pic_name, "100x100$pic_type", 100, 100, 1))) {
echo
$pic_error;
unlink($pic_name);
}
else echo
"OK!";
?>

干杯!
zorroswordsman at gmail dot com
15 年前
我创建了一个 PHP5 图像调整大小类,使用 ImageCopyResampled,可能有人会发现它很有用,支持 JPEG、PNG 和 GIF 格式。它在调整大小时保留原始图像的纵横比,并且如果原始宽度和高度小于所需调整大小,则不会调整大小或重新采样。

<?php

// Imaging
class imaging
{

// Variables
private $img_input;
private
$img_output;
private
$img_src;
private
$format;
private
$quality = 80;
private
$x_input;
private
$y_input;
private
$x_output;
private
$y_output;
private
$resize;

// Set image
public function set_img($img)
{

// Find format
$ext = strtoupper(pathinfo($img, PATHINFO_EXTENSION));

// JPEG image
if(is_file($img) && ($ext == "JPG" OR $ext == "JPEG"))
{

$this->format = $ext;
$this->img_input = ImageCreateFromJPEG($img);
$this->img_src = $img;


}

// PNG image
elseif(is_file($img) && $ext == "PNG")
{

$this->format = $ext;
$this->img_input = ImageCreateFromPNG($img);
$this->img_src = $img;

}

// GIF image
elseif(is_file($img) && $ext == "GIF")
{

$this->format = $ext;
$this->img_input = ImageCreateFromGIF($img);
$this->img_src = $img;

}

// Get dimensions
$this->x_input = imagesx($this->img_input);
$this->y_input = imagesy($this->img_input);

}

// Set maximum image size (pixels)
public function set_size($size = 100)
{

// Resize
if($this->x_input > $size && $this->y_input > $size)
{

// Wide
if($this->x_input >= $this->y_input)
{

$this->x_output = $size;
$this->y_output = ($this->x_output / $this->x_input) * $this->y_input;

}

// Tall
else
{

$this->y_output = $size;
$this->x_output = ($this->y_output / $this->y_input) * $this->x_input;

}

// Ready
$this->resize = TRUE;

}

// Don't resize
else { $this->resize = FALSE; }

}

// Set image quality (JPEG only)
public function set_quality($quality)
{

if(
is_int($quality))
{

$this->quality = $quality;

}

}

// Save image
public function save_img($path)
{

// Resize
if($this->resize)
{

$this->img_output = ImageCreateTrueColor($this->x_output, $this->y_output);
ImageCopyResampled($this->img_output, $this->img_input, 0, 0, 0, 0, $this->x_output, $this->y_output, $this->x_input, $this->y_input);

}

// Save JPEG
if($this->format == "JPG" OR $this->format == "JPEG")
{

if(
$this->resize) { imageJPEG($this->img_output, $path, $this->quality); }
else {
copy($this->img_src, $path); }

}

// Save PNG
elseif($this->format == "PNG")
{

if(
$this->resize) { imagePNG($this->img_output, $path); }
else {
copy($this->img_src, $path); }

}

// Save GIF
elseif($this->format == "GIF")
{

if(
$this->resize) { imageGIF($this->img_output, $path); }
else {
copy($this->img_src, $path); }

}

}

// Get width
public function get_width()
{

return
$this->x_input;

}

// Get height
public function get_height()
{

return
$this->y_input;

}

// Clear image cache
public function clear_cache()
{

@
ImageDestroy($this->img_input);
@
ImageDestroy($this->img_output);

}

}

##### DEMO #####

// Image
$src = "myimage.jpg";

// Begin
$img = new imaging;
$img->set_img($src);
$img->set_quality(80);

// Small thumbnail
$img->set_size(200);
$img->save_img("small_" . $src);

// Baby thumbnail
$img->set_size(50);
$img->save_img("baby_" . $src);

// Finalize
$img->clear_cache();

?>
wm at violet dot bg
16 年前
这是 liviu.malaescu 发布的 ImageCopyResampledBicubic 的修复版本
原始版本没有遵守 src_x & src_y 参数

<?php
function ImageCopyResampledBicubic(&$dst_image, &$src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) {
// 我们应该先从源中剪切我们感兴趣的部分
$src_img = ImageCreateTrueColor($src_w, $src_h);
imagecopy($src_img, $src_image, 0, 0, $src_x, $src_y, $src_w, $src_h);

// 这个用作临时图像
$dst_img = ImageCreateTrueColor($dst_w, $dst_h);

ImagePaletteCopy($dst_img, $src_img);
$rX = $src_w / $dst_w;
$rY = $src_h / $dst_h;
$w = 0;
for (
$y = 0; $y < $dst_h; $y++) {
$ow = $w; $w = round(($y + 1) * $rY);
$t = 0;
for (
$x = 0; $x < $dst_w; $x++) {
$r = $g = $b = 0; $a = 0;
$ot = $t; $t = round(($x + 1) * $rX);
for (
$u = 0; $u < ($w - $ow); $u++) {
for (
$p = 0; $p < ($t - $ot); $p++) {
$c = ImageColorsForIndex($src_img, ImageColorAt($src_img, $ot + $p, $ow + $u));
$r += $c['red'];
$g += $c['green'];
$b += $c['blue'];
$a++;
}
}
ImageSetPixel($dst_img, $x, $y, ImageColorClosest($dst_img, $r / $a, $g / $a, $b / $a));
}
}

// 将临时图像应用到返回的图像上,并使用目标 x、y 坐标
imagecopy($dst_image, $dst_img, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h);

// 我们应该返回 true,因为 ImageCopyResampled/ImageCopyResized 会这样做
return true;
}
?>
mattura gmail com
16 年前
这是我编写的一个小程序,用于将图像调整为最大尺寸 - 基于 Facebook 在画廊中所做的事情。您输入源、目标和最大尺寸(以像素为单位,例如 300),例如,如果图像又长又窄,最长边将为 300 像素,但图像会保留比例。正方形图像将变为 300x300,6x4(横向)将变为 300x200,4x6(纵向) - 200x300 等等。
它适用于 jpg 图像,但其他格式可以轻松添加。
<?php
function createThumb($spath, $dpath, $maxd) {
$src=@imagecreatefromjpeg($spath);
if (!
$src) {return false;} else {
$srcw=imagesx($src);
$srch=imagesy($src);
if (
$srcw<$srch) {$height=$maxd;$width=floor($srcw*$height/$srch);}
else {
$width=$maxd;$height=floor($srch*$width/$srcw);}
if (
$width>$srcw && $height>$srch) {$width=$srcw;$height=$srch;} // 如果图像实际上比您想要的要小,则保留小尺寸(删除此行以无论如何调整大小)
$thumb=imagecreatetruecolor($width, $height);
if (
$height<100) {imagecopyresized($thumb, $src, 0, 0, 0, 0, $width, $height, imagesx($src), imagesy($src));}
else {
imagecopyresampled($thumb, $src, 0, 0, 0, 0, $width, $height, imagesx($src), imagesy($src));}
imagejpeg($thumb, $dpath);
return
true;
}
}
?>
Dave McCourt
16 年前
此函数来自许多网络资源,感谢所有发布它的人。它可以从纵向或横向的原始图像中创建正方形或横向缩略图。我事先决定缩略图的显示方式,以保持一致性。我通常也会在上传后锐化图像,以节省服务器资源。如果有人需要,我可以发布此代码。希望对大家有所帮助...

# 从 jpg 创建缩略图
# 用法
# create_jpgthumb(上传文件,最终文件(含路径),缩略图高度,缩略图宽度,jpg 质量,缩放缩略图(true)或固定大小(false);
function create_jpgthumb($original, $thumbnail, $max_width, $max_height, $quality, $scale = true) {

list ($src_width, $src_height, $type, $w) = getimagesize($original);

if (!$srcImage = @imagecreatefromjpeg($original)) {
return false;
}

# 图像调整为自然高度和宽度
if ($scale == true) {

if ($src_width > $src_height ) {
$thumb_width = $max_width;
$thumb_height = floor($src_height * ($max_width / $src_width));
} else if ($src_width < $src_height ) {
$thumb_height = $max_height;
$thumb_width = floor($src_width * ($max_height / $src_height));
} else {
$thumb_width = $max_height;
$thumb_height = $max_height;
}

if (!@$destImage = imagecreatetruecolor($thumb_width, $thumb_height)) {
return false;
}

if (!@imagecopyresampled($destImage, $srcImage, 0, 0, 0, 0, $thumb_width, $thumb_height, $src_width, $src_height)) {
return false;
}

# 图像固定为指定的宽度和高度并裁剪
} else if ($scale == false) {

$ratio = $max_width / $max_height;

# 缩略图是横向的
if ($ratio > 1) {

# 上传的图片是横向的
if ($src_width > $src_height) {

$thumb_width = $max_width;
$thumb_height = ceil($max_width * ($src_height / $src_width));

if ($thumb_height > $max_width) {
$thumb_height = $max_width;
$thumb_width = ceil($max_width * ($src_width / $src_height));
}

# 上传的图片是纵向的
} else {

$thumb_height = $max_width;
$thumb_width = ceil($max_width * ($src_height / $src_width));

if ($thumb_width > $max_width) {
$thumb_width = $max_width;
$thumb_height = ceil($max_width * ($src_height / $src_width));
}

$off_h = ($src_height - $src_width) / 2;

}

if (!@$destImage = imagecreatetruecolor($max_width, $max_height)) {
return false;
}

if (!@imagecopyresampled($destImage, $srcImage, 0, 0, 0, $off_h, $thumb_width, $thumb_height, $src_width, $src_height)) {
return false;
}

# 缩略图是正方形的
} else {

if ($src_width > $src_height) {
$off_w = ($src_width - $src_height) / 2;
$off_h = 0;
$src_width = $src_height;
} else if ($src_height > $src_width) {
$off_w = 0;
$off_h = ($src_height - $src_width) / 2;
$src_height = $src_width;
} else {
$off_w = 0;
$off_h = 0;
}

if (!@$destImage = imagecreatetruecolor($max_width, $max_height)) {
return false;
}

if (!@imagecopyresampled($destImage, $srcImage, 0, 0, $off_w, $off_h, $max_width, $max_height, $src_width, $src_height)) {
return false;
}

}


}

@imagedestroy($srcImage);

if (!@imageantialias($destImage, true)) {
return false;
}

if (!@imagejpeg($destImage, $thumbnail, $quality)) {
return false;
}

@imagedestroy($destImage);

return true;
}
kazuya
10 年前
<?php

$new_file
= img_resize("./img/", "test.jpg","copy_test.jpg",300);
echo
"<IMG src = '$new_file'>";

function
img_resize($path,$tmp_name,$new_name,$new_width){
if (!
file_exists($path.$filename)){
echo
"file not found!";
exit;
}
if (!
is_writable($path)){
echo
"error:permission denied!";
exit;
}
list(
$width, $height) = getimagesize($path . $tmp_name);
$new_height = abs($new_width * $height / $width);
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($path . $tmp_name);
imagecopyresampled($image_p, $image, 0, 0, 0, 0,
$new_width, $new_height, $width, $height);
imagejpeg($image_p, $path . $new_name);
return
$path.$new_name;
}

?>
匿名
19 年前
需要注意的是,imagecopyresampled() 函数比 Photoshop CS 的默认双三次函数模糊得多。而且看起来类似于 Photoshop 双线性函数的模糊版本。文档没有说明在重采样中使用了哪种算法。
z3n666 at gmail dot com
15 年前
我到处寻找,但找不到任何函数可以将图像调整为任何比例,而不会留下空白区域,所以我编写了这个函数。它可以将图像调整为任何大小比例,当比例与原始比例不匹配时,它会裁剪原始图像的比例区域并调整其大小。

<?php

function _ckdir($fn) {
if (
strpos($fn,"/") !== false) {
$p=substr($fn,0,strrpos($fn,"/"));
if (!
is_dir($p)) {
_o("Mkdir: ".$p);
mkdir($p,777,true);
}
}
}
function
img_resizer($src,$quality,$w,$h,$saveas) {
/* v2.5 with auto crop */
$r=1;
$e=strtolower(substr($src,strrpos($src,".")+1,3));
if ((
$e == "jpg") || ($e == "peg")) {
$OldImage=ImageCreateFromJpeg($src) or $r=0;
} elseif (
$e == "gif") {
$OldImage=ImageCreateFromGif($src) or $r=0;
} elseif (
$e == "bmp") {
$OldImage=ImageCreateFromwbmp($src) or $r=0;
} elseif (
$e == "png") {
$OldImage=ImageCreateFromPng($src) or $r=0;
} else {
_o("Not a Valid Image! (".$e.") -- ".$src);$r=0;
}
if (
$r) {
list(
$width,$height)=getimagesize($src);
// check if ratios match
$_ratio=array($width/$height,$w/$h);
if (
$_ratio[0] != $_ratio[1]) { // crop image

// find the right scale to use
$_scale=min((float)($width/$w),(float)($height/$h));

// coords to crop
$cropX=(float)($width-($_scale*$w));
$cropY=(float)($height-($_scale*$h));

// cropped image size
$cropW=(float)($width-$cropX);
$cropH=(float)($height-$cropY);

$crop=ImageCreateTrueColor($cropW,$cropH);
// crop the middle part of the image to fit proportions
ImageCopy(
$crop,
$OldImage,
0,
0,
(int)(
$cropX/2),
(int)(
$cropY/2),
$cropW,
$cropH
);
}

// do the thumbnail
$NewThumb=ImageCreateTrueColor($w,$h);
if (isset(
$crop)) { // been cropped
ImageCopyResampled(
$NewThumb,
$crop,
0,
0,
0,
0,
$w,
$h,
$cropW,
$cropH
);
ImageDestroy($crop);
} else {
// ratio match, regular resize
ImageCopyResampled(
$NewThumb,
$OldImage,
0,
0,
0,
0,
$w,
$h,
$width,
$height
);
}
_ckdir($saveas);
ImageJpeg($NewThumb,$saveas,$quality);
ImageDestroy($NewThumb);
ImageDestroy($OldImage);
}
return
$r;
}

?>
satanas147 at gmail dot com
15 年前
这是对之前 php5 缩略图类的补充(融合了 Matt 和 Zorro 的建议)。
它专门用于使用 thumbnail 子类为网页动态生成缩略图。
它将生成的缩略图保存为 myimage_tn,在同一目录中。
我对 php5 还不太熟悉,所以我认为这可以优化,但它似乎运行良好。

<?php
// Imaging
class imaging
{
// Variables
private $img_input;
private
$img_output;
private
$img_src;
private
$format;
private
$quality = 80;
private
$x_input;
private
$y_input;
private
$x_output;
private
$y_output;
private
$resize;

// Set image
public function set_img($img)
{
// Find format
$ext = strtoupper(pathinfo($img, PATHINFO_EXTENSION));
// JPEG image
if(is_file($img) && ($ext == "JPG" OR $ext == "JPEG"))
{
$this->format = $ext;
$this->img_input = ImageCreateFromJPEG($img);
$this->img_src = $img;
}
// PNG image
elseif(is_file($img) && $ext == "PNG")
{
$this->format = $ext;
$this->img_input = ImageCreateFromPNG($img);
$this->img_src = $img;
}
// GIF image
elseif(is_file($img) && $ext == "GIF")
{
$this->format = $ext;
$this->img_input = ImageCreateFromGIF($img);
$this->img_src = $img;
}
// Get dimensions
$this->x_input = imagesx($this->img_input);
$this->y_input = imagesy($this->img_input);
}

// Set maximum image size (pixels)
public function set_size($max_x = 100,$max_y = 100)
{
// Resize
if($this->x_input > $max_x || $this->y_input > $max_y)
{
$a= $max_x / $max_y;
$b= $this->x_input / $this->y_input;
if (
$a<$b)
{
$this->x_output = $max_x;
$this->y_output = ($max_x / $this->x_input) * $this->y_input;
}
else
{
$this->y_output = $max_y;
$this->x_output = ($max_y / $this->y_input) * $this->x_input;
}
// Ready
$this->resize = TRUE;
}
// Don't resize
else { $this->resize = FALSE; }
}
// Set image quality (JPEG only)
public function set_quality($quality)
{
if(
is_int($quality))
{
$this->quality = $quality;
}
}
// Save image
public function save_img($path)
{
// Resize
if($this->resize)
{
$this->img_output = ImageCreateTrueColor($this->x_output, $this->y_output);
ImageCopyResampled($this->img_output, $this->img_input, 0, 0, 0, 0, $this->x_output, $this->y_output, $this->x_input, $this->y_input);
}
// Save JPEG
if($this->format == "JPG" OR $this->format == "JPEG")
{
if(
$this->resize) { imageJPEG($this->img_output, $path, $this->quality); }
else {
copy($this->img_src, $path); }
}
// Save PNG
elseif($this->format == "PNG")
{
if(
$this->resize) { imagePNG($this->img_output, $path); }
else {
copy($this->img_src, $path); }
}
// Save GIF
elseif($this->format == "GIF")
{
if(
$this->resize) { imageGIF($this->img_output, $path); }
else {
copy($this->img_src, $path); }
}
}
// Get width
public function get_width()
{
return
$this->x_input;
}
// Get height
public function get_height()
{
return
$this->y_input;
}
// Clear image cache
public function clear_cache()
{
@
ImageDestroy($this->img_input);
@
ImageDestroy($this->img_output);
}
}
class
thumbnail extends imaging {
private
$image;
private
$width;
private
$height;

function
__construct($image,$width,$height) {
parent::set_img($image);
parent::set_quality(80);
parent::set_size($width,$height);
$this->thumbnail= pathinfo($image, PATHINFO_DIRNAME).pathinfo($image, PATHINFO_FILENAME).'_tn.'.pathinfo($image, PATHINFO_EXTENSION);
parent::save_img($this->thumbnail);
parent::clear_cache();
}
function
__toString() {
return
$this->thumbnail;
}
}

********
*
DEMO *
********
$thumb = new thumbnail('./image_dir/sub_dir/myimage.jpg',100,100);
echo
'<img src=\''.$thumb.'\' alt=\'myimage\' title=\'myimage\'/>';

?>
julien at go-on-web dot com
10 年前
Windows 不接受浮点宽度和高度...

因此,在“示例 #2 按比例重新采样图像”中,最好使用
<?php
if ($width/$height > $ratio_orig) {
$width = round( $height*$ratio_orig );
} else {
$height = round( $width/$ratio_orig );
}
?>
(使用“round”)
否则你的图像将不会被调整大小。
bobbyboyojones at hotmail dot com
16 年前
我讨厌放大图像会导致出现巨大的像素而不是更平滑的外观,所以我写了这个函数。它需要更长时间,但给出了更漂亮的外观。

<?php

function imagecopyresampledSMOOTH(&$dst_img, &$src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h, $mult=1.25){
// 不要使用与整数过于接近的 $mult,否则此函数不会产生很大影响

$tgt_w = round($src_w * $mult);
$tgt_h = round($src_h * $mult);

// 使用 $mult <= 1 会使当前步骤的 w/h 变小(或相同),不允许这样做,始终至少以 1 像素变大来调整大小
if($tgt_w <= $src_w){ $tgt_w += 1; }
if(
$tgt_h <= $src_h){ $tgt_h += 1; }

// 如果当前步骤的 w/h 大于最终高度,则将其调整回最终大小
// 此检查还可以确保如果我们正在调整大小以缩小图像,它会在一步骤中完成(因为这已经是平滑的)
if($tgt_w > $dst_w){ $tgt_w = $dst_w; }
if(
$tgt_h > $dst_h){ $tgt_h = $dst_h; }

$tmpImg = imagecreatetruecolor($tgt_w, $tgt_h);

imagecopyresampled($tmpImg, $src_img, 0, 0, $src_x, $src_y, $tgt_w, $tgt_h, $src_w, $src_h);
imagecopy($dst_img, $tmpImg, $dst_x, $dst_y, 0, 0, $tgt_w, $tgt_h);
imagedestroy($tmpImg);

// 只要最终的 w/h 尚未达到,就继续调整大小
if($tgt_w < $dst_w OR $tgt_h < $dst_h){
imagecopyresampledSMOOTH($dst_img, $dst_img, $dst_x, $dst_y, $dst_x, $dst_y, $dst_w, $dst_h, $tgt_w, $tgt_h, $mult);
}
}

?>
tim dot daldini at gmail dot be
16 年前
Tim 的函数快很多,但是,质量设置似乎不对,因为调整非常大的图像大小在质量 1 时对结果缩略图的质量影响并不大。

有没有人想出如何通过比较图像表面(例如)基于 Tim 的函数来使用更正确的质量设置?

总共 1000 万像素的图像,在调整大小后包含 500 万像素,应该使用与包含 100 万像素但只调整大小为 0.5 的图像相同的质量设置。

不难理解,但是如果函数可以自动决定在将大型图像调整为小型缩略图时使用质量 1 的设置,那么内存负载会低很多。这在同一个应用程序中使用不同大小的图像时尤其有用。
seifer at loveletslive dot com
14 年前
好吧,我看到其他人已经发布过这个,但我只是乱七八糟地把它弄好了,所以我想我会分享一下。

我的作品,并不是说其他人没有,我没有测试过它们。

此函数创建指定大小的缩略图。
如果缩略图的比例不同,它将自动裁剪源图像的中心。

它适用于源图像大于或小于所需“裁剪缩略图”。

以下是代码...
<?php
function CroppedThumbnail($imgSrc,$thumbnail_width,$thumbnail_height) { //$imgSrc 是一个文件 - 返回一个图像资源。
// 获取图像尺寸
list($width_orig, $height_orig) = getimagesize($imgSrc);
$myImage = imagecreatefromjpeg($imgSrc);
$ratio_orig = $width_orig/$height_orig;

if (
$thumbnail_width/$thumbnail_height > $ratio_orig) {
$new_height = $thumbnail_width/$ratio_orig;
$new_width = $thumbnail_width;
} else {
$new_width = $thumbnail_height*$ratio_orig;
$new_height = $thumbnail_height;
}

$x_mid = $new_width/2; // 水平居中
$y_mid = $new_height/2; // 垂直居中

$process = imagecreatetruecolor(round($new_width), round($new_height));

imagecopyresampled($process, $myImage, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig);
$thumb = imagecreatetruecolor($thumbnail_width, $thumbnail_height);
imagecopyresampled($thumb, $process, 0, 0, ($x_mid-($thumbnail_width/2)), ($y_mid-($thumbnail_height/2)), $thumbnail_width, $thumbnail_height, $thumbnail_width, $thumbnail_height);

imagedestroy($process);
imagedestroy($myImage);
return
$thumb;
}

// 创建缩略图
$newThumb = CroppedThumbnail("MyImageName.jpg",75,100);

// 然后显示图像...
header('Content-type: image/jpeg');
imagejpeg($newThumb);
?>
alex-thennstaett-remove at gmx dot net
11 年前
将 GD 库从 2.0.35-r1 更新到 2.0.35-r3 后,使用 $dstX 或 $dstY 的负数开始产生不可预测的结果,例如插入缩小的图像并自行扩大 $dstH 或 $dstW。虽然它以前工作正常,但应该从一开始就避免使用或计算 imagecopyresampled 的负数。
mark at manngo dot net
2 年前
请注意,从 PHP 8.1 开始,如果参数是浮点数,您将收到已弃用警告。如果您将参数强制转换为整数,您将省去很多痛苦。

<?php
imagecopyresampled
(
$dst_image, $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
);
?>

您也可以将它们四舍五入,但我认为将它们强制转换为整数更符合原始行为。
sam at durosoft.com
10 年前
终极智能图像调整大小例程。您提供原始图像,以及所需的宽度和/或高度。该函数将智能地调整原始图像的大小以适合指定尺寸内的中心。可以省略宽度或高度以使调整大小仅锁定在宽度或高度上。非常适合生成缩略图。设计用于与 PNG 一起使用。

function resize_image_smart($orig, $dest_width=null, $dest_height=null)
{
$orig_width = imagesx($orig);
$orig_height = imagesy($orig);
$vertical_offset = 0;
$horizontal_offset = 0;
if($dest_width == null)
{
if($dest_height == null)
{
die('$dest_width 和 $dest_height 不能同时为空!');
}
// 高度锁定
$dest_width = $dest_height * $orig_width / $orig_height;
} else {
if($dest_height == null)
{
// 宽度锁定
$dest_height = $dest_width * $orig_height / $orig_width;
} else {
// 两个维度都锁定
$vertical_offset = $dest_height - ($orig_height * $dest_width) / $orig_width;
$horizontal_offset = $dest_width - ($dest_height * $orig_width) / $orig_height;
if($vertical_offset < 0) $vertical_offset = 0;
if($horizontal_offset < 0) $horizontal_offset = 0;
}
}
$img = imagecreatetruecolor($dest_width, $dest_height);
imagesavealpha($img, true);
imagealphablending($img, false);
$transparent = imagecolorallocatealpha($img, 0, 0, 0, 127);
imagefill($img, 0, 0, $transparent);
imagecopyresampled($img, $orig, round($horizontal_offset / 2),
round($vertical_offset / 2),
0,
0,
round($dest_width - $horizontal_offset),
round($dest_height - $vertical_offset),
$orig_width,
$orig_height);
return $img;
}
guru_boy87 at hotmail dot com
14 年前
用于调整图像大小的函数。

<?php
function resizeImage($originalImage,$toWidth,$toHeight)
{

list(
$width, $height) = getimagesize($originalImage);
$xscale=$width/$toWidth;
$yscale=$height/$toHeight;

if (
$yscale>$xscale){
$new_width = round($width * (1/$yscale));
$new_height = round($height * (1/$yscale));
}
else {
$new_width = round($width * (1/$xscale));
$new_height = round($height * (1/$xscale));
}


$imageResized = imagecreatetruecolor($new_width, $new_height);
$imageTmp = imagecreatefromjpeg ($originalImage);
imagecopyresampled($imageResized, $imageTmp, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

return
$imageResized;


}
?>
zuegs
15 年前
重新采样 GIF 并保留透明度并不总是有效,因为根据重新采样的比例,生成的重新采样图像会有一些模式噪声,这会导致“imagegif”无法找到所有透明像素。
解决此问题的一种方法是将所有高 alpha 像素重置为完全透明。
<?php
// 加载/创建图像
$img_src=imagecreatefromgif($g_srcfile);
$img_dst=imagecreatetruecolor($g_iw,$g_ih);
imagealphablending($img_dst, false);

// 获取并重新分配透明颜色
$transindex = imagecolortransparent($img_src);
if(
$transindex >= 0) {
$transcol = imagecolorsforindex($img_src, $transindex);
$transindex = imagecolorallocatealpha($img_dst, $transcol['red'], $transcol['green'], $transcol['blue'], 127);
imagefill($img_dst, 0, 0, $transindex);
}

// 重新采样
imagecopyresampled($img_dst, $img_src, 0, 0, 0, 0, $g_iw, $g_ih, $g_is[0], $g_is[1]);

// 恢复透明度
if($transindex >= 0) {
imagecolortransparent($img_dst, $transindex);
for(
$y=0; $y<$g_ih; ++$y)
for(
$x=0; $x<$g_iw; ++$x)
if(((
imagecolorat($img_dst, $x, $y)>>24) & 0x7F) >= 100) imagesetpixel($img_dst, $x, $y, $transindex);

// 保存 GIF
imagetruecolortopalette($img_dst, true, 255);
imagesavealpha($img_dst, false);
imagegif($img_dst, $g_dstfile);
imagedestroy($img_dst);
?>
Warren
15 年前
这是我为创建缩略图编写的函数 - 它将接受源 *图像资源* 和目标 *路径*,以及最大尺寸和缩略图是否应该是正方形。

我选择接受资源作为源,以使其创建多个尺寸更有效率。例如

<?php
$src_im
=@imagecreatefromjpeg($pathtofile);
$large = resize($src_im,$destination_large,1024);
@
imagedestroy($src_im);
$medium = resize($large,$destination_medium,500);
@
imagedestroy($large);
$small = resize($medium,$destination_small,125);
@
imagedestroy($medium);
$square = resize($small,$destination_square,75,TRUE);
@
imagedestroy($small);
@
imagedestroy($square);

function
resize($src_im, $dpath, $maxd, $square=false) {
$src_width = imagesx($src_im);
$src_height = imagesy($src_im);
$src_w=$src_width;
$src_h=$src_height;
$src_x=0;
$src_y=0;
if(
$square){
$dst_w = $maxd;
$dst_h = $maxd;
if(
$src_width>$src_height){
$src_x = ceil(($src_width-$src_height)/2);
$src_w=$src_height;
$src_h=$src_height;
}else{
$src_y = ceil(($src_height-$src_width)/2);
$src_w=$src_width;
$src_h=$src_width;
}
}else{
if(
$src_width>$src_height){
$dst_w=$maxd;
$dst_h=floor($src_height*($dst_w/$src_width));
}else{
$dst_h=$maxd;
$dst_w=floor($src_width*($dst_h/$src_height));
}
}
$dst_im=@imagecreatetruecolor($dst_w,$dst_h);
@
imagecopyresampled($dst_im, $src_im, 0, 0, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);
@
imagejpeg($dst_im,$dpath);
return
$dst_im;
}
?>
asgaroth dot belem at gmail dot com
14 年前
如果你遇到和我一样的麻烦,在重采样图像中出现一些噪音。

然后用 imagecopyresized() 替换 imagecopyresampled() 可以消除噪音,我在这里找到了:http://bugs.php.net/bug.php?id=45030

别问我为什么,但它确实有效。
asgaroth dot belem at gmail dot com
14 年前
关于在调整 PNG 大小的时候保留透明度,这是我唯一有效的方案

<?php imagealphablending($new_watermark, false);
$color = imagecolortransparent($new_watermark, imagecolorallocatealpha($new_watermark, 0, 0, 0, 127));
imagefill($new_watermark, 0, 0, $color);
imagesavealpha($new_watermark, true);
imagecopyresampled($new_watermark, $watermark, 0, 0, 0, 0, $new_watermark_width, $new_watermark_height, imagesx($watermark),imagesy($watermark));
?>

尝试过,但没有成功

<?php imagealphablending($new_watermark, false);
$color = imagecolortransparent($new_watermark, imagecolorallocate($new_watermark, 0, 0, 0));
imagefill($new_watermark, 0, 0, $color);
imagesavealpha($new_watermark, true);
imagecopyresampled($new_watermark, $watermark, 0, 0, 0, 0, $new_watermark_width, $new_watermark_height, imagesx($watermark),imagesy($watermark));
?>

希望对其他人有所帮助。
swizec at swizec dot com
16 年前
我写了一个函数来清理用户上传的图片。它将原始图片保存为大约 800x600 的大小,这样在大多数屏幕上打开时仍然可以显示,它还会制作一个所需大小的缩略图,并将所有图片转换为高质量的 JPEG 格式,以减少带宽使用。

缩略图的制作方式类似于设计师在 Photoshop 中制作缩略图的方式,首先将最麻烦的维度调整到所需的大小,然后裁剪掉其余部分,这样可以保持图片的比例,并且大部分图片会出现在缩略图中。

<?php

// $image 是 $_FILES[ <图像名称> ]
// $imageId 是在数据库或其他地方用于此图像的 ID
// $thumbWidth 和 $thumbHeight 是缩略图的所需尺寸
function processImage( $image, $imageId, $thumbWidth, $thumbHeight )
{
$type = $image[ 'type' ];
$galleryPath = 'images/collection/';

if (
strpos( $type, 'image/' ) === FALSE )
{
// 不是图像
return FALSE;
}
$type = str_replace( 'image/', '', $type );
$createFunc = 'imagecreatefrom' . $type;

$im = $createFunc( $image[ 'tmp_name' ] );

$size = getimagesize( $image[ 'tmp_name' ] );

$w = $size[ 0 ];
$h = $size[ 1 ];
if (
$w > 800 || $h > 600 )
{
// 确保图像不是太大
if ( $w > 800 )
{
$nw = 800;
$nh = ceil( $nw*($h/$w) );
}elseif(
$h > 600 )
{
$nh = 600;
$nw = ceil( $nh*($w/$h) );
}

$im2 = imagecreatetruecolor( $nw, $nh );
imagecopyresampled( $im2, $im, 0, 0, 0, 0, $nw, $nh, $w, $h );
imagedestroy( $im );

$im = $im2;
$w = $nw;
$h = $nh;
}

// 创建缩略图
$tw = $thumbWidth;
$th = $thumbHeight;
$imT = imagecreatetruecolor( $tw, $th );

if (
$tw/$th > $th/$tw )
{
// 较宽
$tmph = $h*($tw/$w);
$temp = imagecreatetruecolor( $tw, $tmph );
imagecopyresampled( $temp, $im, 0, 0, 0, 0, $tw, $tmph, $w, $h ); // 调整大小以匹配宽度
imagecopyresampled( $imT, $temp, 0, 0, 0, $tmph/2-$th/2, $tw, $th, $tw, $th ); // 裁剪
imagedestroy( $temp );
}else
{
// 较高
$tmpw = $w*($th/$h );
$imT = imagecreatetruecolor( $tmpw, $th );
imagecopyresampled( $imT, $im, 0, 0, 0, 0, $tmpw, $h, $w, $h ); // 调整大小以匹配高度
imagecopyresampled( $imT, $temp, 0, 0, $tmpw/2-$tw/2, 0, $tw, $th, $tw, $th ); // 裁剪
imagedestroy( $temp );
}

// 保存图像
imagejpeg( $im, $galleryPath . $imgid . '.jpg', 100 );
imagejpeg( $imT, $galleryPath . $imgid . '_thumb.jpg', 100 );
}

?>
arnar at netvistun dot is
16 年前
一个小的缩略图脚本。允许您指定最大高度和宽度。缩略图将始终为矩形形状,而图像本身将保留其比例。非常干净。

<?php
// 文件
$filename = 'a.jpg';

// 设置最大高度和宽度
$width = 80;
$height = 80;

$thumbsize = 80;

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

// 获取新尺寸
list($width_orig, $height_orig) = getimagesize($filename);

$ratio_orig = $width_orig/$height_orig;

if (
$width/$height > $ratio_orig) {
$width = $height*$ratio_orig;
} else {
$height = $width/$ratio_orig;
}

// 重采样
$image_p = imagecreatetruecolor($thumbsize, $thumbsize);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, -($width/2) + ($thumbsize/2), -($height/2) + ($thumbsize/2), 0, 0, $width, $height, $width_orig, $height_orig);

// 输出
imagejpeg($image_p, null, 100);
?>
MBorgPL at gmail dot com
15 年前
对 zorroswordsman at gmail dot com 的 resize 类进行另一个补充。

该函数将 $_FILES['sent_image'] 作为第一个参数。第二个参数是完整的目标路径。

它只移动图像。

如果成功,它返回目标路径;如果发生任何错误,则返回 false。

<?php
public function move_image($tmp_img, $dest_img)
{
// 验证上传的文件是否为图片
if (strpos($tmp_img['type'], 'image') !== false)
{
// 将上传的文件移动到目标位置
if (move_uploaded_file($tmp_img['tmp_name'], $dest_img)) {
return
$dest_img;
}
}
return
false;
}
?>
MBorg_PL
15 年前
对 zorroswordsman at gmail dot com 的 resize 类和 matt at rees-jenkins dot co dot uk 的补充进行了一些微小的修改。该类可以将图像调整为不同的宽度和高度,而不仅仅是相同的大小。

<?php
// 设置最大图像尺寸(像素)
public function set_size($max_x = 100,$max_y = 100)
{

// 调整大小
if($this->x_input > $max_x || $this->y_input > $max_y)
{

$a= $max_x / $max_y;
$b= $this->x_input / $this->y_input;

if (
$a<$b)
{

$this->x_output = $max_x;
$this->y_output = ($max_x / $this->x_input) * $this->y_input;

}
else
{

$this->y_output = $max_y;
$this->x_output = ($max_y / $this->y_input) * $this->x_input;

}
// 准备就绪

$this->resize = TRUE;

}

// 不调整大小
else { $this->resize = FALSE; }

}
?>

现在该类的使用方法是

<?php

##### 演示 #####

// 图像
$src = "myimage.jpg";

// 开始
$img = new imaging;
$img->set_img($src);
$img->set_quality(80);

// 小型缩略图
$img->set_size(250,150);
$img->save_img("small_250x150_" . $src);

// 小型缩略图
$img->set_size(50,250);
$img->save_img("baby_50x250_" . $src);

// 完成
$img->clear_cache();

?>
matt at rees-jenkins dot co dot uk
15 年前
对 zorroswordsman at gmail dot com 的 resize 类进行了一些微小的修改。它只在宽度和高度都大于所需尺寸时才进行调整大小。这应该可以解决这个问题。

<?php
// 设置最大图像尺寸(像素)
function set_size($size = 100)
{
// 调整大小
if($this->x_input > $size || $this->y_input > $size)
{
// 宽
if($this->x_input >= $this->y_input)
{
$this->x_output = $size;
$this->y_output = ($this->x_output / $this->x_input) * $this->y_input;
}
// 高
else
{
$this->y_output = $size;
$this->x_output = ($this->y_output / $this->y_input) * $this->x_input;
}
// 准备就绪
$this->resize = TRUE;
}
// 不调整大小
else { $this->resize = FALSE; }
}
?>
eblejr AT phrebh DOT com
16 年前
Tim 的代码速度很快,但如果你尝试将重新采样的图像放到左上角以外的任何位置,它就无法正常工作。
crash
16 年前
将 gif 转换为 png 以保留透明度的建议很有用。但是,用于保持透明度的步骤也适用于 gif,因此不需要转换步骤。只需执行相同的操作,然后以 gif 格式保存即可。例如:

<?php
$g_iw 是
new 图像宽度
$g_ih 是
new 图像高度

$img_src
=imagecreatefromgif($g_srcfile);
$img_dst=imagecreatetruecolor($g_iw,$g_ih);

// 保留 alpha
imagecolortransparent($img_dst, imagecolorallocate($img_dst, 0, 0, 0));
imagealphablending($img_dst, false);
imagesavealpha($img_dst, true);
imagecopyresampled($img_dst, $img_src, 0, 0, 0, 0, $g_iw, $g_ih, $g_is[0], $g_is[1]);

imagegif($img_dst, $g_dstfile);
imagedestroy($img_dst);
?>
rich at corephp dot co dot uk
17 年前
在将图像调整大小以使其比原始图像 *更大* 时,请谨慎使用此函数,因为内存消耗速度非常快。例如,一个 200KB 的 JPEG 文件(1024x768)加载后将占用 4MB 的内存,但当重新采样到两倍大小时,内存使用量将跳到 20.1MB。imagecopyresized 也一样。处理真彩色图像时,每个 *像素* 约留出 5 个字节的内存空间。
rayg at daylongraphics dot com
16 年前
这是一个简单的函数,用于将一个 JPEG 图像文件重新采样到另一个 JPEG 图像文件,同时保持源图像在目标图像尺寸内的纵横比。你还可以调整允许的失真度,如果你最终制作了太多周围有薄空白区域的缩略图。在放大图像时也应该可以正常工作。函数返回 true 如果成功,返回 false 如果失败。

function resample_picfile($src, $dst, $w, $h)
{
// 如果失真拉伸在下面的范围内,
// 则允许图像失真。
$lowend = 0.8;
$highend = 1.25;

$src_img = imagecreatefromjpeg($src);
if($src_img)
{
$dst_img = ImageCreateTrueColor($w, $h);
/* 如果你不希望保持纵横比的图像
有黑色背景,请在这里用你选择的颜色填充 $dst_img。
*/

if($dst_img)
{
$src_w = imageSX($src_img);
$src_h = imageSY($src_img);

$scaleX = (float)$w / $src_w;
$scaleY = (float)$h / $src_h;
$scale = min($scaleX, $scaleY);

$dstW = $w;
$dstH = $h;
$dstX = $dstY = 0;

$scaleR = $scaleX / $scaleY;
if($scaleR < $lowend || $scaleR > $highend)
{
$dstW = (int)($scale * $src_w + 0.5);
$dstH = (int)($scale * $src_h + 0.5);

// 保持图片在框架中居中。
$dstX = (int)(0.5 * ($w - $dstW));
$dstY = (int)(0.5 * ($h - $dstH));
}

imagecopyresampled(
$dst_img, $src_img, $dstX, $dstY, 0, 0,
$dstW, $dstH, $src_w, $src_h);
imagejpeg($dst_img, $dst);
imagedestroy($dst_img);
}
imagedestroy($src_img);
return file_exists($dst);
}
return false;
}
matt1walsh DESPAMMER gmail dot com
16 年前
我见过的所有用于调整透明 GIF 大小的东西都不能一致地工作,而且会产生良好的图像。我想到的解决方法很愚蠢,但效果还不错 - 将 GIF 转换为 PNG。这对我有用。

$g_iw 是新的图像宽度
$g_ih 是新的图像高度

$img_src=imagecreatefromgif($g_srcfile);
$img_dst=imagecreatetruecolor($g_iw,$g_ih);

// 保留 alpha
imagecolortransparent($img_dst, imagecolorallocate($img_dst, 0, 0, 0));
imagealphablending($img_dst, false);
imagesavealpha($img_dst, true);
imagecopyresampled($img_dst, $img_src, 0, 0, 0, 0, $g_iw, $g_ih, $g_is[0], $g_is[1]);

imagepng($img_dst, $g_dstfile);
imagedestroy($img_dst);
michael at heymichael dot com
14 年前
imagecopyresampled() 工作得非常好,但这里有一些不要尝试的事情

我编写的调整大小例程会查找像素宽度,并根据以下概念调整图像大小:如果它们的宽度和高度太大,那么它们的大小也会太大。起初效果很好。

但当我看到巨大的字节大小图像在我 1000 像素宽的基准线下方溜走时,我认为如果它们的 filesize() 超过 100K,我会让更小的宽度图像进行调整大小。

想法是,我会“调整”它们的大小,保持它们原来的宽度和高度(即在 (1) 中,$newW = $oldW, $newH = $oldH),并让 (2) 中的“75”降低字节大小。

不要尝试这样做。imagecopyresampled() 会锁定服务器,试图将 800 像素宽的图像调整为“新的”800 像素宽度。(我在将它放到目标 Linux 服务器之前在我的 Windows 服务器上捕获了它,所以请对此持保留态度。)

我的解决方法是让 $newW = ($picW * 0.99) 等等。你会得到你想要的字节大小缩减,而不会锁定服务器。

(1) imagecopyresampled($image_p, $image, 0, 0, 0, 0, $newW, $newH, $picW, $picH);

(2) imagejpeg($image_p, $theFile, 75);
areddan at silverarm dot ie
18 年前
<?php
// 文件
$filein = ''; // 输入文件
$fileout = 'ttt.gif'; // 输出文件 - 可选

$imagethumbsize_w = 100; // 缩略图大小(裁剪图像中央区域)
$imagethumbsize_h = 75; // 缩略图大小(裁剪图像中央区域)
resize_then_crop( $filein,$fileout,$imagethumbsize_w,
$imagethumbsize_h,/*rgb*/"255","255","255");

// 作者 Alan Reddan Silverarm Solutions
// 日期 27/01/2005
// 此函数适用于图像。
// 它会调整图像大小以最佳适应。 例如,如果您有一个 200 X 100 的图像,您想要一个 75 X 50 的缩略图,
// 它会首先将图像调整为 100 X 50
// 然后从输入图像的中心裁剪出一个 75 X 50 的区域。
// 因此,可以保留大量的图像信息。
// 如果您的输入图像是 100 X 200,也会发生同样的情况
// 它会首先将图像调整为 75 X 150,然后从
// 中心裁剪出一个 75 X 75 的区域
// 这里的优点是,函数会自行决定
// 是按宽度还是高度调整大小。
// 它还会决定在缩略图是矩形的情况下,使用高度还是宽度作为基准起点

function resize_then_crop( $filein,$fileout,
$imagethumbsize_w,$imagethumbsize_h,$red,$green,$blue)
{

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

if(
preg_match("/.jpg/i", "$filein"))
{
$format = 'image/jpeg';
}
if (
preg_match("/.gif/i", "$filein"))
{
$format = 'image/gif';
}
if(
preg_match("/.png/i", "$filein"))
{
$format = 'image/png';
}

switch(
$format)
{
case
'image/jpeg':
$image = imagecreatefromjpeg($filein);
break;
case
'image/gif';
$image = imagecreatefromgif($filein);
break;
case
'image/png':
$image = imagecreatefrompng($filein);
break;
}

$width = $imagethumbsize_w ;
$height = $imagethumbsize_h ;
list(
$width_orig, $height_orig) = getimagesize($filein);

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

if (
$width < $imagethumbsize_w)
// 如果宽度小于提供的缩略图大小
{
$width = $imagethumbsize_w;
$height = ($imagethumbsize_w/ $width_orig) * $height_orig;;
}

if (
$height < $imagethumbsize_h)
// 如果高度小于提供的缩略图大小
{
$height = $imagethumbsize_h;
$width = ($imagethumbsize_h / $height_orig) * $width_orig;
}

$thumb = imagecreatetruecolor($width , $height);
$bgcolor = imagecolorallocate($thumb, $red, $green, $blue);
ImageFilledRectangle($thumb, 0, 0, $width, $height, $bgcolor);
imagealphablending($thumb, true);

imagecopyresampled($thumb, $image, 0, 0, 0, 0,
$width, $height, $width_orig, $height_orig);
$thumb2 = imagecreatetruecolor($imagethumbsize_w , $imagethumbsize_h);
// 真彩色,以获得最佳质量
$bgcolor = imagecolorallocate($thumb2, $red, $green, $blue);
ImageFilledRectangle($thumb2, 0, 0,
$imagethumbsize_w , $imagethumbsize_h , $white);
imagealphablending($thumb2, true);

$w1 =($width/2) - ($imagethumbsize_w/2);
$h1 = ($height/2) - ($imagethumbsize_h/2);

imagecopyresampled($thumb2, $thumb, 0,0, $w1, $h1,
$imagethumbsize_w , $imagethumbsize_h ,$imagethumbsize_w, $imagethumbsize_h);

// 输出
//header('Content-type: image/gif');
//imagegif($thumb); // 测试时先将第一个图像输出到浏览器

if ($fileout !="")imagegif($thumb2, $fileout); // 写入文件
header('Content-type: image/gif');
imagegif($thumb2); // 输出到浏览器
}
?>
hoangvu4000 at gmail dot com
11 年前
我完整的函数,用于调整带有 EXIF 数据的图像大小

<?php
function CreateThumbnail($pic,$thumb,$thumbwidth, $quality = 100)
{

$im1=ImageCreateFromJPEG($pic);
if(
function_exists("exif_read_data")){
$exif = exif_read_data($pic);
if(!empty(
$exif['Orientation'])) {
switch(
$exif['Orientation']) {
case
8:
$im1 = imagerotate($im1,90,0);
break;
case
3:
$im1 = imagerotate($im1,180,0);
break;
case
6:
$im1 = imagerotate($im1,-90,0);
break;
}
}
}
$info = @getimagesize($pic);

$width = $info[0];

$w2=ImageSx($im1);
$h2=ImageSy($im1);
$w1 = ($thumbwidth <= $info[0]) ? $thumbwidth : $info[0] ;

$h1=floor($h2*($w1/$w2));
$im2=imagecreatetruecolor($w1,$h1);

imagecopyresampled ($im2,$im1,0,0,0,0,$w1,$h1,$w2,$h2);
$path=addslashes($thumb);
ImageJPEG($im2,$path,$quality);
ImageDestroy($im1);
ImageDestroy($im2);

}
?>
aykuty at gmail dot com
5 年前
根据比例缩放图像,然后通过居中完成画布大小

<?php

/*
根据给定的最大值调整图像大小,并用白色框架居中。 我是为 Trendyol 集成编写的。

Aykut YILDIZGÖRÜR
aykuty add gmail dot com
*/

function set_image2canvas($file, $new_file, $canvas_width=1200, $canvas_height =1800, $quality=100) {

if (!
file_exists( $new_file )) {

list(
$width, $height, $type, $attr) = getimagesize( $file );

if(
$width> $height) {
$width_tt=$canvas_width;
$height_tt=round($height/$width*$canvas_width);
$off_y = ceil(( $canvas_height - $height_tt)/2);
$off_x=0;

} else {
$height_tt=$canvas_height;
$width_tt=round($width/$height*$canvas_height);
$off_x=ceil(($canvas_width - $width_tt)/2);
$off_y=0;
}

$thumb=imagecreatefromjpeg( $file );
$thumb_p = imagecreatetruecolor($canvas_width, $canvas_height);

$bg = imagecolorallocate ( $thumb_p, 255, 255, 255 );
imagefill ( $thumb_p, 0, 0, $bg );
imagecopyresampled($thumb_p, $thumb, $off_x, $off_y, 0, 0, $width_tt, $height_tt, $width, $height);

imagejpeg($thumb_p,$new_file,$quality);

}else{
//目标图片已经存在
return -1;
}
}
?>
Michael Shepanski
16 年前
这里有一个我认为值得分享的函数,它将对图像进行重新采样和复制,并使其具有圆角。

<?php
/** ------------------------------------------------------------
* 复制并重新采样具有圆角的图像。
* ----------------------------------------------------------- */
function imageRoundedCopyResampled(&$dstimg, &$srcimg, $dstx, $dsty, $srcx,
$srcy, $dstw, $dsth, $srcw, $srch, $radius) {
# 调整源图像大小
$srcResized = imagecreatetruecolor($dstw, $dsth);
imagecopyresampled($srcResized, $srcimg, 0, 0, $srcx, $srcy,
$dstw, $dsth, $srcw, $srch);
# 复制主体,不含圆角
imagecopy($dstimg, $srcResized, $dstx+$radius, $dsty,
$radius, 0, $dstw-($radius*2), $dsth);
imagecopy($dstimg, $srcResized, $dstx, $dsty+$radius,
0, $radius, $dstw, $dsth-($radius*2));
# 创建迭代列表;array(array(X1, X2, CenterX, CenterY), ...)
# 迭代顺序:左上角、右上角、左下角、右下角
$iterations = array(
array(
0, 0, $radius, $radius),
array(
$dstw-$radius, 0, $dstw-$radius, $radius),
array(
0, $dsth-$radius, $radius, $dsth-$radius),
array(
$dstw-$radius, $dsth-$radius, $dstw-$radius, $dsth-$radius)
);
# 循环遍历每个角的“迭代”
foreach($iterations as $iteration) {
list(
$x1,$y1,$cx,$cy) = $iteration;
for (
$y=$y1; $y<=$y1+$radius; $y++) {
for (
$x=$x1; $x<=$x1+$radius; $x++) {
# 如果长度 (X,Y)->(CX,CY) 小于半径,则绘制点
$length = sqrt(pow(($cx - $x), 2) + pow(($cy - $y), 2));
if (
$length < $radius) {
imagecopy($dstimg, $srcResized, $x+$dstx, $y+$dsty,
$x, $y, 1, 1);
}
}
}
}
}
?>
To Top