2009-03-06 3 views
7

delimitazione Per esempio, se ho bisogno di riempire un rettangolo di selezione che è 100px di larghezza per 50px, le seguenti immagini di ingresso ad alto fusto avrebbe il seguente comportamento:Scala per riempire completamente box

  1. 200w x 200h ottiene ridimensionato del 50% e il 25% viene tagliato in cima e il inferiore.

  2. 200w x 100h viene ridotto del 50% senza ritaglio.

  3. 100w x 200h non viene ridimensionato, ma 75px vengono troncati sopra e sotto.

Sembra che sarebbe una funzione di ridimensionamento comune, ma non sono stato in grado di rintracciare un esempio dell'algoritmo.

Accetta risposta in qualsiasi lingua incluso pseudo codice. Anche un link a una pagina con la risposta è fantastico!

+0

Qualcuno ha lasciato un commento su mia risposta, ho pensato che fosse lei, ma non è - puoi chiarire un po 'la domanda riguardo ai tuoi attuali limiti? Grazie. –

+0

Il caso generale è quello che volevo. Grazie. – Larsenal

+0

Grazie. Ho modificato la metà fuorviante della mia risposta. –

risposta

12

Quello che stai chiedendo è piuttosto facile. Calcola i diversi fattori di scala per la larghezza e l'altezza, quindi scegli quella più grande per il fattore di scala effettivo. Moltiplicare le dimensioni dell'input per la scala e ritagliare qual è il valore più grande.

scale = max(maxwidth/oldwidth, maxheight/oldheight) 
scaledwidth = oldwidth * scale 
scaledheight = oldheight * scale 
if scaledheight > maxheight: 
    croptop = (scaledheight - maxheight)/2 
    cropbottom = (scaledheight - maxheight) - croptop 
if scaledwidth > maxwidth: 
    cropleft = (scaledwidth - maxwidth)/2 
    cropright = (scaledwidth - maxwidth) - cropleft 
+0

Solo X (larghezza) è sotto vincoli di ridimensionamento. L'altra Y (altezza) sta croppando. – Suroot

+0

Questo vincolo non è stato dichiarato, né era evidente dai tuoi esempi. In tal caso, utilizzare invece scale = maxwidth/oldwidth e rimuovere i calcoli cropleft/cropright, il resto rimane lo stesso. –

+0

Dovremmo arrotondare i numeri di output perché sono spesso frazioni di un pixel? –

1

Qui ci assicuriamo che abbiamo solo scalare se X è superiore al 100%; poi, dopo averlo fatto, ci assicuriamo di essere solo 50 px sulla nostra Y. Se siamo superiori a 50, allora prendiamo la differenza e dividiamo per 2 per ottenere l'importo rimosso dalla parte superiore/inferiore.

double percent_x = 1.0; 

if(X > 100) { 
percent_x = (float)100/X; 
X *= percent_x; 
Y *= percent_x; 
} 

int diff_y; 
int top_cut, bott_cut; 
if(Y > 50) { 
diff_y = (Y - 50)/2; 
top_cut = bott_cut = diff_y; 
} 
0

In gran parte ispirato la risposta di Mark Ransom (grazie mille - mi hai salvato). Per tutti coloro che vorrebbero fare questo senza ritagliare l'immagine (solo in forma entro i limiti), ho trovato che questo funziona:

if (maxWidth > width && maxHeight > height) { 
    return { width, height }; 
} 

aspectRatio = width/height, 
scale  = max(maxWidth/width, maxHeight/height); 

scaledHeight = height * scale, 
scaledWidth = width * scale; 

if (scaledHeight > maxHeight) { 
    scaledHeight = maxHeight; 
    scaledWidth = aspectRatio * scaledHeight; 
} else if (scaledWidth > maxWidth) { 
    scaledWidth = maxWidth; 
    scaledHeight = scaledWidth/aspectRatio; 
} 

return { scaledHeight, scaledWidth };