Zoom + Rotation avec MonochromeLib !
Posté le 11/02/2015 22:26
Et voilà je viens d'achever un défi personnel : écrire une fonction pour agrandir ou réduire une image !
Les fonctions sont incorporées dans la libraire de PierrotLL comme toutes les autres que nous connaissons bien.
Il suffit de modifier MonochromeLib.c et MonochromeLib.h par les nouveaux en pièce jointe.
Les prototypes :
void ML_bmp_or_zoom(const unsigned char *bmp, int x, int y, int width, int height, float zoom_w, float zoom_h);
void ML_bmp_and_zoom(const unsigned char *bmp, int x, int y, int width, int height, float zoom_w, float zoom_h);
void ML_bmp_xor_zoom(const unsigned char *bmp, int x, int y, int width, int height, float zoom_w, float zoom_h);
void ML_bmp_or_rotate(const unsigned char *bmp, int x, int y, int width, int height, int angle);
void ML_bmp_and_rotate(const unsigned char *bmp, int x, int y, int width, int height, int angle);
void ML_bmp_xor_rotate(const unsigned char *bmp, int x, int y, int width, int height, int angle);
Explications :
Il suffit de mettre en argument :
- le pointeur du bmp
- la position en x
- la position en y
- la largeur d'origine
- la hauteur d'origine
- le coefficient de zoom en largeur ou l'angle de rotation
- le coefficient de zoom en hauteur
Infos complémentaires :
Les coefficients de zoom sont des flottants compris entre 0 et l'infini
- entre 0 et 1 -> réduction
- plus de 1 -> agrandissement
L'angle est un entier en degrés et dans le sens trigo (anti-horaire)
L'image tourne autour de son centre.
Nouvelle version du zoom 3x plus rapide !
Ajout des rotations
La librairie est toujours libre.
Aussi simple que ça !
Fichier joint
Citer : Posté le 11/02/2015 22:30 | #
Sympa
Ça marche aussi pour l'agrandissement avec un zoom compris entre 0 et 1 ?
Citer : Posté le 11/02/2015 22:30 | #
Oh !
Super ! Je pense que ça va être très utile, il faudrait demander à PierrotLL s' il veut bien mettre cette lib en téléchargement !
Pong400
PierrePaCiseaux (CP400)
Les Triangles
Menu
ASCII
Nombres premiers
Citer : Posté le 11/02/2015 22:32 | #
Oui, ça fonctionne. Et je n'ai pas précisé mais pour n'importe quelle taille d'image d'origine, pas seulement de 8x8 ou 16x16
Citer : Posté le 11/02/2015 22:40 | #
Ça peut faire des anim' sympas tout ça
L'interpolation se fait comment ?
Et le partage se fait sous les mêmes conditions (license libre) ?
Citer : Posté le 11/02/2015 22:46 | #
Je sais pas trop, c'est du maison.
La licence est toujours libre (j'ai précisé dans le poste principal)
Ajouté le 11/02/2015 à 22:52 :
J'ai modifié l'ordre des arguments dans les prototypes, c'est plus logique comme ça et ça s'accord au reste.
Citer : Posté le 11/02/2015 22:53 | #
Je me suis permit de mettre en valeur la license
Citer : Posté le 11/02/2015 23:26 | #
C'est de l'interpolation linéaire ou du nearest neighbor?
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 11/02/2015 23:30 | #
Dodormeur, le linéaire a peu de raison d'exister sur du monochrome!
Ajouté le 11/02/2015 à 23:31 :
Et au lieu de republier une énième version de ML, j'aurais plutôt fait une sorte d'extension!
Ajouté le 11/02/2015 à 23:35 :
nb_w_z = ceilf(width_z / 8.0); // est un peu lourd pour initialiser un int
// J'aurais fait
nb_w_z /= 8;
// ou
nb_w_z >>=3;
Citer : Posté le 11/02/2015 23:58 | #
Dodormeur, le linéaire a peu de raison d'exister sur du monochrome!
Pas d'accord, si jamais on a par exemple un zoom de 50%, et qu'un pixel blanc est pris, mais que ses trois voisins sont noir, le nearest neighbor va le faire blanc, alors que l'interpolation sera noire. Donc même si je suis d'accord que l'interpolation n'a pas autant d’intérêt qu'en couleur, elle en a quand même.
Suffit de voir le zoom dans snow wars pour se rendre compte que le nearest neighbor peut parfois faire des résultats assez moyens, alors qu'un algo d'interpo rendrait déjà mieux
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 12/02/2015 00:29 | #
C'est du nearest neighbor Dodormeur
L'interpolation me parait assez lourd sinon :/
Eiyeron : Si ça marchait, j'aurais fait comme ça
nb_w_z correspond au nombre d'octets qu'il faut pour écrire width_z bit, seulement si width_z = 9, il faut 2 octets, or width_z / 8 = 1.
Et si on fait with_z / 8 + 1 = 2 ok, mais si width_z = 8 alors ça renvoie 2 et ça marche pas.
Il existe surement une formule plus propre par contre.
...
(réflexion)
...
(width_z + 7) / 8 !!!
Citer : Posté le 12/02/2015 09:18 | #
Il existe surement une formule plus propre par contre.
Il existe toujours ce genre de formules propres
(width_z + 7) / 8
J'allais le dire (sinon y'a ((z-1)>>3)+1 pour éviter les overflow), en attendant si tu parles de vitesse utilise au moins le décalage de bits ^^' , gcc optimise peut-être mais le compilo du SDK non.
Citer : Posté le 30/06/2015 22:12 | #
Changement total du code, maintenant les fonctions écrivent directement dans la vram et ne calculent plus avec les flottants.
Nouvelle version 3x plus rapide !
(Je ne devrais pas avoir trop de repproches concernant l'optimisation cette fois ci )
Citer : Posté le 01/07/2015 07:54 | #
Tu utilises quel algorithme pour zommer ? Du nearest-neighbor ou tu te bases sur quelques pixels adjacents ?
Citer : Posté le 01/07/2015 09:51 | #
C'est du nearest neighbor Dodormeur
L'interpolation me parait assez lourd sinon :/
Ajouté le 01/07/2015 à 09:51 :
Enfin je pense que ça n'a pas changé, juste optimisé.
Citer : Posté le 01/07/2015 10:15 | #
Ok, merci
Citer : Posté le 01/07/2015 11:54 | #
Effectivement c'est toujours ça
Ajouté le 03/07/2015 à 23:15 :
Nouveau : ajout des fonctions pour tourner une image !
Citer : Posté le 31/07/2015 21:19 | #
Hum, c'est peut être moi qui suis un gros boulet, mais je n'arrive pas à trouver le fichier avec les fonctions pour faire les rotations...
Citer : Posté le 31/07/2015 21:54 | #
Un admin devrai peut être mettre un lien de la librairie dans le snippet associé
Toi aussi je ne le trouve pas non plus
Citer : Posté le 01/08/2015 00:31 | #
Effectivement, ce n'est pas le bon dossier. Il me semblaut pourtant avoir mis le bon. Bref je corrige ça
Ajouté le 01/08/2015 à 00:33 :
C'est bon, le fichier est à jour.
Citer : Posté le 01/08/2015 07:25 | #
Salut, Y a-t il un moyen d’obtenir les coordonnés d'un point précis du sprite avant et après rotation (le même pixel)? Pour des collisions par exemple.. En fait je crois savoir mais j'attend de voir une réponse
Ouais question bête... j'ai trouvé