Senza che ci siano barre nere, intendo. 1080 non è un multiplo di 768, quindi c'è una sorta di perdita di dati?
Senza che ci siano barre nere, intendo. 1080 non è un multiplo di 768, quindi c'è una sorta di perdita di dati?
Risposte:
In sostanza un'immagine è un gruppo di punti campione (leggi Un pixel non è un quadratino 3 ). Quando si trasforma o si ridimensiona l'immagine, è necessario ricampionarla. Quindi, teoricamente, ciò che fai è prendere i campioni puntuali e convertirli in una funzione continua. Quindi campionare quella funzione continua e ricostruire un segnale. Quindi, ci sono due o tre fasi diverse qui.
Si noti che nessuno di questi passaggi ha una forma fissa. In pratica, quando ottimizzato, è impossibile dire che ci sono dei passaggi. La trasformazione non deve essere davvero semplice, potrebbe essere la mappatura della forma in una spirale ecc.
Immagine 1 : un segnale 1-D ricostruito da diversi filtri.
In pratica, è noto un po 'di conoscenza della ricostruzione del segnale nel campo dell'elaborazione del segnale. Progettare questi filtri e scegliere quello giusto è una forma d'arte a sé stante. Ma, in sostanza, la scelta del filtro è un compromesso tra sfocatura e suoneria . Naturalmente l'algoritmo ha anche altre qualità come quante istruzioni sono necessarie per implementare e quanto velocemente e quanta memoria ha bisogno ecc. Che può essere molto importante in tempo reale o applicazioni incorporate.
Immagine 2 : panoramica dell'intero processo.
Sono disponibili numerosi algoritmi di upscaling e downscaling per ridimensionare le immagini da qualsiasi risoluzione a qualsiasi altra risoluzione arbitraria. Ogni algoritmo comporta in genere un compromesso tra efficienza, scorrevolezza e nitidezza, con vari gradi di ciascun compromesso per algoritmi diversi.
Dai un'occhiata a questo articolo di Wikipedia per tali algoritmi ed esempi di tali algoritmi.
L'algoritmo più popolare (e utilizzato) è l' algoritmo di interpolazione bicubica . Interpola tra punti 2D su una griglia rettangolare. Usando Spline cubiche (o Interpolazione cubica), prima interpola su una dimensione (trova la riga / colonna interpolata), quindi interpola la riga / colonna interpolata nell'altra dimensione.
L'interpolazione bilineare è simile all'interpolazione bicubica, ad eccezione del fatto che il primo interpola usando una funzione lineare e può interpolare solo tra due valori e il secondo utilizza una funzione cubica e può interpolare tra quattro valori.
La semplice funzione per l'interpolazione bicubica è la seguente:
f(f(p00, p01, p02, p03, y),
f(p10, p11, p12, p13, y),
f(p20, p21, p22, p23, y),
f(p30, p31, p32, p33, y),
x)
dove (x, y) è la posizione interpolata e p [] [] è l'array 2d che rappresenta la griglia 4 * 4.
Controlla questo link per ulteriori informazioni e un codice di esempio, che aiuta davvero molto!
Mentre le altre risposte fornite sono corrette, non sono sicuro che rispondano interamente alla tua domanda. Per non ottenere le barre nere hai 2 opzioni se la destinazione non ha la stessa forma (o formato) dell'origine:
C'è un'altra opzione, ma non si adatta ai tuoi criteri: scala uniformemente, ma solo fino a quando 1 dimensione è grande quanto la destinazione. In questo caso dovresti ridimensionare sia in orizzontale che in verticale di 1.40625 per ottenere un risultato di 1440x1080. Questo di solito viene definito "adatta per adattarsi".
Per ognuna di queste opzioni puoi usare qualunque algoritmo di ridimensionamento soddisfi le tue esigenze.