/*************************************************************************************************************************************/ /* */ /* D E F O R M A T I O N D ' U N E I M A G E : */ /* */ /* */ /* Author of '$xci/deforme.01$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20030825112918). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E ' listG ' : */ /* */ /* */ /* :Debut_listG: */ /* :Fin_listG: */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_BASE #include image_image_IMAGESF_EXT /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #include xci/sequence.01.I" #define METHODE_DE_REECHANTILLONNAGE_A_UTILISER \ REECHANTILLONNAGE_PAR_INTERPOLATION_BICUBIQUE \ /* Methode de redimensionnement a utiliser alors. ATTENTION, jusqu'au 1996022800, il y */ \ /* avait ici : */ \ /* */ \ /* #define METHODE_DE_REECHANTILLONNAGE_A_UTILISER \ */ \ /* METHODE_IMPLICITE_DE_REECHANTILLONNAGE */ \ /* */ \ /* L'introduction de la possibilite de traiter des images non standard, pour lesquelles */ \ /* seul la methode 'BICUBIQUE' est disponible, a conduit, pour eviter des messages inutiles */ \ /* d'avertissiment, a modifier cette definition... */ #define k___XminR \ k___Xmin #define k___XmaxR \ k___Xmax #define k___YminR \ k___Ymin #define k___YmaxR \ k___Ymax /* Dimension de l'image Resultat, celle de l'image Argument etant donnee par '$formatI'. */ #define FACTEUR_MULTIPLICATIF_DU_REDIMENSIONNEMENT \ FU \ /* Facteur multiplicatif du nouveau dimensionnement de l'image. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F O R M A T I O N D ' U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageTX),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageTY),NOM_PIPE)); DEFV(Int,INIT(methode_de_redimensionnement_a_utiliser,METHODE_DE_REECHANTILLONNAGE_A_UTILISER)); /* Mise en place du redimensionnement de l'image. La liste des methodes disponibles est la */ /* suivante : */ /* */ /* 0 = par replication (ou destruction suivant le rapport des tailles imageR/imageA), */ /* 1 = par interpolation bilineaire (sur 4 voisins), */ /* 2 = par interpolation bicubique (sur 12 voisins), */ /* 3 = par mise en coincidence des coins "bas-gauche" des images Argument et */ /* Resultat, et en rajoutant du 'NoIr' s'il manque des points, ou en en */ /* supprimant s'il y en a trop, */ /* 4 = par mise en coincidence des coins "bas-droite" des images Argument et */ /* Resultat, et en rajoutant du 'NoIr' s'il manque des points, ou en en */ /* supprimant s'il y en a trop, */ /* 5 = par mise en coincidence des coins "haut-droite" des images Argument et */ /* Resultat, et en rajoutant du 'NoIr' s'il manque des points, ou en en */ /* supprimant s'il y en a trop, */ /* 6 = par mise en coincidence des coins "haut-gauche" des images Argument et */ /* Resultat, et en rajoutant du 'NoIr' s'il manque des points, ou en en */ /* supprimant s'il y en a trop, */ /* 7 = par mise en coincidence des centres des images Argument et Resultat, et en */ /* rajoutant du 'NoIr' s'il manque des points, ou en en supprimant s'il y en */ /* trop, */ /* 8 = par translation quelconque de l'image Argument par rapport a l'image Resultat, */ /* et en rajoutant du 'NoIr' s'il manque des points, ou en en supprimant s'il y */ /* en trop, */ /* */ /* ou 'NoIr' represente 'REECHANTILLONNAGE_GENERAL_____niveau_manquant' ('NOIR' par defaut). */ /* */ /* ATTENTION, ceci n'a d'utilite qu'en mode "standard" ; dans l'autre cas, la methode '2' */ /* est implicite... */ DEFV(Int,INIT(XminR,UNDEF)); DEFV(Int,INIT(XmaxR,UNDEF)); DEFV(Int,INIT(YminR,UNDEF)); DEFV(Int,INIT(YmaxR,UNDEF)); /* Dimension de l'image Resultat, celle de l'image Argument etant donnee par '$formatI'. */ /* */ /* Le 20030613134700, la gestion de {XminR,XmaxR,YminR,YmaxR} est passe de la procedure */ /* 'GET_ARGUMENT_I(...)' a 'GIT_ARGUMENT_I(...)' afin d'assurer plus de coherence avec */ /* {Xmin,Xmax,Ymin,Ymax}. Cela a demande un changement dans les valeurs initiales en */ /* passant de {k___XminR,k___XmaxR,k___YminR,k___YmaxR} a {UNDEF,UNDEF,UNDEF,UNDEF)... */ DEFV(Int,INIT(mXminR,UNDEF)); DEFV(Int,INIT(mXmaxR,UNDEF)); DEFV(Int,INIT(mYminR,UNDEF)); DEFV(Int,INIT(mYmaxR,UNDEF)); /* Dimension de l'image Resultat, apres prise en compte d'une eventuelle "multiplicite"... */ DEFV(Float,INIT(facteur_multiplicatif_du_redimensionnement,FACTEUR_MULTIPLICATIF_DU_REDIMENSIONNEMENT)); /* Facteur multiplicatif du nouveau dimensionnement de l'image. */ /*..............................................................................................................................*/ # ifdef ACCES_AUX_POINTS_LORS_D_UN_ECHANTILLONNAGE_DE_L_IMAGE_VERSION_01 /* Introduit le 20030829233653 car cela manquait... */ GET_ARGUMENTSi(nombre_d_arguments ,BLOC(VIDE; ) ); PRINT_ATTENTION("cette commande est ineffective dans cette VERSION"); # Aifdef ACCES_AUX_POINTS_LORS_D_UN_ECHANTILLONNAGE_DE_L_IMAGE_VERSION_01 # Eifdef ACCES_AUX_POINTS_LORS_D_UN_ECHANTILLONNAGE_DE_L_IMAGE_VERSION_01 # ifdef ACCES_AUX_POINTS_LORS_D_UN_ECHANTILLONNAGE_DE_L_IMAGE_VERSION_02 /* Introduit le 20030829233653 car cela manquait... */ EGAL(Iredimensionnement_____Atranslation_OX,ZERO); EGAL(Iredimensionnement_____Atranslation_OY,ZERO); EGAL(Iredimensionnement_____Rtranslation_OX,FZERO); EGAL(Iredimensionnement_____Rtranslation_OY,FZERO); /* Initialisations standards... */ GET_ARGUMENTSi(nombre_d_arguments ,BLOC(GET_ARGUMENT_C("imageA=""A=",nom_imageA); GET_ARGUMENT_C("imageTX=""TX=",nom_imageTX); GET_ARGUMENT_C("imageTY=""TY=",nom_imageTY); GET_ARGUMENT_C("imageR=""R=",nom_imageR); GET_ARGUMENT_I("mode=""methode=",methode_de_redimensionnement_a_utiliser); GET_ARGUMENT_L("MdefRedim=",Iredimensionnement_____messages_MdefRedim); GET_ARGUMENT_P("Rniveau=",REECHANTILLONNAGE_GENERAL_____niveau_manquant); /* Le 20050623145152, "niveau=" a ete remplace par "Rniveau=" (double definition...). */ GET_ARGUMENT_L("marquer=",REECHANTILLONNAGE_GENERAL_____marquer_les_niveaux_manquants); GET_ARGUMENT_I("Atrx=""AtrX=",Iredimensionnement_____Atranslation_OX); GET_ARGUMENT_I("Atry=""AtrY=",Iredimensionnement_____Atranslation_OY); GET_ARGUMENT_F("Rtrx=""RtrX=",Iredimensionnement_____Rtranslation_OX); GET_ARGUMENT_F("Rtry=""RtrY=",Iredimensionnement_____Rtranslation_OY); GET_ARGUMENT_L("pasXY=",Iredimensionnement_____utiliser_pasX_et_pasY); GET_ARGUMENT_I("IpX=",Iredimensionnement_____pasX); GET_ARGUMENT_I("IpY=",Iredimensionnement_____pasY); GET_ARGUMENT_L("FpasXY=",IFredimensionnement__IFdeformation_____utiliser_pasX_et_pasY); GET_ARGUMENT_I("FIpX=",IFredimensionnement__IFdeformation_____pasX); GET_ARGUMENT_I("FIpY=",IFredimensionnement__IFdeformation_____pasY); /* Les trois arguments 'IFredimensionnement_et_IFdeformation_...' ont ete introduits le */ /* 20041107180629... */ GIT_ARGUMENT_I("XminR=",XminR,Xmin); GIT_ARGUMENT_I("XmaxR=",XmaxR,Xmax); GIT_ARGUMENT_I("YminR=",YminR,Ymin); GIT_ARGUMENT_I("YmaxR=",YmaxR,Ymax); GET_ARGUMENT_F("facteur=""f=",facteur_multiplicatif_du_redimensionnement); /* Choix du format "rectangulaire"/"grand carre"/"petit carre" de redimensionnement lorsque */ /* le format d'image '$formatI' n'est pas carre (par exemple 'Pal'). On notera donc que */ /* l'option : */ /* */ /* rectangulaire=FAUX */ /* */ /* permet simplement de respecter les proportions, par exemple, lorsque l'on genere un */ /* "timbre" ('v $xiMo/creation$Z rectangulaire='). Ceci a ete introduit le 20020126194745. */ /* On notera qu'il faut alors : */ /* */ /* XminR = YminR */ /* XmaxR = YmaxR */ /* */ /* afin que le format "de base" soit carre et que, grace a 'ANTI_SUPER_ECHELLE_O?(...)' */ /* un format conservant les proportions soit calcule automatiquement... */ /* */ /* Ce dispositif est dorenavant dans 'v $xig/fonct$vv$DEF 20060118094518'... */ GET_ARGUMENT_F("derivee=",VOISINAGE_POINT_BICUBIQUE_____facteur_des_derivees_numeriques); GET_ARGUMENT_L("X_denormalisees=",IFdeformation_____les_coordonnees_X_sont_denormalisees); GET_ARGUMENT_N("X_normalisees=",IFdeformation_____les_coordonnees_X_sont_denormalisees); GET_ARGUMENT_L("Y_denormalisees=",IFdeformation_____les_coordonnees_Y_sont_denormalisees); GET_ARGUMENT_N("Y_normalisees=",IFdeformation_____les_coordonnees_Y_sont_denormalisees); /* Parametres introduits le 20060601094231... */ GET_ARGUMENT_L("periodiser_X=""periodX=",IFredimensionnement__IFdeformation_____periodiser_X); GET_ARGUMENT_L("periodiser_Y=""periodY=",IFredimensionnement__IFdeformation_____periodiser_Y); GET_ARGUMENT_L("symetriser_X=""symetrX=",IFredimensionnement__IFdeformation_____symetriser_X); GET_ARGUMENT_L("symetriser_Y=""symetrY=",IFredimensionnement__IFdeformation_____symetriser_Y); GET_ARGUMENT_L("prolonger_X=""prolX=",IFredimensionnement__IFdeformation_____prolonger_X); GET_ARGUMENT_L("prolonger_Y=""prolY=",IFredimensionnement__IFdeformation_____prolonger_Y); GET_ARGUMENT_F("niveau_hors_image=""Hniveau=",IFredimensionnement__IFdeformation_____niveau_hors_image); /* Le 20050623145152, "niveau=" a ete remplace par "Hniveau=" (double definition...). */ ) ); Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(IFmageA,nom_imageA)))) Bblock Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(IFmageA1,nom_imageTX)))) /* Chargement de l'image des translations en 'X' denormalisees... */ Bblock Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(IFmageA2,nom_imageTY)))) /* Chargement de l'image des translations en 'Y' denormalisees... */ Bblock PUSH_DIMENSIONS_2D; SET_DIMENSIONS_2D_SANS_VALIDATION(COXA(INTE(MUL2(facteur_multiplicatif_du_redimensionnement ,ANTI_SUPER_ECHELLE_OX(FLOT(COXR(XminR))) ) ) ) ,COXA(INTE(MUL2(facteur_multiplicatif_du_redimensionnement ,ANTI_SUPER_ECHELLE_OX(FLOT(COXR(XmaxR))) ) ) ) ,COYA(INTE(MUL2(facteur_multiplicatif_du_redimensionnement ,ANTI_SUPER_ECHELLE_OY(FLOT(COYR(YminR))) ) ) ) ,COYA(INTE(MUL2(facteur_multiplicatif_du_redimensionnement ,ANTI_SUPER_ECHELLE_OY(FLOT(COYR(YmaxR))) ) ) ) ); /* Sauvegarde et changement du dimensionnement... */ begin_nouveau_block Bblock BDEFV(imageF,image_deformee); /* Definition de l'image Resultat maintenant que l'on a change les dimensions... */ CALi(IFinitialisation(image_deformee,FZERO)); /* Initialisation de l'image Resultat. */ CALS(IFdeformation(image_deformee ,Xmin,Xmax,Ymin,Ymax ,IFmageA ,EnTete_de_sauvegardM ## Xmin,EnTete_de_sauvegardM ## Xmax ,EnTete_de_sauvegardM ## Ymin,EnTete_de_sauvegardM ## Ymax ,methode_de_redimensionnement_a_utiliser ,IFmageA1 ,IFmageA2 ) ); /* On notera que l'on peut utiliser indifferemment : */ /* */ /* Xmin,Xmax,Ymin,Ymax */ /* */ /* ou : */ /* */ /* XminR,XmaxR,YminR,YmaxR */ /* */ /* qui sont, lors de l'appel a 'IFdeformation(...)' des valeurs egales... */ /* */ /* L'argument (inutile) 'methode_de_redimensionnement_a_utiliser' a ete introduit le */ /* 20030824111710 par symetrie avec 'Iredimensionnement(...)'. */ CALi(IupdateF_image(nom_imageR,image_deformee)); EDEFV(imageF,image_deformee); /* Definition de l'image Resultat maintenant que l'on a change les dimensions... */ Eblock end_nouveau_block PULL_DIMENSIONS_2D; Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes # Aifdef ACCES_AUX_POINTS_LORS_D_UN_ECHANTILLONNAGE_DE_L_IMAGE_VERSION_02 # Eifdef ACCES_AUX_POINTS_LORS_D_UN_ECHANTILLONNAGE_DE_L_IMAGE_VERSION_02 RETU_Commande; Eblock ECommande