php - 调整大小并保存图像?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/11216672/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
php - resize and save an image?
提问by user1481850
Possible Duplicate:
Resize a picture to a fixed size
可能的重复:
将图片调整为固定大小
I am using the following php code to resize (the width) and save an image, the code is working no error but the image is not getting resized.
我正在使用以下 php 代码来调整大小(宽度)并保存图像,代码工作没有错误,但图像没有调整大小。
<?php
$old_path = "users_images/".$name.".".$type;
$new_path = "main_images/".$name.".".$type;
$image_size = getimagesize($new_path);
if($image_size['0'] > 700){
$image_size['0'] = 700;
}
rename($old_path, $new_path);// save image
?>
basically if the image width is grater than 700 I want to set it to 700 ? what I am doing wrong ?
基本上,如果图像宽度大于 700,我想将其设置为 700 吗?我做错了什么?
回答by Deltik
The variable $image_size['0']is not a reference to the actual image size.
该变量$image_size['0']不是对实际图像大小的引用。
You'll need to calculate the ratio of the dimensions, then resize it with an appropriate function that resizes images, probably in the GD library.
您需要计算尺寸的比率,然后使用适当的调整图像大小的函数来调整它的大小,可能在GD 库中。
First, you'll have to load the image. I'll let you choose what the type is:
首先,您必须加载图像。我会让你选择什么类型:
$image = imagecreatefromjpeg($new_path);
$image = imagecreatefromgif($new_path);
$image = imagecreatefrompng($new_path);
Now calculate the ratio:
现在计算比率:
$ratio = 700 / imagesx($image); // 700 for the width you want...
// imagesx() to determine the current width
Get the scaled height:
获取缩放高度:
$height = imagesy($image) * $ratio; // imagesy() to determine the current height
Do the actual resize:
做实际的调整大小:
$new_image = imagecreatetruecolor($width, $height);
imagecopyresampled($new_image, $image, 0, 0, 0, 0, $width, $height, imagesx($image), imagesy($image));
$image = $new_image; // $image has now been replaced with the resized one.
I found a simple class for resizing images. To protect from link rotting, I have recreated it here:
我找到了一个用于调整图像大小的简单类。为了防止链接腐烂,我在这里重新创建了它:
<?php
/*
* File: SimpleImage.php
* Author: Simon Jarvis
* Copyright: 2006 Simon Jarvis
* Date: 08/11/06
* Link: http://www.white-hat-web-design.co.uk/articles/php-image-resizing.php
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details:
* http://www.gnu.org/licenses/gpl.html
*
*/
class SimpleImage {
var $image;
var $image_type;
function load($filename) {
$image_info = getimagesize($filename);
$this->image_type = $image_info[2];
if( $this->image_type == IMAGETYPE_JPEG ) {
$this->image = imagecreatefromjpeg($filename);
} elseif( $this->image_type == IMAGETYPE_GIF ) {
$this->image = imagecreatefromgif($filename);
} elseif( $this->image_type == IMAGETYPE_PNG ) {
$this->image = imagecreatefrompng($filename);
}
}
function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {
if( $image_type == IMAGETYPE_JPEG ) {
imagejpeg($this->image,$filename,$compression);
} elseif( $image_type == IMAGETYPE_GIF ) {
imagegif($this->image,$filename);
} elseif( $image_type == IMAGETYPE_PNG ) {
imagepng($this->image,$filename);
}
if( $permissions != null) {
chmod($filename,$permissions);
}
}
function output($image_type=IMAGETYPE_JPEG) {
if( $image_type == IMAGETYPE_JPEG ) {
imagejpeg($this->image);
} elseif( $image_type == IMAGETYPE_GIF ) {
imagegif($this->image);
} elseif( $image_type == IMAGETYPE_PNG ) {
imagepng($this->image);
}
}
function getWidth() {
return imagesx($this->image);
}
function getHeight() {
return imagesy($this->image);
}
function resizeToHeight($height) {
$ratio = $height / $this->getHeight();
$width = $this->getWidth() * $ratio;
$this->resize($width,$height);
}
function resizeToWidth($width) {
$ratio = $width / $this->getWidth();
$height = $this->getheight() * $ratio;
$this->resize($width,$height);
}
function scale($scale) {
$width = $this->getWidth() * $scale/100;
$height = $this->getheight() * $scale/100;
$this->resize($width,$height);
}
function resize($width,$height) {
$new_image = imagecreatetruecolor($width, $height);
imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
$this->image = $new_image;
}
}
?>
回答by Stan
You are setting a variable, not resizing image. I dug up some old function, you need to pass image object, save path, image name, max height, max width and quality. It's not the best function, but it get's the job done.
您正在设置一个变量,而不是调整图像大小。我挖了一些旧函数,你需要传递图像对象、保存路径、图像名称、最大高度、最大宽度和质量。这不是最好的功能,但它完成了工作。
function resizeImage($imgObject, $savePath, $imgName, $imgMaxWidth, $imgMaxHeight, $imgQuality)
{
$source = imagecreatefromjpeg($imgObject['tmp_name']);
list($imgWidth, $imgHeight) = getimagesize($imgObject['tmp_name']);
$imgAspectRatio = $imgWidth / $imgHeight;
if ($imgMaxWidth / $imgMaxHeight > $imgAspectRatio)
{
$imgMaxWidth = $imgMaxHeight * $imgAspectRatio;
}
else
{
$imgMaxHeight = $imgMaxWidth / $imgAspectRatio;
}
$image_p = imagecreatetruecolor($imgMaxWidth, $imgMaxHeight);
$image = imagecreatefromjpeg($imgObject['tmp_name']);
imagecopyresampled($image_p, $source, 0, 0, 0, 0, $imgMaxWidth, $imgMaxHeight, $imgWidth, $imgHeight);
imagejpeg($image_p, $savePath . $imgName, $imgQuality);
unset($imgObject);
unset($source);
unset($image_p);
unset($image);
}
回答by Dutow
You should copy / move the image with the imagecopyresampledfunction, which is part of the GD extension.
您应该使用imagecopyresampled函数复制/移动图像,该函数是 GD 扩展的一部分。

