Сведения о вопросе

Holish

07:01, 18th August, 2020

Теги

php   database   image   png   gd    

Как изменить размер и преобразовать загруженное изображение в PNG с помощью GD?

Просмотров: 533   Ответов: 9

Я хочу разрешить пользователям загружать изображения типа Аватара в различных форматах (по крайней мере, в форматах GIF, JPEG и PNG ), но сохранить их все как PNG database BLOBs . Если изображения слишком большие, по пикселям, я хочу изменить их размер до DB-вставки.

Что является лучшим способом, чтобы использовать GD, чтобы сделать изменения и преобразования PNG?

Edit: к сожалению, на сервере, который мне нужен, доступен только GD, а не ImageMagick .



  Сведения об ответе

fo_I_K

21:03, 16th August, 2020

<?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.');
}


  Сведения об ответе

appple

21:06, 1st October, 2020

Ваши шаги процесса должны выглядеть следующим образом:

  1. Проверьте тип файла
  2. Загрузите изображение, если это поддерживаемый тип файла, в GD с помощью imagecreatefrom*
  3. Изменение размера с помощью imagecopyresize или imagecopyresampled
  4. Сохраните изображение с помощью imagepng($handle, 'filename.png', $quality, $filters)

ImageMagick быстрее, генерирует лучшие изображения, более настраиваем и, наконец, (IMO) гораздо проще кодировать.

@ceejayoz просто ждите нового GD - это OOP, как MySQLi, и это на самом деле неплохо :)


  Сведения об ответе

pumpa

10:29, 25th August, 2020

Если вы хотите использовать gdlib, используйте gdlib 2 или выше. Он имеет функцию под названием imagecopyresampled(), которая будет интерполировать пиксели при изменении размера и выглядеть намного лучше.

Кроме того, я всегда слышал, что в Сети отмечают, что хранение изображений в базе данных является плохим тоном:

  • Это медленнее, чем доступ к диску
  • Ваш сервер должен будет запустить скрипт, чтобы получить изображение вместо этого о простом обслуживании файла
  • Ваш скрипт теперь отвечает за многое из того, что использовал веб-сервер обрабатывать:
    • Установка правильного заголовка типа содержимого
    • Установка правильных заголовков caching/timeout/E-tag, чтобы клиенты могли правильно кэшировать изображение. Если не делать этого должным образом, то скрипт подачи изображений будет попадать на каждый запрос, увеличивая нагрузку на сервер еще больше.

Единственное преимущество, которое я вижу, заключается в том, что вам не нужно синхронизировать свою базу данных и файлы изображений. Хотя я бы все равно рекомендовал не делать этого.


  Сведения об ответе

DO__IT

22:30, 6th August, 2020

Вы уверены, что у вас нет ImageMagick на сервере?

Я приглашаю вас использовать PHP (вопрос помечен PHP). Хостинг-компания, которой я пользуюсь, не имеет расширения ImageMagick, включенного в соответствии с phpinfo().

Но когда я спросил их об этом, они сказали, что вот список программ ImageMagick, доступных из кода PHP. Так просто - в PHP нет интерфейса IM, но я могу вызвать программы IM непосредственно из PHP.

Я надеюсь, что у вас есть такой же вариант.

И я полностью согласен-хранение изображений в базе данных-не очень хорошая идея.


  Сведения об ответе

crush

23:23, 9th August, 2020

Возможно, что-то вроде этого:


<?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 для определения типа файла.


  Сведения об ответе

PAGE

13:08, 24th August, 2020

Эта статья , похоже, будет соответствовать тому, что вы хотите. Вам нужно будет изменить функцию saving imagejpeg() на imagepng() и сделать так, чтобы она сохраняла файл в строку, а не выводила его на страницу, но в остальном это должно быть простое копирование/вставка в существующий код.


  Сведения об ответе

+-*/

06:35, 19th August, 2020

Является ли GD абсолютно необходимым? ImageMagick работает быстрее, генерирует лучшие изображения, более конфигурируема и, наконец, (IMO) гораздо проще кодировать.


  Сведения об ответе

park

23:49, 7th August, 2020

Я думаю, что эта страница -хорошая отправная точка. Он использует imagecreatefrom (jpeg/gif/png) и изменяет размер и преобразует изображение, а затем выводит его в браузер. Вместо того, чтобы выводить браузер, вы могли бы вывести в BLOB в DB без многих минут переписывания кода.


  Сведения об ответе

+-*/

23:56, 24th August, 2020

phpThumb -это высокоуровневая абстракция, на которую стоит обратить внимание.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться