Php 远程图像大小调整失败
我在我的网页和脚本中有一个图像上传表单(指向“handleImage.php”),这样我就可以在我的服务器上存储图像及其缩略图的完整副本 我注意到它对于不超过500K的图像非常有效,但是对于更大的图像,我无法创建缩略图版本,脚本也无法粘贴在空白页面上(handleImage.php) 我的服务器是阿鲁巴 以下是我的脚本: handleImage.phpPhp 远程图像大小调整失败,php,image,resize,Php,Image,Resize,我在我的网页和脚本中有一个图像上传表单(指向“handleImage.php”),这样我就可以在我的服务器上存储图像及其缩略图的完整副本 我注意到它对于不超过500K的图像非常有效,但是对于更大的图像,我无法创建缩略图版本,脚本也无法粘贴在空白页面上(handleImage.php) 我的服务器是阿鲁巴 以下是我的脚本: handleImage.php if(isset($_POST['id'])) { foreach($_FILES['pictures']['name'] as $numb
if(isset($_POST['id']))
{
foreach($_FILES['pictures']['name'] as $number=>$file)
{
if($_FILES['pictures']['error'][$number]==UPLOAD_ERR_OK)
{
//i need to store full image and small in folder
$ext=pathinfo($_FILES['pictures']['name'][$number],PATHINFO_EXTENSION);
$folder="upload".time();
mkdir('/web/htdocs/www.mysite.it/home/img/events/eventsdone/'.$folder);
$destinationFile="/web/htdocs/www.mysite.it/home/img/events/eventsdone/".$folder."/full.".$ext;
$pathPic="/web/htdocs/www.mysite.it/home/img/events/eventsdone/".$folder."/";
$ret=@move_uploaded_file($_FILES['pictures']['tmp_name'][$number],$destinationFile);
if($ret==FALSE)
{
throw new UploadErrorException();
}
$pathThumb=$pathPic."thumb.".$ext;
$resizemgr = new ResizeManager($destinationFile);
$resizemgr -> resizeImage(200,130, 'crop');
$resizemgr -> saveImage($pathThumb, 100);
[...]
header("Location:event.php?id={$_POST['id']}");
}
}
}
Class ResizeManager
{
// *** Class variables
private $image;
private $width;
private $height;
private $imageResized;
function __construct($fileName)
{
// *** Open up the file
$this->image = $this->openImage($fileName);
// *** Get width and height
$this->width = imagesx($this->image);
$this->height = imagesy($this->image);
}
## --------------------------------------------------------
private function openImage($file)
{
// *** Get extension
$extension = strtolower(strrchr($file, '.'));
switch($extension)
{
case '.jpg':
case '.jpeg':
$img = @imagecreatefromjpeg($file);
break;
case '.gif':
$img = @imagecreatefromgif($file);
break;
case '.png':
$img = @imagecreatefrompng($file);
break;
default:
$img = false;
break;
}
return $img;
}
## --------------------------------------------------------
public function resizeImage($newWidth, $newHeight, $option="auto")
{
// *** Get optimal width and height - based on $option
$optionArray = $this->getDimensions($newWidth, $newHeight, $option);
$optimalWidth = $optionArray['optimalWidth'];
$optimalHeight = $optionArray['optimalHeight'];
// *** Resample - create image canvas of x, y size
$this->imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight);
imagecopyresampled($this->imageResized, $this->image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this->width, $this->height);
// *** if option is 'crop', then crop too
if ($option == 'crop') {
$this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight);
}
}
## --------------------------------------------------------
private function getDimensions($newWidth, $newHeight, $option)
{
switch ($option)
{
case 'exact':
$optimalWidth = $newWidth;
$optimalHeight= $newHeight;
break;
case 'portrait':
$optimalWidth = $this->getSizeByFixedHeight($newHeight);
$optimalHeight= $newHeight;
break;
case 'landscape':
$optimalWidth = $newWidth;
$optimalHeight= $this->getSizeByFixedWidth($newWidth);
break;
case 'auto':
$optionArray = $this->getSizeByAuto($newWidth, $newHeight);
$optimalWidth = $optionArray['optimalWidth'];
$optimalHeight = $optionArray['optimalHeight'];
break;
case 'crop':
$optionArray = $this->getOptimalCrop($newWidth, $newHeight);
$optimalWidth = $optionArray['optimalWidth'];
$optimalHeight = $optionArray['optimalHeight'];
break;
}
return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
}
## --------------------------------------------------------
private function getSizeByFixedHeight($newHeight)
{
$ratio = $this->width / $this->height;
$newWidth = $newHeight * $ratio;
return $newWidth;
}
private function getSizeByFixedWidth($newWidth)
{
$ratio = $this->height / $this->width;
$newHeight = $newWidth * $ratio;
return $newHeight;
}
private function getSizeByAuto($newWidth, $newHeight)
{
if ($this->height < $this->width)
// *** Image to be resized is wider (landscape)
{
$optimalWidth = $newWidth;
$optimalHeight= $this->getSizeByFixedWidth($newWidth);
}
elseif ($this->height > $this->width)
// *** Image to be resized is taller (portrait)
{
$optimalWidth = $this->getSizeByFixedHeight($newHeight);
$optimalHeight= $newHeight;
}
else
// *** Image to be resizerd is a square
{
if ($newHeight < $newWidth) {
$optimalWidth = $newWidth;
$optimalHeight= $this->getSizeByFixedWidth($newWidth);
} else if ($newHeight > $newWidth) {
$optimalWidth = $this->getSizeByFixedHeight($newHeight);
$optimalHeight= $newHeight;
} else {
// *** Sqaure being resized to a square
$optimalWidth = $newWidth;
$optimalHeight= $newHeight;
}
}
return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
}
## --------------------------------------------------------
private function getOptimalCrop($newWidth, $newHeight)
{
$heightRatio = $this->height / $newHeight;
$widthRatio = $this->width / $newWidth;
if ($heightRatio < $widthRatio) {
$optimalRatio = $heightRatio;
} else {
$optimalRatio = $widthRatio;
}
$optimalHeight = $this->height / $optimalRatio;
$optimalWidth = $this->width / $optimalRatio;
return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
}
## --------------------------------------------------------
private function crop($optimalWidth, $optimalHeight, $newWidth, $newHeight)
{
// *** Find center - this will be used for the crop
$cropStartX = ( $optimalWidth / 2) - ( $newWidth /2 );
$cropStartY = ( $optimalHeight/ 2) - ( $newHeight/2 );
$crop = $this->imageResized;
//imagedestroy($this->imageResized);
// *** Now crop from center to exact requested size
$this->imageResized = imagecreatetruecolor($newWidth , $newHeight);
imagecopyresampled($this->imageResized, $crop , 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight , $newWidth, $newHeight);
}
## --------------------------------------------------------
public function saveImage($savePath, $imageQuality="100")
{
// *** Get extension
$extension = strrchr($savePath, '.');
$extension = strtolower($extension);
switch($extension)
{
case '.jpg':
case '.jpeg':
if (imagetypes() & IMG_JPG) {
imagejpeg($this->imageResized, $savePath, $imageQuality);
}
break;
case '.gif':
if (imagetypes() & IMG_GIF) {
imagegif($this->imageResized, $savePath);
}
break;
case '.png':
// *** Scale quality from 0-100 to 0-9
$scaleQuality = round(($imageQuality/100) * 9);
// *** Invert quality setting as 0 is best, not 9
$invertScaleQuality = 9 - $scaleQuality;
if (imagetypes() & IMG_PNG) {
imagepng($this->imageResized, $savePath, $invertScaleQuality);
}
break;
// ... etc
default:
// *** No extension - No save.
break;
}
imagedestroy($this->imageResized);
}
## --------------------------------------------------------
}
}
resizeManager.php
if(isset($_POST['id']))
{
foreach($_FILES['pictures']['name'] as $number=>$file)
{
if($_FILES['pictures']['error'][$number]==UPLOAD_ERR_OK)
{
//i need to store full image and small in folder
$ext=pathinfo($_FILES['pictures']['name'][$number],PATHINFO_EXTENSION);
$folder="upload".time();
mkdir('/web/htdocs/www.mysite.it/home/img/events/eventsdone/'.$folder);
$destinationFile="/web/htdocs/www.mysite.it/home/img/events/eventsdone/".$folder."/full.".$ext;
$pathPic="/web/htdocs/www.mysite.it/home/img/events/eventsdone/".$folder."/";
$ret=@move_uploaded_file($_FILES['pictures']['tmp_name'][$number],$destinationFile);
if($ret==FALSE)
{
throw new UploadErrorException();
}
$pathThumb=$pathPic."thumb.".$ext;
$resizemgr = new ResizeManager($destinationFile);
$resizemgr -> resizeImage(200,130, 'crop');
$resizemgr -> saveImage($pathThumb, 100);
[...]
header("Location:event.php?id={$_POST['id']}");
}
}
}
Class ResizeManager
{
// *** Class variables
private $image;
private $width;
private $height;
private $imageResized;
function __construct($fileName)
{
// *** Open up the file
$this->image = $this->openImage($fileName);
// *** Get width and height
$this->width = imagesx($this->image);
$this->height = imagesy($this->image);
}
## --------------------------------------------------------
private function openImage($file)
{
// *** Get extension
$extension = strtolower(strrchr($file, '.'));
switch($extension)
{
case '.jpg':
case '.jpeg':
$img = @imagecreatefromjpeg($file);
break;
case '.gif':
$img = @imagecreatefromgif($file);
break;
case '.png':
$img = @imagecreatefrompng($file);
break;
default:
$img = false;
break;
}
return $img;
}
## --------------------------------------------------------
public function resizeImage($newWidth, $newHeight, $option="auto")
{
// *** Get optimal width and height - based on $option
$optionArray = $this->getDimensions($newWidth, $newHeight, $option);
$optimalWidth = $optionArray['optimalWidth'];
$optimalHeight = $optionArray['optimalHeight'];
// *** Resample - create image canvas of x, y size
$this->imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight);
imagecopyresampled($this->imageResized, $this->image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this->width, $this->height);
// *** if option is 'crop', then crop too
if ($option == 'crop') {
$this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight);
}
}
## --------------------------------------------------------
private function getDimensions($newWidth, $newHeight, $option)
{
switch ($option)
{
case 'exact':
$optimalWidth = $newWidth;
$optimalHeight= $newHeight;
break;
case 'portrait':
$optimalWidth = $this->getSizeByFixedHeight($newHeight);
$optimalHeight= $newHeight;
break;
case 'landscape':
$optimalWidth = $newWidth;
$optimalHeight= $this->getSizeByFixedWidth($newWidth);
break;
case 'auto':
$optionArray = $this->getSizeByAuto($newWidth, $newHeight);
$optimalWidth = $optionArray['optimalWidth'];
$optimalHeight = $optionArray['optimalHeight'];
break;
case 'crop':
$optionArray = $this->getOptimalCrop($newWidth, $newHeight);
$optimalWidth = $optionArray['optimalWidth'];
$optimalHeight = $optionArray['optimalHeight'];
break;
}
return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
}
## --------------------------------------------------------
private function getSizeByFixedHeight($newHeight)
{
$ratio = $this->width / $this->height;
$newWidth = $newHeight * $ratio;
return $newWidth;
}
private function getSizeByFixedWidth($newWidth)
{
$ratio = $this->height / $this->width;
$newHeight = $newWidth * $ratio;
return $newHeight;
}
private function getSizeByAuto($newWidth, $newHeight)
{
if ($this->height < $this->width)
// *** Image to be resized is wider (landscape)
{
$optimalWidth = $newWidth;
$optimalHeight= $this->getSizeByFixedWidth($newWidth);
}
elseif ($this->height > $this->width)
// *** Image to be resized is taller (portrait)
{
$optimalWidth = $this->getSizeByFixedHeight($newHeight);
$optimalHeight= $newHeight;
}
else
// *** Image to be resizerd is a square
{
if ($newHeight < $newWidth) {
$optimalWidth = $newWidth;
$optimalHeight= $this->getSizeByFixedWidth($newWidth);
} else if ($newHeight > $newWidth) {
$optimalWidth = $this->getSizeByFixedHeight($newHeight);
$optimalHeight= $newHeight;
} else {
// *** Sqaure being resized to a square
$optimalWidth = $newWidth;
$optimalHeight= $newHeight;
}
}
return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
}
## --------------------------------------------------------
private function getOptimalCrop($newWidth, $newHeight)
{
$heightRatio = $this->height / $newHeight;
$widthRatio = $this->width / $newWidth;
if ($heightRatio < $widthRatio) {
$optimalRatio = $heightRatio;
} else {
$optimalRatio = $widthRatio;
}
$optimalHeight = $this->height / $optimalRatio;
$optimalWidth = $this->width / $optimalRatio;
return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
}
## --------------------------------------------------------
private function crop($optimalWidth, $optimalHeight, $newWidth, $newHeight)
{
// *** Find center - this will be used for the crop
$cropStartX = ( $optimalWidth / 2) - ( $newWidth /2 );
$cropStartY = ( $optimalHeight/ 2) - ( $newHeight/2 );
$crop = $this->imageResized;
//imagedestroy($this->imageResized);
// *** Now crop from center to exact requested size
$this->imageResized = imagecreatetruecolor($newWidth , $newHeight);
imagecopyresampled($this->imageResized, $crop , 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight , $newWidth, $newHeight);
}
## --------------------------------------------------------
public function saveImage($savePath, $imageQuality="100")
{
// *** Get extension
$extension = strrchr($savePath, '.');
$extension = strtolower($extension);
switch($extension)
{
case '.jpg':
case '.jpeg':
if (imagetypes() & IMG_JPG) {
imagejpeg($this->imageResized, $savePath, $imageQuality);
}
break;
case '.gif':
if (imagetypes() & IMG_GIF) {
imagegif($this->imageResized, $savePath);
}
break;
case '.png':
// *** Scale quality from 0-100 to 0-9
$scaleQuality = round(($imageQuality/100) * 9);
// *** Invert quality setting as 0 is best, not 9
$invertScaleQuality = 9 - $scaleQuality;
if (imagetypes() & IMG_PNG) {
imagepng($this->imageResized, $savePath, $invertScaleQuality);
}
break;
// ... etc
default:
// *** No extension - No save.
break;
}
imagedestroy($this->imageResized);
}
## --------------------------------------------------------
}
Class ResizeManager
{
//***类变量
私人图像;
私有宽度;
私家车$height;
私有$imageResized;
函数构造($fileName)
{
//***打开文件
$this->image=$this->openImage($fileName);
//***获取宽度和高度
$this->width=imagesx($this->image);
$this->height=imagesy($this->image);
}
## --------------------------------------------------------
私有函数openImage($file)
{
//***获得分机
$extension=strtolower(strrchr($file,'.');
交换机($分机)
{
案例“.jpg”:
大小写“.jpeg”:
$img=@imagecreatefromjpeg($file);
打破
大小写“.gif”:
$img=@imagecreatefromformgif($file);
打破
大小写“.png”:
$img=@imagecreatefrompng($file);
打破
违约:
$img=假;
打破
}
返回$img;
}
## --------------------------------------------------------
公共函数resizeImage($newWidth、$newHeight、$option=“auto”)
{
//***获得最佳宽度和高度-基于$option
$optionArray=$this->getDimensions($newWidth,$newHeight,$option);
$optimizeWidth=$optionArray['optimizeWidth'];
$optimalHeight=$optionArray['optimalHeight'];
//***重采样-创建x、y大小的图像画布
$this->imagesized=imageCreateTureColor($optimizeWidth,$optimizeHeight);
imagecopyresampled($this->imageResized,$this->image,0,0,0,$optimalWidth,$optimalHeight,$this->width,$this->height);
//***如果选项为“裁剪”,则也要裁剪
如果($option=='crop'){
$this->crop($optimalWidth,$optimalHeight,$newWidth,$newHeight);
}
}
## --------------------------------------------------------
私有函数getDimensions($newWidth、$newHeight、$option)
{
交换机($选项)
{
“准确”案例:
$optimalWidth=$newWidth;
$optimalHeight=$newHeight;
打破
“肖像”一案:
$optimalWidth=$this->getSizeByFixedHeight($newHeight);
$optimalHeight=$newHeight;
打破
“景观”案例:
$optimalWidth=$newWidth;
$optimalHeight=$this->getSizeByFixedWidth($newWidth);
打破
“自动”案例:
$optionArray=$this->getSizeByAuto($newWidth,$newHeight);
$optimizeWidth=$optionArray['optimizeWidth'];
$optimalHeight=$optionArray['optimalHeight'];
打破
“作物”案例:
$optionArray=$this->getOptimalCrop($newWidth,$newHeight);
$optimizeWidth=$optionArray['optimizeWidth'];
$optimalHeight=$optionArray['optimalHeight'];
打破
}
返回数组('optimalWidth'=>$optimalWidth,'optimalHeight'=>$optimalHeight);
}
## --------------------------------------------------------
私有函数getSizeByFixedHeight($newHeight)
{
$ratio=$this->width/$this->height;
$newWidth=$newHeight*$ratio;
返回$newWidth;
}
私有函数getSizeByFixedWidth($newWidth)
{
$ratio=$this->height/$this->width;
$newHeight=$newWidth*$ratio;
返回$newHeight;
}
私有函数getSizeByAuto($newWidth,$newHeight)
{
如果($this->height<$this->width)
//***要调整大小的图像更宽(横向)
{
$optimalWidth=$newWidth;
$optimalHeight=$this->getSizeByFixedWidth($newWidth);
}
elseif($this->height>$this->width)
//***要调整大小的图像较高(纵向)
{
$optimalWidth=$this->getSizeByFixedHeight($newHeight);
$optimalHeight=$newHeight;
}
其他的
//***要调整大小的图像为正方形
{
如果($newHeight<$newWidth){
$optimalWidth=$newWidth;
$optimalHeight=$this->getSizeByFixedWidth($newWidth);
}else if($newHeight>$newWidth){
$optimalWidth=$this->getSizeByFixedHeight($newHeight);
$optimalHeight=$newHeight;
}否则{
//***Sqaure正在调整为正方形
$optimalWidth=$newWidth;
$optimalHeight=$newHeight;
}
}
返回数组('optimalWidth'=>$optimalWidth,'optimalHeight'=>$optimalHeight);
}
## --------------------------------------------------------
私有函数getOptimalCrop($newWidth,$newHeight)
{
$heightRatio=$this-