Domanda

Voglio consentire agli utenti di caricare immagini di tipo avatar in una varietà di formati (Almeno GIF, JPEG e PNG), ma per salvarli tutti come BLOB del database PNG.Se le immagini sono sovradimensionate, in termini di pixel, voglio ridimensionarle prima dell'inserimento nel DB.

Qual è il modo migliore per utilizzare GD per eseguire il ridimensionamento e la conversione PNG?

Modificare:Purtroppo solo GD è disponibile sul server che devo utilizzare, no ImageMagick.

È stato utile?

Soluzione

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

Altri suggerimenti

I passaggi del processo dovrebbero assomigliare a questo:

  1. Verificare IL tipo di file
  2. Carica l'immagine se è un tipo di file supportato in GD utilizzando creazioneimmagineda*
  3. Ridimensionamento utilizzando imagecopyresize O imagecopyresampled
  4. Salva l'immagine utilizzando imagepng($handle, 'nomefile.png', $qualità, $filtri)

ImageMagick è più veloce, genera immagini migliori, è più configurabile e infine è (IMO) molto più semplice da codificare.

@ceejayoz Aspetta solo il nuovo GD: è OOP come MySQLi e in realtà non è male :)

Se vuoi usare gdlib, usa gdlib 2 o versione successiva.Ha una funzione chiamata imagecopyresampled(), che interpolerà i pixel durante il ridimensionamento e avrà un aspetto molto migliore.

Inoltre, ho sempre sentito notare in rete che archiviare le immagini nel database è una cattiva forma:

  • L'accesso è più lento rispetto al disco
  • Il tuo server dovrà eseguire uno script per arrivare all'immagine invece di semplicemente servire un file
  • Il tuo script ora è responsabile di molte cose che il server web utilizzato per gestire:
    • Impostazione dell'intestazione Content-Type corretta
    • Impostazione delle intestazioni di memorizzazione nella cache/timeout/E-tag corrette, in modo che i client possano memorizzare correttamente l'immagine nella cache.Se non lo fai correttamente, lo script di servizio delle immagini verrà eseguito a ogni richiesta, aumentando ulteriormente il carico sul server.

L'unico vantaggio che vedo è che non è necessario mantenere sincronizzati il ​​database e i file di immagine.Lo sconsiglierei comunque.

Sei sicuro di non avere ImageMagick sul server?

Ti invito a utilizzare PHP (la domanda è contrassegnata con PHP).La società di hosting che utilizzo non ha l'estensione ImageMagick attivata secondo phpinfo().

Ma quando ho chiesto loro informazioni hanno detto ecco l'elenco dei programmi ImageMagick disponibili dal codice PHP.Quindi semplicemente: non ci sono interfacce IM in PHP, ma posso chiamare programmi di messaggistica istantanea direttamente da PHP.

Spero che tu abbia la stessa opzione.

E io fortemente d'accordo: archiviare le immagini nel database non è una buona idea.

Qualcosa del genere, forse:


<?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);
?>

Non ho testato il codice quindi potrebbero esserci degli errori di sintassi, tuttavia dovrebbe darti una presentazione corretta di come potrebbe essere fatto.Inoltre, ho assunto un file PNG.Potresti voler avere una sorta di istruzione switch per determinare il tipo di file.

Questo articolo sembra che si adatterebbe a quello che desideri.Dovrai modificare la funzione di salvataggio imagejpeg() in imagepng() e fare in modo che salvi il file in una stringa anziché visualizzarlo nella pagina, ma a parte questo dovrebbe essere facile copiare/incollare nel codice esistente.

La GD è assolutamente necessaria? ImageMagick è più veloce, genera immagini migliori, è più configurabile e infine è (IMO) molto più semplice da codificare.

Penso questa pagina è un buon punto di partenza.Utilizza imagecreatefrom(jpeg/gif/png) e ridimensiona e converte l'immagine e quindi l'output nel browser.Invece di emettere il browser, è possibile eseguire l'output su un BLOB in un DB senza molti minuti di riscrittura del codice.

phpThumb è un'astrazione di alto livello che potrebbe valere la pena esaminare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top