Я хочу разрешить пользователям загружать изображения типа аватаров в различные форматы ( GIF, JPEG и PNG как минимум ), но сохранять их все как BLOB базы данных PNG . Если изображения негабаритных, по-пиксели, я хочу изменить их размер перед вставкой DB.
Каков наилучший способ использования GD для изменения размера и преобразования PNG?
Изменить: К сожалению, только GD доступен на сервере, который мне нужно использовать, без ImageMagick .
<?php /* Resizes an image and converts it to PNG returning the PNG data as a string */ function imageToPng($srcFile, $maxSize = 100) { list($width_orig, $height_orig, $type) = getimagesize($srcFile); // Get the aspect ratio $ratio_orig = $width_orig / $height_orig; $width = $maxSize; $height = $maxSize; // resize to height (orig is portrait) if ($ratio_orig < 1) { $width = $height * $ratio_orig; } // resize to width (orig is landscape) else { $height = $width / $ratio_orig; } // Temporarily increase the memory limit to allow for larger images ini_set('memory_limit', '32M'); switch ($type) { case IMAGETYPE_GIF: $image = imagecreatefromgif($srcFile); break; case IMAGETYPE_JPEG: $image = imagecreatefromjpeg($srcFile); break; case IMAGETYPE_PNG: $image = imagecreatefrompng($srcFile); break; default: throw new Exception('Unrecognized image type ' . $type); } // create a new blank image $newImage = imagecreatetruecolor($width, $height); // Copy the old image to the new image imagecopyresampled($newImage, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig); // Output to a temp file $destFile = tempnam(); imagepng($newImage, $destFile); // Free memory imagedestroy($newImage); if ( is_file($destFile) ) { $f = fopen($destFile, 'rb'); $data = fread($f); fclose($f); // Remove the tempfile unlink($destFile); return $data; } throw new Exception('Image conversion failed.'); }
Ваши шаги процесса должны выглядеть так:
ImageMagick работает быстрее, генерирует лучшие изображения, более настраивается и, наконец, (IMO) намного проще кодировать.
@ceejayoz Подождите, пока новый GD – это OOP, как MySQLi, и это на самом деле неплохо 🙂
Если вы хотите использовать gdlib, используйте gdlib 2 или выше. Он имеет функцию imagecopyresampled (), которая будет интерполировать пиксели при изменении размера и выглядеть намного лучше.
Кроме того, я всегда слышал по сети, что хранение изображений в базе данных является плохим:
Единственное преимущество, которое я вижу, заключается в том, что вам не нужно синхронизировать файлы базы данных и изображений. Тем не менее, я бы порекомендовал его.
Вы уверены, что у вас нет ImageMagick на сервере?
Я гость вы используете PHP (вопрос отмечен PHP). Хостинговая компания, которой я пользуюсь, не поддерживает расширение ImageMagick в соответствии с phpinfo ().
Но когда я спросил их, они сказали, что это список программ ImageMagick, доступных из PHP-кода . Так просто – в PHP нет интерфейса IM, но я могу вызывать IM-программы непосредственно с PHP.
Надеюсь, у вас такой же вариант.
И я твердо согласен – хранение изображений в базе данных – это не очень хорошая идея.
Что-то вроде этого, возможно:
<?php //Input file $file = "myImage.png"; $img = ImageCreateFromPNG($file); //Dimensions $width = imagesx($img); $height = imagesy($img); $max_width = 300; $max_height = 300; $percentage = 1; //Image scaling calculations if ( $width > $max_width ) { $percentage = ($height / ($width / $max_width)) > $max_height ? $height / $max_height : $width / $max_width; } elseif ( $height > $max_height) { $percentage = ($width / ($height / $max_height)) > $max_width ? $width / $max_width : $height / $max_height; } $new_width = $width / $percentage; $new_height = $height / $percentage; //scaled image $out = imagecreatetruecolor($new_width, $new_height); imagecopyresampled($out, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height); //output image imagepng($out); ?>
Я не тестировал код, поэтому могут возникнуть некоторые синтаксические ошибки, однако он должен дать вам справедливое представление о том, как это можно сделать. Кроме того, я принял PNG-файл. Для определения типа файла может потребоваться какой-то оператор switch.
Эта статья кажется, что она будет соответствовать тому, что вы хотите. Вам нужно будет изменить функцию сохранения imagejpeg () на imagepng () и сохранить файл в строке, а не выводить его на страницу, но, кроме того, это будет легко скопировать / вставить в существующий код.
Требуется ли GD? ImageMagick работает быстрее, генерирует лучшие изображения, более настраивается и, наконец, (IMO) намного проще кодировать.
Я думаю, что эта страница является хорошей отправной точкой. Он использует imagecreatefrom (jpeg / gif / png) и изменяет размер и преобразует изображение, а затем выводит его в браузер. Вместо вывода браузера вы можете выводить на BLOB в БД без много минут перезаписи кода.
phpThumb – это абстракция высокого уровня, на которую стоит обратить внимание.