Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как изменить размер и преобразовать загруженное изображение в PNG с помощью GD?
Я хочу разрешить пользователям загружать изображения типа Аватара в различных форматах (по крайней мере, в форматах GIF, JPEG и PNG ), но сохранить их все как PNG database BLOBs . Если изображения слишком большие, по пикселям, я хочу изменить их размер до DB-вставки.
Что является лучшим способом, чтобы использовать GD, чтобы сделать изменения и преобразования PNG?
Edit: к сожалению, на сервере, который мне нужен, доступен только 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.');
}
<?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.');
}
Ваши шаги процесса должны выглядеть следующим образом:
- Проверьте тип файла
- Загрузите изображение, если это поддерживаемый тип файла, в GD с помощью imagecreatefrom*
- Изменение размера с помощью imagecopyresize или imagecopyresampled
- Сохраните изображение с помощью imagepng($handle, 'filename.png', $quality, $filters)
ImageMagick быстрее, генерирует лучшие изображения, более настраиваем и, наконец, (IMO) гораздо проще кодировать.
@ceejayoz просто ждите нового GD - это OOP, как MySQLi, и это на самом деле неплохо :)
Если вы хотите использовать gdlib, используйте gdlib 2 или выше. Он имеет функцию под названием imagecopyresampled(), которая будет интерполировать пиксели при изменении размера и выглядеть намного лучше.
Кроме того, я всегда слышал, что в Сети отмечают, что хранение изображений в базе данных является плохим тоном:
- Это медленнее, чем доступ к диску
- Ваш сервер должен будет запустить скрипт, чтобы получить изображение вместо этого о простом обслуживании файла
- Ваш скрипт теперь отвечает за многое из того, что использовал веб-сервер
обрабатывать:
- Установка правильного заголовка типа содержимого
- Установка правильных заголовков caching/timeout/E-tag, чтобы клиенты могли правильно кэшировать изображение. Если не делать этого должным образом, то скрипт подачи изображений будет попадать на каждый запрос, увеличивая нагрузку на сервер еще больше.
Единственное преимущество, которое я вижу, заключается в том, что вам не нужно синхронизировать свою базу данных и файлы изображений. Хотя я бы все равно рекомендовал не делать этого.
Вы уверены, что у вас нет 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 для определения типа файла.
Эта статья , похоже, будет соответствовать тому, что вы хотите. Вам нужно будет изменить функцию saving imagejpeg() на imagepng() и сделать так, чтобы она сохраняла файл в строку, а не выводила его на страницу, но в остальном это должно быть простое копирование/вставка в существующий код.
Является ли GD абсолютно необходимым? ImageMagick работает быстрее, генерирует лучшие изображения, более конфигурируема и, наконец, (IMO) гораздо проще кодировать.
Я думаю, что эта страница -хорошая отправная точка. Он использует imagecreatefrom (jpeg/gif/png) и изменяет размер и преобразует изображение, а затем выводит его в браузер. Вместо того, чтобы выводить браузер, вы могли бы вывести в BLOB в DB без многих минут переписывания кода.