2013-01-07 15 views
5

Sto tentando di ridimensionare un'immagine mantenendo le proporzioni. Dovrebbe essere abbastanza grande da riempire lo schermo senza spazi vuoti e, se necessario, alcune immagini dovrebbero essere fuori dallo schermo.Calcolo della dimensione dell'immagine mantenendo le proporzioni con risoluzioni dello schermo diverse

L'immagine seguente mostra come deve essere dimensionata l'immagine gialla in base alla dimensione dello schermo nero.

enter image description here

Heres il codice che sto usando in realtà, c'è un modo migliore per fare questo?

if(bwidth > bheight) { 
    if(bwidth > swidth && bheight > sheight) { 
     new_height = sheight; 
     new_width = (int) ((double) (bwidth/100)*(sheight/((double) (bheight)/100))); 

    } else if(bwidth > swidth && bheight < sheight) { 
     new_height = sheight; 
     new_width = (int) ((double) (bwidth/100)*(sheight/((double) (bheight)/100))); 

    } else if(bwidth < swidth && bheight < sheight) { 
     new_height = sheight; 
     new_width = (int) ((double) (bwidth/100)*(sheight/((double) (bheight)/100))); 

    } else if(bwidth < swidth && bheight > sheight) { 
     new_height = sheight; 
     new_width = (int) ((double) (bwidth/100)*(sheight/((double) (bheight)/100))); 

    } else if(bwidth >= swidth && bheight >= sheight) { 
     new_width = swidth; 
     new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100))); 
    } 

} else if(bwidth < bheight) { 
    if(bwidth > swidth && bheight > sheight) { 
     new_width = swidth; 
     new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100))); 

    } else if(bwidth < swidth && bheight > sheight) {   
     new_width = swidth; 
     new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100))); 

    } else if(bwidth < swidth && bheight < sheight) { 
     new_width = swidth; 
     new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100))); 

    } else if(bwidth < swidth && bheight < sheight) { 
     new_width = swidth; 
     new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100))); 

    } else if(bwidth >= swidth && bheight >= sheight) { 
     new_width = swidth; 
     new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100))); 

    } 
} 
  • swidth = larghezza dello schermo
  • sheight = schermo altezza
  • bWidth = Larghezza immagine
  • bHeight = altezza dell'immagine
+0

vuoi tagliare zona invisibile o per modificare il rapporto – mKorbel

+0

non so se il taglio è necessario, dal momento che sarà non visibile, si deve solo adattarsi al schermo, sempre –

+0

hai un bel po 'di codice ridondante lì - che ne dici di ridistribuirlo ai suoi elementi essenziali in modo che sia più facile da leggere? – GreyBeardedGeek

risposta

-2

Bene, grazie @Erick Robertson Modificato un po ', ma ora funziona!

Ecco il codice modificato:

if (bwidth/swidth < bheight/sheight) { 
    new_width = swidth; 
    new_height = (int) Math.floor((double) bheight 
            * (double) swidth/(double) bwidth); 
} else { 
    new_height = sheight; 
    new_width = (int) Math.floor((double) bwidth 
           * (double) sheight/(double) bheight); 
} 
+0

Perché dovresti pubblicare una risposta alla tua stessa domanda e poi accettare quella invece della risposta le cui informazioni ti hanno permesso di risolvere il tuo problema? Questo sembra molto irregolare. – scottb

9

Compare rapporti.

Se il rapporto larghezza-altezza dell'immagine è maggiore del rapporto larghezza-altezza dello schermo, allora saprete che userete la larghezza dello schermo e calcolerete l'altezza. Altrimenti userete l'altezza dello schermo e calcolando la larghezza. Assicurati che nessuna delle altezze sia zero!

Si noti che il codice qui ridimensionerà l'immagine in modo che riempirà sempre lo schermo. Ciò elimina efficacemente qualsiasi parte aggiuntiva dell'immagine. Per rendere l'immagine più grande possibile pur essendo interamente visibile, modificare < in > nella prima riga.

if (bwidth/bheight < swidth/sheight) { 
    new_width = swidth; 
    new_height = (int) Math.floor((double) bheight 
            * (double) swidth/(double) bwidth); 
} else { 
    new_height = sheight; 
    new_width = (int) Math.floor((double) bwidth 
           * (double) sheight/(double) bheight); 
} 

Ho fatto anche un altro paio di miglioramenti:

  • semplificato le equazioni. Dividere un numeratore e un denominatore sia per 100 non fa nulla.
  • Semplificato il typecasting. Non conosco il tipo di ciascuna variabile, ma devono essere tutte doppie.
  • Utilizzato Math.floor anziché solo un typecast su int per assicurarsi che non venga arrotondato.
+0

wait .. sto testando il tuo codice, ho cambiato un po ', ora funziona su immagini widescreen :) –

+0

Penso di aver capito a posteriori. Il codice che ho scritto era in modo tale da poter vedere l'intera immagine sullo schermo. Sembra che tu voglia riempire lo schermo e garantire lo scorrimento in un'unica direzione? –

+0

appena riempito, senza scorrere .. il codice che ho modificato funziona per me .. grazie per il vostro aiuto –

Problemi correlati