Как изменить размер BMP, TIFF изображения с помощью библиотеки GD? а также упоминание об imagemagick, который хорошо использовать
Мне нужно знать, какой лучше GD или ImageMagick, чтобы изменить размер изображения
4 ответа
Мне нравится ImageMagick лучше. Но я знаю, GD это тоже неплохо.
Вот пример того, как изменить размер изображения с помощью PHP:
<?php
if(!extension_loaded('imagick')) {
dl('imagick.so');
}
$img = strip_tags($_GET['imagename']);
if(isset($_GET['size'])) {
$size = strip_tags($_GET['size']);
} else {
$size = 0;
}
if(isset($_GET['vsize'])) {
$vsize = strip_tags($_GET['vsize']);
} else {
$vsize = 0;
}
$image = new Imagick($img);
$image->thumbnailImage($size, $vsize);
header("Content-type: image/png");
print $image;
?>
Вот ссылка, откуда я взял пример. Просто скопировал это, чтобы иметь право в вопросе. Все кредиты идут к человеку, который написал это.
"Лучше" - это субъективный термин. Многие алгоритмы изменения размера могут обеспечить лучшее качество за счет более высокого времени обработки. Так что решите, какие атрибуты вы хотите (хорошее качество или быстрое время отклика), и посмотрите на результаты каждой библиотеки.
Ниже приведен краткий текст, написанный мной на PHP. Я убрал биты, которые добавляют тени и границы (не думаю, что я сломал это, но не проверял). Это использует библиотеку GD в PHP, и я всегда был доволен результатами.
NB: Вы, вероятно, можете вырезать больше - например, он устанавливает цвет BG для миниатюры, чтобы он соответствовал фону страницы, и т. Д...
В этом случае это будет называться так:
thumbnail.php?size=400&image=SomeImage.jpg
Единственная небольшая проблема заключается в том, что с большими файлами (то есть очень высокого качества от современных цифровых камер) могут возникнуть проблемы с памятью. Однако я редко сталкиваюсь с этой проблемой - обычно пользователь не может загрузить что-либо такого размера, поскольку веб-сервер этого не допустит.
<?php
$defaultsize = 400;
$defaultimage = "images/error.jpg";
ini_set("memory_limit", "32M");
$red = isset($_REQUEST['r']) ? $_REQUEST['r'] : 255;
$green = isset($_REQUEST['g']) ? $_REQUEST['g'] : 255;
$blue = isset($_REQUEST['b']) ? $_REQUEST['b'] : 255;
if(!isset($_REQUEST['size'])) {
$maxWidth=$defaultsize;
$maxHeight=$defaultsize;
} else {
$maxWidth=$_REQUEST['size'];
$maxHeight=$_REQUEST['size'];
}
if(!isset($_REQUEST['image'])) {
$picurl = $defaultimage;
} else {
$picurl = "../" . stripslashes($_REQUEST['image']);
}
//Find out about source file
$srcDetails = @getimagesize($picurl);
if($srcDetails) {
$srcWidth=$srcDetails[0];
$srcHeight=$srcDetails[1];
} else {
$srcWidth=$maxWidth;
$srcHeight=$maxHeight;
}
if($srcWidth/$srcHeight < $maxWidth/$maxHeight) {
//Too wide
$width = $maxHeight / $srcHeight * $srcWidth;
$height = $maxHeight / $srcHeight * $srcHeight;
} else {
//Too tall
$width = $maxWidth / $srcWidth * $srcWidth;
$height = $maxWidth / $srcWidth * $srcHeight;
}
switch ($srcDetails[2]) {
case 1: //GIF
$srcImage = ImagecreateFromGIF($picurl);
break;
case 2: //JPEG
$srcImage = ImagecreateFromJPEG($picurl);
break;
case 3: //PNG
$srcImage = ImagecreateFromPNG($picurl);
break;
case 6: //WBMP
$srcImage = ImagecreateFromWBMP($picurl);
break;
default:
//Possibly add some "Unknown File Type" error code here. However, if we do't return an image, we will error nicely later anyway
break;
}
if(@!$srcImage) {
// The nice error for no source image (include error mail to yourself here if you want...)
$srcImage = imagecreate($maxWidth, $maxHeight); /* Create a blank image */
$bgc = imagecolorallocate($srcImage, 255, 255, 255);
$tc = imagecolorallocate($srcImage, 0, 0, 0);
imagefilledrectangle($srcImage, 0, 0, 150, 30, $bgc);
/* Output an errmsg */
imagestring($srcImage, 4, 5, 5, "Error resizing image", $tc);
imagestring($srcImage, 4, 5, 20, "Tech support department", $tc);
imagestring($srcImage, 4, 5, 35, "has been informed", $tc);
}
//Create thumbnail
$thumb = imagecreatetruecolor ($width, $height);
$bg = ImageColorAllocate($thumb, $red, $green, $blue);
imagefill ($thumb, 0, 0, $bg);
//Add the image itself
Imagecopyresized ($thumb, $srcImage, 0, 0, 0, 0, $width, $height, $srcWidth, $srcHeight);
//Add a black border
imageline($thumb, 0, 0, 0, $height, $black);
imageline($thumb, 0, 0, $width, 0, $black);
imageline($thumb, 0, $height, $width, $height, $black);
imageline($thumb, $width, $height, $width, 0, $black);
//output header
//I leave this so late so if there ARE any errors, they are displayed as text not a broken image
//(this will happen when looking at the thumnailer directly but will display as a broken image in a webpage still)
header("Content-type: image/PNG");
imagePNG($thumb);
//Clear up memory
imagedestroy($srcImage);
?>
Для изменения размера изображения доступно только ограниченное количество алгоритмов передискретизации. Вопрос о том, какая программа лучше, подразумевает, что если программа реализует лучшие алгоритмы, то программа считается "хорошей".