Salut Amwus,
si je me rappelle bien.
Appelons x1, y1, x2, y2 les coordonnées du point supérieur droit
et inférieur gauche du rectangle de destination.
On cherche à remplir ce rectangle de largeur l = x2 - x1 + 1 pixels
et de hauteur h = y2 - y1 + 1 pixels
avec une image de largeur l' et de hauteur h'.
Le principe, tu parcours ce cadre avec deux boucles de style FOR,
exemple :
FOR y = y1 TO y2
FOR x = x1 TO x2
PSET (x, y), c
NEXT
NEXT
Reste à déterminer c.
En fait c'est assez évident, on va chercher le c qui se rapproche
le plus de la 'case' équivalente dans ton tableau d'image
moyennant, une moyenne pondérée.
Je te propose ici un truc simple, non optimisé.
On change de repère : (x', y' nombres à virgule flottante)
x' = x * (l' -1) / l + 0.5
y' = y * (h' - 1) / h + 0.5
(Règle de trois, puis on centre au milieu des cases (+0.5),
on enlève aussi une case en hauteur et largeur afin de ne pas dépasser à cause du + 0.5)
Évidemment, à moins d'un coup de bol la case (x', y') n'éxiste
pas dans ton tableau.
On calcule maintenant des coefficients couleur,
q1 = x' - floor (x')
q2 = ceil (x') - x'
q3 = y' - floor (y')
q4 = ceil (y') - y'
(floor est l'arrondi par défaut et ceil l'arrondi par excès)
Chaque q est compris entre 0 et 1 non compris
et q1 + q2 = 1, q3 + q4 = 1 (fais le calcul

)
On pose : xt = ceil(x') : yt = ceil(y')
On peut donc écrire :
c = (q1 * Table (xt, yt) + q2 * Table (xt + 1, yt) + q3 * Table (xt, yt) + q4 * Table (xt, yt + 1)) / 2
Je divise par 2 à cause du fait que q1+ q2 + q3 + q4 = 2
Attention : le calcul de c ne marche que dans l'hypothèse
ou ton image est constituée d'une seule composante
et en représentation virgule flottante.
Tu auras sûrement à calculer crouge, cbleu, et cvert
et a tout reconvertir et regrouper pour former un c 24 bits.
Voilà si ça a pu t'aider, voici l'algo final :
(TableR, TableV, et TableB sont des nombres flottants compris entre 0 et 255)
FOR y = y1 TO y2
FOR x = x1 TO x2
x' = x * (l' -1) / l + 0.5
y' = y * (h' - 1) / h + 0.5
q1 = x' - floor (x')
q2 = ceil (x') - x'
q3 = y' - floor (y')
q4 = ceil (y') - y'
cR = (q1 * TableR (xt, yt) + q2 * TableR (xt + 1, yt) + q3 * TableR (xt, yt) + q4 * TableR (xt, yt + 1)) / 2
cV = (q1 * TableV (xt, yt) + q2 * TableV (xt + 1, yt) + q3 * TableV (xt, yt) + q4 * TableV (xt, yt + 1)) / 2
cB = (q1 * TableB (xt, yt) + q2 * TableB (xt + 1, yt) + q3 * TableB (xt, yt) + q4 * TableB (xt, yt + 1)) / 2
If cR > 255 then cR=255 (Peuvent pas être plus petits que 0,
If cV > 255 then cV=255 les q sont positifs)
If cB > 255 then cB=255
c = ceil (cR) + ceil(cV) * 256 + ceil(cB) * 65536
PSET (x, y), c
NEXT
NEXT
PS : Dis moi si ça marche, et si tu l'appliques, peux tu m'envoyer
le résultat, image, code ou application ?
A +
Edité par Fred ( 06/10/2008 22:27:10 )Purée faut que je change d'avatar !