Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481

    Librerie GD e GIF con trasparenze

    Dopo una bella documentata sul forum, ho scritto qualche riga di codice che mi ridimensiona le immagini, le legge come dati binari e le salva nel db su un campo medium blob. Dopo due giorni di scervellamento, mi sono accorto che se carico una gif con lo sfondo trasparente, anche se non ridimensiono l'immagine ma mi limito a converirla in binario ed inserirla nel db, tutte le parti trasparenti mi diventano nere...perchè? Vi è mai capitato

  2. #2
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    up

  3. #3
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    up2...

  4. #4
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858
    posta il codice.
    think simple think ringo

  5. #5
    per caso salvi il file con le gd? anche dopo il resize?

  6. #6
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da marketto
    posta il codice.
    questo è il codice con cui richiamo la classe:
    Codice PHP:
    $immagine_obj = new ManipulateImages($root_dir.'images');
    $immagine_obj->final_width 99;
    $immagine_obj->final_height 99;
    $immagine $immagine_obj->ResizeAndConvertToBinary($_FILES['immagine']); 

    questa è la funzione che converte in binario:
    Codice PHP:
    function ConvertToBinary($file_to_convert) {
        
    $file_handle fopen($file_to_convert"rb");
        
    $size filesize($file_to_convert);
        
    $file_readed fread($file_handle$size);
        
    $binary_file addslashes($file_readed);
        return 
    $binary_file;


    e questa è la classe che eventualmente ridimensiona l'immagine

    Codice PHP:
    class ManipulateImages {

        
    // INIZIO PARAMETRI DI CONFIGURAZIONE

        // variabili della classe
        
    var $final_width 0;                    // dimensione orizzontale finale delle immagini in pixel
        
    var $final_height 0;                    // dimensione verticale finale delle immagini in pixel
        
    var $final_path_and_name '';            // path e nome del file su cui deve essere salvata l'immagine
        
    var $max_size_image '1048576';        // dimensioni massime in byte dell'immagine originale
        
    var $image_quality 75;                // qualità, da 0 a 100


        // messaggi all'utente
        
    var $msg_error_too_big "Le immagini devono essere di dimensioni inferiori ad 1 Mb.";
        var 
    $msg_error_bad_format "Le immagini possono essere solo nei formati JPG, GIF o PNG.";

        
    // FINE PARAMETRI DI CONFIGURAZIONE

        
    var $img_dir '';                // percorso assoluto alla directory delle immagini, per le chiamate a
                // ShowMessage con l'utilizzo delle immagini





        //CODICE


        // il costruttore della classe imposta la directory delle immagini
        
    function ManipulateImages($img_dir) {
            
    $this->img_dir $img_dir;
        }

        
    // ResizeImage si occupa di ridimensionare l'immagine alle dimensioni specificate come parametri della classe, nello
        // specifico:
        // 1. controllo che l'immagine sia di dimensioni inferiori al valore settato, se accade riporto l'errore
        // 2. ricava le dimensioni dell'immagine originale
        // 3. controllo che l'immagine sia in uno dei formati JPG, GIF o PNG, altrimenti riporto l'errore
        // 4. se l'immagine è più grande delle dimensioni di destinazione, calcolo le nuove dimensioni
        //         proporzionalmente, altrimenti lascio l'immagine così com'è
        // 5. crea una nuova immagine
        // 6. crea una nuova immagine dalla jpeg originaria utilizzando la funzione appropriata in base al
        //    formato dell'immagine sorgente
        // 7. incolla restringendo la jpeg originaria sulla nuova immagine
        // 8. Distruggo l'handle dell'immagine originale per liberare la memoria
        // 9. restituisce l'immagine con qualita di compressione pari a XX distruggendo poi l'handle
        
    function ResizeImage($pf_image) {
            
    // 1. controllo che l'immagine sia di dimensioni inferiori al valore settato, se accade riporto l'errore
            
    if ($pf_image['size']>$this->max_size_image) {
                
    ShowMessage($this->msg_error_too_big'back page''a'$this->img_dir);
            }
            
    // 2. ricava le dimensioni dell'immagine originale
            
    $dimension GetImageSize($pf_image['tmp_name']);
            
    // echo $pf_image['type'].' '.$pf_image['size'].' '.$dimension[0].'X'.$dimension[1];

            // 3. controllo che l'immagine sia in uno dei formati JPG, GIF o PNG, altrimenti riporto l'errore
            
    if ($dimension[2]<|| $dimension[2]>3ShowMessage($this->msg_error_bad_format'back page''a'$this->img_dir);

            
    // 4. se l'immagine è più grande delle dimensioni di destinazione, calcolo le nuove dimensioni proporzionalmente, altrimenti lascio l'immagine così com'è
            
    $new_width $dimension[0];
            
    $new_height $dimension[1];
            if ((
    $dimension[0]>$this->final_width) || ($dimension[1]>$this->final_height)) {
                if ((
    $dimension[0]/$this->final_width)>($dimension[1]/$this->final_height)) {
                    
    $new_width $this->final_width;
                    
    $new_height $dimension[1]/($dimension[0]/$this->final_width);
                } else {
                    
    $new_height $this->final_height;
                    
    $new_width $dimension[0]/($dimension[1]/$this->final_height);
                }
            }
            
    // 5. crea una nuova immagine
            
    $new_img_pf ImageCreateTrueColor($new_width,$new_height);

            
    // 6. crea una nuova immagine dalla jpeg originaria utilizzando la funzione appropriata in base al
            //    formato dell'immagine sorgente
            
    switch ($dimension[2]) {
                case 
    1:
                    
    $old_image_pf ImageCreatefromGIF($pf_image['tmp_name']);
                    break;
                case 
    2:
                    
    $old_image_pf ImageCreatefromJPEG($pf_image['tmp_name']);
                    break;
                case 
    3:
                    
    $old_image_pf ImageCreatefromPNG($pf_image['tmp_name']);
                    break;
            }

            
    // 7. incolla restringendo la jpeg originaria sulla nuova immagine
            
    imagecopyresampled ($new_img_pf$old_image_pf,0,0,0,0,$new_width,$new_height,$dimension[0],$dimension[1]);

            
    // 8. Distruggo l'handle dell'immagine originale per liberare la memoria
            
    imagedestroy($old_image_pf);

            
    // 9. restituisce l'immagine con qualita di compressione pari a XX distruggendo poi l'handle
            
    $path $this->final_path_and_name=='' $pf_image['tmp_name'] : $this->final_path_and_name;
            
    ImageJPEG($new_img_pf,$path$this->image_quality);
            
    imagedestroy($new_img_pf);
            
    $results['pf_image'] = $path;
            
    $image_dimensions getimagesize($path);
            
    $results['width'] = $image_dimensions[0];
            
    $results['height'] = $image_dimensions[1];
            
    $results['image_type'] = $image_dimensions[2];
            
    $results['width_height'] = $image_dimensions[3];
            
    $results['file_type'] = $pf_image['type'];
            return 
    $results;
        }

        function 
    ResizeAndConvertToBinary($pf_image) {
            
    $pf_image $this->ResizeImage($pf_image);
            
    $pf_image['pf_image'] = ConvertToBinary($pf_image['pf_image']);
            
    $pf_image['size'] = strlen($pf_image['pf_image']);
            return 
    $pf_image;
        }


  7. #7
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da daniele_dll
    per caso salvi il file con le gd? anche dopo il resize?
    sì, sono le GD a fare questo casino?

  8. #8
    è normalissimo, non sono le gd a fare casino

    e tra i vari motivi quello più importante è che tu salvi il tutto in JPEG e le JPEG non supportano la trasparenza

  9. #9
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858
    altre persone hanno avuto lo stesso problema, guarda i commenti di questa pagina:
    http://it.php.net/manual/it/function...ransparent.php

    think simple think ringo

  10. #10
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da daniele_dll
    è normalissimo, non sono le gd a fare casino

    e tra i vari motivi quello più importante è che tu salvi il tutto in JPEG e le JPEG non supportano la trasparenza
    che cretino! c'è un modo per salvare in gif anzichè jpeg?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.