Изменение размера изображений с помощью PHP, поддержка PNG, JPG
Я использую этот класс:
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?
6 ответов
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");
}
Я знаю, что опаздываю на шоу, но это может помочь другим, кто нуждается в том же:
Я написал класс, который будет делать это, и это приятно и легко в использовании. Это называется
PHP Image Magician
$magicianObj = new imageLib('racecar.jpg');
$magicianObj -> resizeImage(100, 200);
$magicianObj -> saveImage('racecar_convertd.png', 100);
Поддерживает чтение и запись (включая преобразование) следующих форматов
- JPG
- PNG
- GIF
- ВМР
И могу только читать
- СДП-х
пример
// Включить библиотеку PHP Image Magician require_once ('php_image_magician.php'); // Открыть изображение JPG $ magicianObj = new imageLib ('racecar.jpg'); // Изменить размер, чтобы лучше всего соответствовать затем обрезать $magicianObj -> resizeImage(100, 200, 'crop'); // Сохранить измененное изображение как PNG $magicianObj -> saveImage('racecar_small.png');
Вы можете попробовать это. В настоящее время предполагается, что изображение всегда будет в формате 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);
}
Попробуйте это, и с помощью этого вы также можете сохранить свое изображение по определенному пути.
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);
?>
Я взял версию П. Гэлбрейта, исправил ошибки и изменил ее размер по площади (ширина х высота). Для себя я хотел изменить размеры изображений, которые слишком велики.
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/
Я проверил функцию, она отлично работает!
В принятом ответе много ошибок
<?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") ;
?>
Я знаю, что это очень старый поток, но я обнаружил, что PHP имеет встроенную функцию масштабирования изображений, которая выполняет требуемую работу. Смотрите документацию здесь
Пример использования:
$temp = imagecreatefrompng('1.png');
$scaled_image= imagescale ( $temp, 200 , 270);
Здесь 200 - это ширина, а 270 - высота измененного изображения.