我正在使用这个课程:
class ImgResizer {
function ImgResizer($originalFile = '$newName') {
$this -> originalFile = $originalFile;
}
function resize($newWidth, $targetFile) {
if (empty($newWidth) || empty($targetFile)) {
return false;
}
$src = imagecreatefromjpeg($this -> originalFile);
list($width, $height) = getimagesize($this -> originalFile);
$newHeight = ($height / $width) * $newWidth;
$tmp = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($tmp, $src, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
if (file_exists($targetFile)) {
unlink($targetFile);
}
imagejpeg($tmp, $targetFile, 95);
}
}
效果很好,但是png失败了,它会创建一个调整大小的黑色图像。
有没有办法调整这个类来支持png图像?
答案 0 :(得分:41)
function resize($newWidth, $targetFile, $originalFile) {
$info = getimagesize($originalFile);
$mime = $info['mime'];
switch ($mime) {
case 'image/jpeg':
$image_create_func = 'imagecreatefromjpeg';
$image_save_func = 'imagejpeg';
$new_image_ext = 'jpg';
break;
case 'image/png':
$image_create_func = 'imagecreatefrompng';
$image_save_func = 'imagepng';
$new_image_ext = 'png';
break;
case 'image/gif':
$image_create_func = 'imagecreatefromgif';
$image_save_func = 'imagegif';
$new_image_ext = 'gif';
break;
default:
throw new Exception('Unknown image type.');
}
$img = $image_create_func($originalFile);
list($width, $height) = getimagesize($originalFile);
$newHeight = ($height / $width) * $newWidth;
$tmp = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($tmp, $img, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
if (file_exists($targetFile)) {
unlink($targetFile);
}
$image_save_func($tmp, "$targetFile.$new_image_ext");
}
答案 1 :(得分:12)
我已经编写了一个可以做到这一点并且很好且易于使用的类。它被称为
的 PHP Image Magician 强>
$magicianObj = new imageLib('racecar.jpg');
$magicianObj -> resizeImage(100, 200);
$magicianObj -> saveImage('racecar_convertd.png', 100);
它支持读写(包括转换)以下格式
并且只能阅读
示例强>
// Include PHP Image Magician library
require_once('php_image_magician.php');
// Open JPG image
$magicianObj = new imageLib('racecar.jpg');
// Resize to best fit then crop
$magicianObj -> resizeImage(100, 200, 'crop');
// Save resized image as a PNG
$magicianObj -> saveImage('racecar_small.png');
答案 2 :(得分:6)
你可以试试这个。目前它假设图像永远是jpeg。这将允许您加载jpeg,png或gif。我没有测试但它应该工作。
function resize($newWidth, $targetFile) {
if (empty($newWidth) || empty($targetFile)) {
return false;
}
$fileHandle = @fopen($this->originalFile, 'r');
//error loading file
if(!$fileHandle) {
return false;
}
$src = imagecreatefromstring(stream_get_contents($fileHandle));
fclose($fileHandle);
//error with loading file as image resource
if(!$src) {
return false;
}
//get image size from $src handle
list($width, $height) = array(imagesx($src), imagesy($src));
$newHeight = ($height / $width) * $newWidth;
$tmp = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($tmp, $src, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
//allow transparency for pngs
imagealphablending($tmp, false);
imagesavealpha($tmp, true);
if (file_exists($targetFile)) {
unlink($targetFile);
}
//handle different image types.
//imagepng() uses quality 0-9
switch(strtolower(pathinfo($this->originalFile, PATHINFO_EXTENSION))) {
case 'jpg':
case 'jpeg':
imagejpeg($tmp, $targetFile, 95);
break;
case 'png':
imagepng($tmp, $targetFile, 8.5);
break;
case 'gif':
imagegif($tmp, $targetFile);
break;
}
//destroy image resources
imagedestroy($tmp);
imagedestroy($src);
}
答案 3 :(得分:1)
我使用了P. Galbraith的版本,修正了错误并将其更改为按区域(宽x高)调整大小。对于我自己,我想重新调整太大的图像。
function resizeByArea($originalFile,$targetFile){
$newArea = 375000; //a little more than 720 x 480
list($width,$height,$type) = getimagesize($originalFile);
$area = $width * $height;
if($area > $newArea){
if($width > $height){ $big = $width; $small = $height; }
if($width < $height){ $big = $height; $small = $width; }
$ratio = $big / $small;
$newSmall = sqrt(($newArea*$small)/$big);
$newBig = $ratio*$newSmall;
if($width > $height){ $newWidth = round($newBig, 0); $newHeight = round($newSmall, 0); }
if($width < $height){ $newWidth = round($newSmall, 0); $newHeight = round($newBig, 0); }
}
switch ($type) {
case '2':
$image_create_func = 'imagecreatefromjpeg';
$image_save_func = 'imagejpeg';
$new_image_ext = '.jpg';
break;
case '3':
$image_create_func = 'imagecreatefrompng';
// $image_save_func = 'imagepng';
// The quality is too high with "imagepng"
// but you need it if you want to allow transparency
$image_save_func = 'imagejpeg';
$new_image_ext = '.png';
break;
case '1':
$image_create_func = 'imagecreatefromgif';
$image_save_func = 'imagegif';
$new_image_ext = '.gif';
break;
default:
throw Exception('Unknown image type.');
}
$img = $image_create_func($originalFile);
$tmp = imagecreatetruecolor($newWidth,$newHeight);
imagecopyresampled( $tmp, $img, 0, 0, 0, 0,$newWidth,$newHeight, $width, $height );
ob_start();
$image_save_func($tmp);
$i = ob_get_clean();
// if file exists, create a new one with "1" at the end
if (file_exists($targetFile.$new_image_ext)){
$targetFile = $targetFile."1".$new_image_ext;
}
else{
$targetFile = $targetFile.$new_image_ext;
}
$fp = fopen ($targetFile,'w');
fwrite ($fp, $i);
fclose ($fp);
unlink($originalFile);
}
如果您想允许透明度,请查看:http://www.akemapa.com/2008/07/10/php-gd-resize-transparent-image-png-gif/
我测试了这个功能,它运行正常!
答案 4 :(得分:0)
接受的答案有很多错误,这是固定的
<?php
function resize($newWidth, $targetFile, $originalFile) {
$info = getimagesize($originalFile);
$mime = $info['mime'];
switch ($mime) {
case 'image/jpeg':
$image_create_func = 'imagecreatefromjpeg';
$image_save_func = 'imagejpeg';
$new_image_ext = 'jpg';
break;
case 'image/png':
$image_create_func = 'imagecreatefrompng';
$image_save_func = 'imagepng';
$new_image_ext = 'png';
break;
case 'image/gif':
$image_create_func = 'imagecreatefromgif';
$image_save_func = 'imagegif';
$new_image_ext = 'gif';
break;
default:
throw Exception('Unknown image type.');
}
$img = $image_create_func($originalFile);
list($width, $height) = getimagesize($originalFile);
$newHeight = ($height / $width) * $newWidth;
$tmp = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($tmp, $img, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
if (file_exists($targetFile)) {
unlink($targetFile);
}
$image_save_func($tmp, "$targetFile.$new_image_ext");
}
$img=$_REQUEST['img'];
$id=$_REQUEST['id'];
// echo $img
resize(120, $_SERVER['DOCUMENT_ROOT'] ."/images/$id",$_SERVER['DOCUMENT_ROOT'] ."/images/$img") ;
?>
答案 5 :(得分:0)
尝试使用此功能,您也可以将图像保存到特定路径。
function resize($file, $imgpath, $width, $height){
/* Get original image x y*/
list($w, $h) = getimagesize($file['tmp_name']);
/* calculate new image size with ratio */
$ratio = max($width/$w, $height/$h);
$h = ceil($height / $ratio);
$x = ($w - $width / $ratio) / 2;
$w = ceil($width / $ratio);
/* new file name */
$path = $imgpath;
/* read binary data from image file */
$imgString = file_get_contents($file['tmp_name']);
/* create image from string */
$image = imagecreatefromstring($imgString);
$tmp = imagecreatetruecolor($width, $height);
imagecopyresampled($tmp, $image, 0, 0, $x, 0, $width, $height, $w, $h);
/* Save image */
switch ($file['type']) {
case 'image/jpeg':
imagejpeg($tmp, $path, 100);
break;
case 'image/png':
imagepng($tmp, $path, 0);
break;
case 'image/gif':
imagegif($tmp, $path);
break;
default:
//exit;
break;
}
return $path;
/* cleanup memory */
imagedestroy($image);
imagedestroy($tmp);
}
现在您需要在保存图像的同时调用此功能...
<?php
//$imgpath = "Where you want to save your image";
resize($_FILES["image"], $imgpath, 340, 340);
?>
答案 6 :(得分:0)
我知道这是一个非常老的线程,但是我发现PHP内置了imagescale功能,可以完成所需的工作。请参阅文档here
用法示例:
$temp = imagecreatefrompng('1.png');
$scaled_image= imagescale ( $temp, 200 , 270);
这里200是宽度,270是调整大小后的图像的高度。