Domanda

Ad esempio, se devo riempire un riquadro di delimitazione che è largo 100px per 50px di altezza, le seguenti immagini di input avrebbero il seguente comportamento:

  1. 200w x 200h viene ridotto del 50% e Il 25% viene tagliato in alto e in basso.

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

  3. 100w x 200h non viene ridimensionato, ma 75px vengono tagliati dall'alto e dal basso.

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

Accetterà la risposta in qualsiasi lingua, incluso lo pseudo codice. Anche un collegamento a una pagina con la risposta è fantastico!

È stato utile?

Soluzione

Quello che stai chiedendo è abbastanza facile. Calcola i diversi fattori di scala per la larghezza e l'altezza, quindi scegli quello più grande per il tuo fattore di scala reale. Moltiplica le dimensioni dell'input per la scala e ritaglia qualunque sia troppo 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

Altri suggerimenti

Qui ci assicuriamo di ridimensionare solo se X è maggiore del 100%; poi, dopo averlo fatto, ci assicuriamo di avere solo 50 px sulla nostra Y. Se siamo maggiori di 50, prendiamo la differenza e dividiamo per 2 per ottenere la quantità rimossa 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;
}

In gran parte ispirato dalla risposta di Mark Ransom (grazie mille - mi hai salvato). Per tutti coloro che vorrebbero farlo senza ritagliare l'immagine (rientrare nei limiti), ho scoperto che 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 };
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top