J'en déduis que vous recherchez un rapport d'aspect utilisable integer:integer
solution comme 16:9
plutôt qu'un float:1
solution comme 1.77778:1
.
Si c'est le cas, vous devez trouver le plus grand diviseur commun (PGCD) et diviser les deux valeurs par ce dernier. Le PGCD est le nombre le plus élevé qui divise également les deux nombres. Ainsi, le PGCD de 6 et 10 est 2, celui de 44 et 99 est 11.
Par exemple, un moniteur 1024x768 a un GCD de 256. En divisant les deux valeurs par ce chiffre, on obtient 4x3 ou 4:3.
Un algorithme GCD (récursif) :
function gcd (a,b):
if b == 0:
return a
return gcd (b, a mod b)
En C :
static int gcd (int a, int b) {
return (b == 0) ? a : gcd (b, a%b);
}
int main(void) {
printf ("gcd(1024,768) = %d\n",gcd(1024,768));
}
Et voici quelques pages HTML/Javascript complètes qui montrent une façon de détecter la taille de l'écran et de calculer le rapport hauteur/largeur à partir de celle-ci. Cela fonctionne avec FF3, je ne sais pas si les autres navigateurs prennent en charge le format screen.width
y screen.height
.
<html><body>
<script type="text/javascript">
function gcd (a, b) {
return (b == 0) ? a : gcd (b, a%b);
}
var w = screen.width;
var h = screen.height;
var r = gcd (w, h);
document.write ("<pre>");
document.write ("Dimensions = ", w, " x ", h, "<br>");
document.write ("Gcd = ", r, "<br>");
document.write ("Aspect = ", w/r, ":", h/r);
document.write ("</pre>");
</script>
</body></html>
Il sort (sur mon moniteur bizarre à écran large) :
Dimensions = 1680 x 1050
Gcd = 210
Aspect = 8:5
D'autres personnes sur lesquelles j'ai testé cette méthode :
Dimensions = 1280 x 1024
Gcd = 256
Aspect = 5:4
Dimensions = 1152 x 960
Gcd = 192
Aspect = 6:5
Dimensions = 1280 x 960
Gcd = 320
Aspect = 4:3
Dimensions = 1920 x 1080
Gcd = 120
Aspect = 16:9
J'aurais aimé avoir ce dernier à la maison, mais non, c'est une machine de travail, malheureusement.
Ce que vous faites si vous découvrez que le rapport d'aspect n'est pas pris en charge par votre outil de redimensionnement graphique est une autre affaire. Je pense que la meilleure solution serait d'ajouter des lignes de letter-boxing (comme celles que vous voyez en haut et en bas de votre vieux téléviseur lorsque vous regardez un film à écran large). Je les ajouterais en haut/en bas ou sur les côtés (selon ce qui produit le moins de lignes de letter-boxing) jusqu'à ce que l'image réponde aux exigences.
Je me souviens encore des cow-boys incroyablement grands et minces que je regardais dans ma jeunesse à la télévision avant l'introduction du letter-boxing. Il est peut-être préférable d'avoir une image différente par format et de redimensionner la bonne image en fonction des dimensions réelles de l'écran avant de l'envoyer sur le câble.