Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21

Discussione: Crop immagini

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    360

    Crop immagini

    Salve ragazzi,

    con il seguente script
    Codice PHP:
    <?php
    function makeThumb($dir,$pic,$n,$t){
      list(
    $width$height$type$attr) = getimagesize($pic);
      
    $max_w 100;
      
    $max_h 100;
      
    $ratio min($max_w/$width,$max_h/$height);

      
    // verifico che l'immagine originale sia più grande delle dimensioni massime 100*100px
      
    if ($ratio 1){
        
    // individuo le nuove dimensioni da assegnare all'immagine
        
    $w floor($ratio*$width);
        
    $h floor($ratio*$height);

        
    // creo una nuova immagine con le dimensioni appena calcolate
        
    $thumb imagecreatetruecolor($w,$h);
        if (
    $t == 'image/jpeg'){$temp imagecreatefromjpeg($pic);}
        elseif (
    $t == 'image/gif'){$temp imagecreatefromgif($pic);}
        elseif (
    $t == 'image/png'){$temp imagecreatefrompng($pic);}

        
    // ridimensiono l'originale e salvo nella cartella di destinazione
        
    imagecopyresampled($thumb,$temp,0,0,0,0,$w,$h,$width,$height);
        if (
    $t == 'image/jpeg'){imagejpeg($thumb,"$dir/tb_".$n75);}
        elseif (
    $t == 'image/gif'){imagegif($thumb,"$dir/tb_".$n75);}
        elseif (
    $t == 'image/png'){imagepng($thumb,"$dir/tb_".$n75);}
      }
    }
    ?>
    faccio il resize di immagini che carico creando miniature grandi massimo 100x100px mantenedo le proporzioni, quindi avrò miniature 100x58px oppure 74x100px, ecc, vorrei inserire una funzione di crop che mi permetta di creare miniature a dimesione fissa quindi proprio 100x100, come faccio? E' importante prima ridimensionare l'immagine il più possibile al 100x100 e poi croppare la parte in eccesso.

  2. #2

    Re: Crop immagini

    Codice PHP:
    <?php
    function makeThumb($dir,$pic,$n,$t){
      list(
    $width$height$type$attr) = getimagesize($pic);
      
    $max_w $max_h 100;
     
      
    // verifico che l'immagine originale sia più grande delle dimensioni massime 100*100px
      
    if ($max_w<$width && $max_h<$height) {

        
    // Dimensione Area Utile
        
    $a min($width,$height);

        
    //Offset
        
    $delta_x =  $delta_y =0;
        if (
    $width>$height
          
    $delta_x floor(($width-$height)/2);
        else 
          
    $delta_y floor(($height-$width)/2);

        
    // creo una nuova immagine 
        
    $thumb imagecreatetruecolor($max_w,$max_h);
        if (
    $t == 'image/jpeg'){$temp imagecreatefromjpeg($pic);}
        elseif (
    $t == 'image/gif'){$temp imagecreatefromgif($pic);}
        elseif (
    $t == 'image/png'){$temp imagecreatefrompng($pic);}

        
    // ridimensiono l'originale e salvo nella cartella di destinazione
        
    imagecopyresampled($thumb,$temp,0,0,$delta_x,$delta_y,$max_w,$max_h,$a,$a);
        if (
    $t == 'image/jpeg'){imagejpeg($thumb,"$dir/tb_".$n75);}
        elseif (
    $t == 'image/gif'){imagegif($thumb,"$dir/tb_".$n);}
        elseif (
    $t == 'image/png'){imagepng($thumb,"$dir/tb_".$n75);}
      }
    }
    ?>
    Non l'ho verificata, ma mi pare sia a posto così...

    Alcune note:
    - funziona solo per $max_w = $max_h, in caso contrario va modificato con qualche conto in più
    - non so come recuperi i mimetype, ma per le jpg potrebbero arrivartene altri, tipo: image/pjpeg
    - imagegif non ha il 3° parametro che definisce la "qualità"
    Full Stack Developer presso Advice Lab
    Bonus Bitcoin
    Moon Bitcoin

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    360

    Re: Re: Crop immagini

    Originariamente inviato da Magicale
    Codice PHP:
    <?php
    function makeThumb($dir,$pic,$n,$t){
      list(
    $width$height$type$attr) = getimagesize($pic);
      
    $max_w $max_h 100;
     
      
    // verifico che l'immagine originale sia più grande delle dimensioni massime 100*100px
      
    if ($max_w<$width && $max_h<$height) {

        
    // Dimensione Area Utile
        
    $a min($width,$height);

        
    //Offset
        
    $delta_x =  $delta_y =0;
        if (
    $width>$height
          
    $delta_x floor(($width-$height)/2);
        else 
          
    $delta_y floor(($height-$width)/2);

        
    // creo una nuova immagine 
        
    $thumb imagecreatetruecolor($max_w,$max_h);
        if (
    $t == 'image/jpeg'){$temp imagecreatefromjpeg($pic);}
        elseif (
    $t == 'image/gif'){$temp imagecreatefromgif($pic);}
        elseif (
    $t == 'image/png'){$temp imagecreatefrompng($pic);}

        
    // ridimensiono l'originale e salvo nella cartella di destinazione
        
    imagecopyresampled($thumb,$temp,0,0,$delta_x,$delta_y,$max_w,$max_h,$a,$a);
        if (
    $t == 'image/jpeg'){imagejpeg($thumb,"$dir/tb_".$n75);}
        elseif (
    $t == 'image/gif'){imagegif($thumb,"$dir/tb_".$n);}
        elseif (
    $t == 'image/png'){imagepng($thumb,"$dir/tb_".$n75);}
      }
    }
    ?>
    Non l'ho verificata, ma mi pare sia a posto così...

    Alcune note:
    - funziona solo per $max_w = $max_h, in caso contrario va modificato con qualche conto in più
    - non so come recuperi i mimetype, ma per le jpg potrebbero arrivartene altri, tipo: image/pjpeg
    - imagegif non ha il 3° parametro che definisce la "qualità"
    Grazie, ho capito perfettamente le tue considerazioni, e riguardo al parametro qualità assente in imagegif, dovrebbe essere lo stesso per PNG, o sbaglio?

    Comunque, ho estrema necessita di un crop ben definito, si potrebbe impostare la cosa che se la foto originale è molto larga, si ridimensiona proporzionalmente in altezza e si croppa ai lati per avere la parte centrale impostata in maniera predefinita/fissata, all'opposto se l'immagine originale è molto stretta.

    Mi dai qualche suggerimento gentilmente? Anche con soluzioni diverse, l'importante che le fasi siano 2, ridimensionamento proporzionato fino ad un certo punto e poi crop predefinito, limitando così al minimo il taglio nelle immagini.

  4. #4
    Domanda: hai provato la funzione che ti ho scritto? Perchè fa esattamente quello che hai chiesto (sempre a condizione che la thumbnail sia quadrata)... scale & crop
    Full Stack Developer presso Advice Lab
    Bonus Bitcoin
    Moon Bitcoin

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    360
    Originariamente inviato da Magicale
    Domanda: hai provato la funzione che ti ho scritto? Perchè fa esattamente quello che hai chiesto (sempre a condizione che la thumbnail sia quadrata)... scale & crop
    Si, certo che l'ho provata, solo che io ho bisogno di uno scale e crop non quadrato, ma rettangolare e predefinito, suggerimenti? Le miniature devono rientrare perfettamente in una certa zona della mia pagina.

  6. #6
    Il procedimento è lo stesso, solo con qualche conto in più.
    Devi calcolarti l'area utile dell'immagine originale, altezza e larghezza. Ed in funzione di queste, l'offset.

    Codice PHP:
    //Area Utile e Offset
    if ($width>$height*$max_w/$max_h) {
      
    $a_h $height;
      
    $a_w $a_h*$max_w/$max_h;
      
    $delta_x floor(($width-$a_w)/2); 
      
    $delta_y 0;

    else {
      
    $a_w $width;
      
    $a_h $a_w*$max_h/$max_w;
      
    $delta_x 0
      
    $delta_y floor(($height-$a_h)/2); 
    }


    imagecopyresampled($thumb,$temp,0,0,$delta_x,$delta_y,$max_w,$max_h,$a_w,$a_h); 
    Full Stack Developer presso Advice Lab
    Bonus Bitcoin
    Moon Bitcoin

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    360
    Sembra funzionare alla grandissima, grazie! Solo una cosa, se la foto è più piccola delle dimensioni impostate, la miniatura non viene creata, si potrebbe fare qualche cosa, tipo un ingrandimento? Probabilmente non capiterà mai però se la cosa si può prevedere con poco codice...

    Ora il codice è il seguente,
    Codice PHP:
    <?php 
    function makeThumb($dir,$pic,$n,$t){ 
      list(
    $width$height$type$attr) = getimagesize($pic); 
      
    $max_w 300
      
    $max_h 100

      
    // area utile e offset 
      
    if ($width>$height*$max_w/$max_h) { 
        
    $a_h $height
        
    $a_w $a_h*$max_w/$max_h
        
    $delta_x floor(($width-$a_w)/2);  
        
    $delta_y 0
      }  
      else { 
        
    $a_w $width
        
    $a_h $a_w*$max_h/$max_w
        
    $delta_x 0;  
        
    $delta_y floor(($height-$a_h)/2);  
      }

      
    // verifico che l'immagine originale sia più grande delle dimensioni massime 100*100px 
      
    if ($max_w<$width && $max_h<$height) { 

        
    // creo una nuova immagine  
        
    $thumb imagecreatetruecolor($max_w,$max_h); 
        if (
    $t == 'image/jpeg'){$temp imagecreatefromjpeg($pic);} 
        elseif (
    $t == 'image/gif'){$temp imagecreatefromgif($pic);} 
        elseif (
    $t == 'image/png'){$temp imagecreatefrompng($pic);} 

        
    // ridimensiono l'originale e salvo nella cartella di destinazione 
        
    imagecopyresampled($thumb,$temp,0,0,$delta_x,$delta_y,$max_w,$max_h,$a_w,$a_h); 
        if (
    $t == 'image/jpeg'){imagejpeg($thumb,"$dir/tb_".$n75);} 
        elseif (
    $t == 'image/gif'){imagegif($thumb,"$dir/tb_".$n);} 
        elseif (
    $t == 'image/png'){imagepng($thumb,"$dir/tb_".$n);} 
      } 

    ?>
    è esatto oppure ho lasciato parte del tuo precedente codice che non occorre più con la tua ultima implementazione postata a parte?

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    360
    Ritorno un attimo sull'argomento.

    La modifica dello script fatta da Magicale come nel mio precedente post è ottima, ridimensiona e fa un crop sempre 300x100 sia se la foto è orizzontali sia se è verticali, è possibile applicare una funzione che distingua l'orientamento della foto (orizzontale o verticale) e nel caso di orizzontale faccia quello che fa già adesso ovvero ridimensionamento e poi crop 300x100 MA nel caso di foto verticale faccia un ridimensionamento e poi crop 100x300?

    Grazie!

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    360
    Niente?

  10. #10
    Un minimo di iniziativa però non guasterebbe!!!

    Nella funzione makeThumb() hai le variabili $width e $height che contengono rispettivamente la larghezza e l'altezza dell'immagine. A questo punto è facile capire l'orientamento della stessa.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

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.