/*************************************************************************************************************************************/ /* */ /* R E F O R M A T T A G E D ' U N E I M A G E : */ /* */ /* */ /* Author of '$xci/format.01$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1994??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 FAIRE_UNE_SIMPLE_HOMOTHETIE \ FAUX #define FACTEUR_D_HOMOTHETIE \ FU /* La possibilite de faire une simple homothetie definie par son facteur fut introduite */ /* le 20080823102406... */ #define MULTIPLICITE_HORIZONTALE \ UN #define MULTIPLICITE_VERTICALE \ UN /* Ordres de multiplicite horizontale et verticale de l'image, ce qui permet, par exemple */ /* lors d'une utilisation pour un codage 'MPEG' d'avoir des dimensions multiples de 8... */ /* ATTENTION, ceci n'a de sens que lors de la generation de sequences (voir l'indicateur */ /* 'generer_une_sequence'). */ #define FACTEUR_MULTIPLICATIF_DU_REDIMENSIONNEMENT \ FU \ /* Facteur multiplicatif du nouveau dimensionnement de l'image. */ #define LE_FACTEUR_MULTIPLICATIF_DU_REDIMENSIONNEMENT_PORTE_SUR_LES_EXTREMA_DES_COORDONNEES \ VRAI \ /* Le facteur multiplicatif du nouveau dimensionnement de l'image doit-il porter sur les */ \ /* extrema de 'X' et de 'Y' ('VRAI') ou bien sur les dimensions des axes 'OX' et 'OY' */ \ /* ('FAUX') ? Ceci fut introduit le 20120113114702... */ #define EDITER_formatI_LORS_DU_REDIMENSIONNEMENT \ FAUX \ /* Indique si la valeur de '$formatI' de l'image redimensionnee doit etre editee ('VRAI') */ \ /* ou pas ('FAUX'). */ #define GENERER_UNE_SEQUENCE \ FAUX \ /* Doit-on generer une sequence d'images ('VRAI') ou une seule image ('FAUX'). Seul le mode */ \ /* 'REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_POSITIONNEMENT_QUELCONQUE' est autorise */ \ /* lorsqu'une sequence est demandee. */ #define NOMBRE_D_IMAGES_SUR_L_HORIZONTALE \ UN #define NOMBRE_D_IMAGES_SUR_LA_VERTICALE \ UN /* Afin de definir le nombre d'images d'une eventuelle sequence. */ #define ELIMINER_LES_IMAGES_UNIFORMES \ FAUX \ /* Indique si les images "uniformes" (c'est-a-dire ou tous les points ont le meme niveau */ \ /* doivent etre eliminees ('VRAI') ou conservees ('FAUX'). */ #define DEFINITION_DES_IMAGES_UNIFORMES \ NOIR \ /* Definition du niveau qualifiant les images "uniformes" (c'est-a-dire ou tous les points */ \ /* ont le meme niveau. */ #include xci/reduction.11.I" #define DIMENSION_DILATATION \ EXP2(DOUP(DEUX)) \ /* Taille du pave de dilatation si 'IL_FAUT(dilater_les_images)'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #define REDIMENSIONNEMENT_DE_L_IMAGE_RESULTAT \ Bblock \ Test(EST_VRAI(le_facteur_multiplicatif_du_redimensionnement_porte_sur_les_extrema_des_coordonnees)) \ Bblock \ 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))) \ ) \ ) \ ) \ ); \ /* Changement du dimensionnement via les extrema des coordonnees... */ \ /* */ \ /* Je note le 20120113105632 que, par exemple, un facteur de 0.25 applique au format 'Pal' */ \ /* ne donne pas le format 'Puq'. En effet cela donne grace a "editer=VRAI" : */ \ /* */ \ /* setenv Xmin 0 */ \ /* setenv Xmax 194 */ \ /* setenv Ymin 0 */ \ /* setenv Ymax 143 */ \ /* */ \ /* alors que : */ \ /* */ \ /* $format_Puq="Xmin=0 Xmax=194 Ymin=0 Ymax=142" */ \ /* - */ \ /* */ \ /* et donc 143 et non pas, comme espere, 142... Cela semble venir du fait que ci-dessus */ \ /* 'facteur_multiplicatif_du_redimensionnement' porte sur les extrema respectifs de 'X' et */ \ /* de 'Y', alors que dans 'v $Fimages_f' le diviseur '$DiViSeUr' porte sur les dimensions */ \ /* des axes 'OX' et 'OY'... */ \ /* */ \ /* 'le_facteur_multiplicatif_du_redimensionnement_porte_sur_les_extrema_des_coordonnees' */ \ /* fut introduit pour corriger cela le 20120113114702 lorsqu'il est 'FAUX'... */ \ Eblock \ ATes \ Bblock \ SET_DIMENSIONS_2D_SANS_VALIDATION(XminR \ ,XYZmax(XminR \ ,INTE(MUL2(facteur_multiplicatif_du_redimensionnement \ ,DIMENSION(XminR \ ,COXA(ANTI_SUPER_ECHELLE_OX(FLOT(COXR(XmaxR)))) \ ) \ ) \ ) \ ) \ ,YminR \ ,XYZmax(YminR \ ,INTE(MUL2(facteur_multiplicatif_du_redimensionnement \ ,DIMENSION(YminR \ ,COYA(ANTI_SUPER_ECHELLE_OY(FLOT(COYR(YmaxR)))) \ ) \ ) \ ) \ ) \ ); \ /* Changement du dimensionnement via les dimensions des axes (introduit le 20120113114702). */ \ Eblock \ ETes \ Eblock \ /* Redimensionnement de l'image Resultat introduit sous cette forme le 20120113113114... */ #define VALIDATION_D_UN_REDIMENSIONNEMENT_NEUTRE(sequence_de_validation) \ Bblock \ Test(EST_VRAI(LE_FORMAT_RESULTAT_EST_DIFFERENT_DU_FORMAT_ARGUMENT(Xmin \ ,Xmax \ ,Ymin \ ,Ymax \ ,EnTete_de_sauvegardM ## Xmin \ ,EnTete_de_sauvegardM ## Xmax \ ,EnTete_de_sauvegardM ## Ymin \ ,EnTete_de_sauvegardM ## Ymax \ ) \ ) \ ) \ /* Test introduit le 20170316091156... */ \ Bblock \ Eblock \ ATes \ Bblock \ Choi(methode_de_redimensionnement_a_utiliser) \ Bblock \ Ca3e(REECHANTILLONNAGE_PAR_REPLICATION_ET_DESTRUCTION \ ,REECHANTILLONNAGE_PAR_INTERPOLATION_BILINEAIRE \ ,REECHANTILLONNAGE_PAR_INTERPOLATION_BICUBIQUE \ ) \ /* Dans le cas ou le format n'a pas change et ou il s'agit des trois methodes precedentes, */ \ /* on verifie en fait que le redimensionnement a ete neutre... */ \ Bblock \ BLOC(sequence_de_validation); \ Eblock \ ECa3 \ \ Ca6e(REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_MISE_DANS_LE_COIN_BAS_GAUCHE \ ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_MISE_DANS_LE_COIN_BAS_DROITE \ ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_MISE_DANS_LE_COIN_HAUT_DROITE \ ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_MISE_DANS_LE_COIN_HAUT_GAUCHE \ ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_MISE_AU_CENTRE \ ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_POSITIONNEMENT_QUELCONQUE \ ) \ Bblock \ Eblock \ ECa6 \ \ Defo \ Bblock \ PRINT_ERREUR("la methode demandee n'existe pas"); \ Eblock \ EDef \ Eblock \ ECho \ Eblock \ ETes \ Eblock \ /* Validation d'un redimensionnement neutre (introduit le 20170316091156). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E F O R M A T T A G E 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(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 ('v $xiii/di_image$DEF types_de_methode_de_redimensionnement') : */ /* */ /* 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 */ /* a 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 */ /* a trop, */ /* 9 = par mise en coincidence des mlieux des cotes inferieurs, */ /* 10= par mise en coincidence des mlieux des cotes droites, */ /* 11= par mise en coincidence des mlieux des cotes superieurs, */ /* 12= par mise en coincidence des mlieux des cotes gauches, */ /* */ /* ou 'NoIr' represente 'REECHANTILLONNAGE_GENERAL_____niveau_manquant' ('NOIR' par defaut). */ /* */ /* ATTENTION, ceci n'a d'utilite qu'en mode "standard=VRAI" ; en mode "standard=FAUX", la */ /* methode '2' est implicite (car seule disponible)... */ /* */ /* On lira avec interet le commentaire suivant 'v $xiirv/$Fnota Fin_listG_GOLD_41' qui */ /* parle de la superposabilite des modes '0' et '1/2'... */ 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(Logical,INIT(faire_une_simple_homothetie,FAIRE_UNE_SIMPLE_HOMOTHETIE)); DEFV(Float,INIT(facteur_d_homothetie,FACTEUR_D_HOMOTHETIE)); /* La possibilite de faire une simple homothetie definie par son facteur fut introduite */ /* le 20080823102406... */ DEFV(Int,INIT(multiplicite_horizontale,MULTIPLICITE_HORIZONTALE)); DEFV(Int,INIT(multiplicite_verticale,MULTIPLICITE_VERTICALE)); /* Ordres de multiplicite horizontale et verticale de l'image, ce qui permet, par exemple */ /* lors d'une utilisation pour un codage 'MPEG' d'avoir des dimensions multiples de 8... */ /* ATTENTION, ceci n'a de sens que lors de la generation de sequences (voir l'indicateur */ /* 'generer_une_sequence'). */ 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. */ DEFV(Logical,INIT(le_facteur_multiplicatif_du_redimensionnement_porte_sur_les_extrema_des_coordonnees ,LE_FACTEUR_MULTIPLICATIF_DU_REDIMENSIONNEMENT_PORTE_SUR_LES_EXTREMA_DES_COORDONNEES ) ); /* Le facteur multiplicatif du nouveau dimensionnement de l'image doit-il porter sur les */ /* extrema de 'X' et de 'Y' ('VRAI') ou bien sur les dimensions des axes 'OX' et 'OY' */ /* ('FAUX') ? Ceci fut introduit le 20120113114702... */ DEFV(Logical,INIT(editer_formatI_lors_du_redimensionnement,EDITER_formatI_LORS_DU_REDIMENSIONNEMENT)); /* Indique si la valeur de '$formatI' de l'image redimensionnee doit etre editee ('VRAI') */ /* ou pas ('FAUX'). */ DEFV(Logical,INIT(generer_une_sequence,GENERER_UNE_SEQUENCE)); /* Doit-on generer une sequence d'images ('VRAI') ou une seule image ('FAUX'). Seul le mode */ /* 'REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_POSITIONNEMENT_QUELCONQUE' est autorise */ /* lorsqu'une sequence est demandee. */ DEFV(CHAR,INIC(POINTERc(nom_postfixe),NOM_UNDEF_VIDE)); /* Nom d'un eventuel postfixe a utiliser dans le cas de la generation d'une sequence. */ DEFV(Int,INIT(premiere_image,PREMIERE_IMAGE)); /* Numero de la premiere image, */ DEFV(Int,INIT(pas_des_images,PAS_DES_IMAGES)); /* Pas de passage d'un numero d'image a une autre. */ DEFV(Int,INIT(nombre_de_chiffres,NOMBRE_DE_CHIFFRES)); /* Nombre de chiffres codant le numero des images de la serie... */ DEFV(Int,INIT(numero_d_image,UNDEF)); /* Numero de l'image courante. */ DEFV(CHAR,INIT(POINTERc(nom_image),NOM_UNDEF)); /* Nom courant des images. */ DEFV(Int,INIT(nombre_d_images_sur_l_horizontale,NOMBRE_D_IMAGES_SUR_L_HORIZONTALE)); DEFV(Int,INIT(nombre_d_images_sur_la_verticale,NOMBRE_D_IMAGES_SUR_LA_VERTICALE)); /* Afin de definir le nombre d'images d'une eventuelle sequence. */ DEFV(Logical,INIT(eliminer_les_images_uniformes,ELIMINER_LES_IMAGES_UNIFORMES)); /* Indique si les images "uniformes" (c'est-a-dire ou tous les points ont le meme niveau */ /* doivent etre eliminees ('VRAI') ou conservees ('FAUX'). */ DEFV(genere_p,INIT(definition_des_images_uniformes,DEFINITION_DES_IMAGES_UNIFORMES)); /* Definition du niveau qualifiant les images "uniformes" (c'est-a-dire ou tous les points */ /* ont le meme niveau. */ #include xci/reduction.13.I" /*..............................................................................................................................*/ EGAL(Iredimensionnement_____Atranslation_OX,ZERO); EGAL(Iredimensionnement_____Atranslation_OY,ZERO); EGAL(Iredimensionnement_____Rtranslation_OX,FZERO); EGAL(Iredimensionnement_____Rtranslation_OY,FZERO); /* Initialisations standards... */ EGAL(IFredimensionnement_____Atranslation_OX,ZERO); EGAL(IFredimensionnement_____Atranslation_OY,ZERO); EGAL(IFredimensionnement_____Rtranslation_OX,FZERO); EGAL(IFredimensionnement_____Rtranslation_OY,FZERO); /* Initialisations standards introduites le 20090514121928... */ GET_ARGUMENTSi(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("REECHANTILLONNAGE_GENERAL_____compatibilite_20170316=""compatibilite_20170316=" ,REECHANTILLONNAGE_GENERAL_____compatibilite_20170316 ); /* Parametre introduit le 20170316085800... */ GET_ARGUMENT_C("imageA=""A=",nom_imageA); GET_ARGUMENT_C("imageR=""R=",nom_imageR); GET_ARGUMENT_L("standard=",les_images_sont_standards); GET_ARGUMENT_I("mode=""methode=",methode_de_redimensionnement_a_utiliser); GET_ARGUMENT_L("MdefRedim=",Iredimensionnement_____messages_MdefRedim); GET_ARGUMENT_P("niveau=""niveau_hors_echantillon=",REECHANTILLONNAGE_GENERAL_____niveau_manquant); /* Argument complete le 20160207103545 pour une meilleure comprehension... */ 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_I("FAtrx=""FAtrX=",IFredimensionnement_____Atranslation_OX); GET_ARGUMENT_I("FAtry=""FAtrY=",IFredimensionnement_____Atranslation_OY); GET_ARGUMENT_F("FRtrx=""FRtrX=",IFredimensionnement_____Rtranslation_OX); GET_ARGUMENT_F("FRtry=""FRtrY=",IFredimensionnement_____Rtranslation_OY); 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__IFdeformation_...' ont ete introduits le */ /* 20041107180528... */ /* */ /* Les quatre arguments 'IFredimensionnement_____?translation_O?' ont ete introduits le */ /* 20090514121928... */ GET_ARGUMENT_L("periodiser_X=""periodX=""per_X=",Iredimensionnement_____periodiser_X); GET_ARGUMENT_L("periodiser_Y=""periodY=""per_Y=",Iredimensionnement_____periodiser_Y); GET_ARGUMENT_L("prolonger_X=""prolX=",Iredimensionnement_____prolonger_X); GET_ARGUMENT_L("prolonger_Y=""prolY=",Iredimensionnement_____prolonger_Y); GET_ARGUMENT_L("symetriser_X=""symetrX=",Iredimensionnement_____symetriser_X); GET_ARGUMENT_L("symetriser_Y=""symetrY=",Iredimensionnement_____symetriser_Y); GET_ARGUMENT_P("niveau_hors_image=""nhi=",Iredimensionnement_____niveau_hors_image); GET_ARGUMENT_L("Fperiodiser_X=""FperiodX=""Fper_X=",IFredimensionnement__IFdeformation_____periodiser_X); GET_ARGUMENT_L("Fperiodiser_Y=""FperiodY=""Fper_Y=",IFredimensionnement__IFdeformation_____periodiser_Y); GET_ARGUMENT_L("Fprolonger_X=""FprolX=",IFredimensionnement__IFdeformation_____prolonger_X); GET_ARGUMENT_L("Fprolonger_Y=""FprolY=",IFredimensionnement__IFdeformation_____prolonger_Y); GET_ARGUMENT_L("Fsymetriser_X=""FsymetrX=",IFredimensionnement__IFdeformation_____symetriser_X); GET_ARGUMENT_L("Fsymetriser_Y=""FsymetrY=",IFredimensionnement__IFdeformation_____symetriser_Y); GET_ARGUMENT_F("Fniveau_hors_image=""Fnhi=",IFredimensionnement__IFdeformation_____niveau_hors_image); /* Tous les arguments precedents ont ete introduits le 20090514161944... */ GET_ARGUMENT_L("homothetie=""h=",faire_une_simple_homothetie); GET_ARGUMENT_F("facteur_homothetie=""fh=",facteur_d_homothetie); /* Parametres introduits le 20080823102406... */ 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_I("mh=",multiplicite_horizontale); GET_ARGUMENT_I("mv=",multiplicite_verticale); GET_ARGUMENT_F("facteur=""f=",facteur_multiplicatif_du_redimensionnement); GET_ARGUMENT_L("facteur_extrema_coordonnees=""fec=" ,le_facteur_multiplicatif_du_redimensionnement_porte_sur_les_extrema_des_coordonnees ); GET_ARGUMENT_N("facteur_dimensions=""fd=" ,le_facteur_multiplicatif_du_redimensionnement_porte_sur_les_extrema_des_coordonnees ); /* Parametres introduits le 20120113114702... */ GET_ARGUMENT_L("formatI=""editer=",editer_formatI_lors_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_ARGUMENTS2_F("facteur_X_barycentrique=""fXb=""fxb=" ,REECHANTILLONNAGE_BILINEAIRE_____facteur__X_barycentrique ,REECHANTILLONNAGE_BICUBIQUE_____facteur__X_barycentrique ); GET_ARGUMENTS2_F("facteur_Y_barycentrique=""fYb=""fyb=" ,REECHANTILLONNAGE_BILINEAIRE_____facteur__Y_barycentrique ,REECHANTILLONNAGE_BICUBIQUE_____facteur__Y_barycentrique ); /* Parametres introduits le 20220917123901 pour voir si cela peut etre utile (cela fait */ /* suite au probleme 'v $xiMo/creation$Z 20220916094544'...). */ GET_ARGUMENT_F("derivee=",VOISINAGE_POINT_BICUBIQUE_____facteur_des_derivees_numeriques); GET_ARGUMENT_L("sequence=",generer_une_sequence); GET_ARGUMENT_C("postfixe=",nom_postfixe); GET_ARGUMENT_I("premiere=",premiere_image); GET_ARGUMENT_I("pas=",pas_des_images); GET_ARGUMENT_I("chiffres=",nombre_de_chiffres); GET_ARGUMENT_I("horizontal=",nombre_d_images_sur_l_horizontale); GET_ARGUMENT_I("vertical=",nombre_d_images_sur_la_verticale); GET_ARGUMENT_L("eliminer=",eliminer_les_images_uniformes); GET_ARGUMENT_P("uniformes=",definition_des_images_uniformes); GET_ARGUMENT_L("dilater=",dilater_les_images); GET_ARGUMENT_I("points=""pave=""p=",dimension_dilatation); GET_ARGUMENT_L("tous_niveaux=""tous=",dilatation_tous_les_niveaux); GET_ARGUMENT_L("dilatation_carree=""dcarree=",dilatation_carree); /* Le 20060118131345, "carre=" a ete remplace par "dilatation_carree=" et "dcarree=" */ /* (risque de double definition...). */ ) ); Test(IL_FAUT(faire_une_simple_homothetie)) /* Test introduit le 20080823102406... */ Bblock EGAL(XminR,Xmin); EGAL(XmaxR,XYZmax(XminR,INTE(MUL2(facteur_d_homothetie,FLOT(dimX))))); EGAL(YminR,Ymin); EGAL(YmaxR,XYZmax(YminR,INTE(MUL2(facteur_d_homothetie,FLOT(dimY))))); Eblock ATes Bblock Eblock ETes CALS(gIles_images_sont_standards(les_images_sont_standards,nom_imageA)); /* Ceci fut introduit le 20060309192002 pour 'v $xci/ExecSdu$vv$Z .xci.format.01.X'... */ Test(EST_VRAI(les_images_sont_standards)) Bblock /* Cas d'une image 'image' : */ DEFV(CHAR,INIC(POINTERc(nom_imageA_dilatee),NOM_UNDEF)); /* Au cas ou il serait necessaire de dilater l'image Argument... */ #include xci/reduction.12.I" DILATATION_D_UNE_IMAGE_AVANT_REDUCTION(nom_imageA_dilatee,nom_imageA,dimension_dilatation); /* Dilatation optionnelle de l'image Argument... */ Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA ,COND(IL_NE_FAUT_PAS(dilater_les_images) ,nom_imageA ,nom_imageA_dilatee ) ) ) ) ) /* On notera que le chargement de l'image Argument a lieu avec les dimensions definies */ /* par '$formatI"... */ Bblock PUSH_DIMENSIONS_2D; REDIMENSIONNEMENT_DE_L_IMAGE_RESULTAT; /* Sauvegarde et changement du dimensionnement... */ begin_nouveau_block Bblock BDEFV(image,image_redimensionnee); /* Definition de l'image Resultat maintenant que l'on a change les dimensions... */ Test(IL_NE_FAUT_PAS(generer_une_sequence)) Bblock Test(IL_FAUT(editer_formatI_lors_du_redimensionnement)) Bblock CAL3(Prme1("setenv Xmin %d\n",Xmin)); CAL3(Prme1("setenv Xmax %d\n",Xmax)); CAL3(Prme1("setenv Ymin %d\n",Ymin)); CAL3(Prme1("setenv Ymax %d\n",Ymax)); Eblock ATes Bblock Eblock ETes CALi(Iinitialisation(image_redimensionnee,REECHANTILLONNAGE_GENERAL_____niveau_manquant)); /* Initialisation de l'image Resultat. */ CALS(Iredimensionnement(image_redimensionnee ,Xmin,Xmax,Ymin,Ymax ,ImageA ,EnTete_de_sauvegardM ## Xmin,EnTete_de_sauvegardM ## Xmax ,EnTete_de_sauvegardM ## Ymin,EnTete_de_sauvegardM ## Ymax ,methode_de_redimensionnement_a_utiliser ) ); /* On notera que l'on peut utiliser indifferemment : */ /* */ /* Xmin,Xmax,Ymin,Ymax */ /* */ /* ou : */ /* */ /* XminR,XmaxR,YminR,YmaxR */ /* */ /* qui sont, lors de l'appel a 'Iredimensionnement(...)' des valeurs egales... */ VALIDATION_D_UN_REDIMENSIONNEMENT_NEUTRE ( BLOC(Bblock BDEFV(image,image_validation); CALS(Isoustraction(image_validation,image_redimensionnee,ImageA)); Test(IFNE(Icomptage_des_points_dans_un_intervalle(image_validation,NOIR,NOIR),dimXY)) Bblock PRINT_ERREUR("un redimensionnement qui devrait etre neutre ne l'est pas"); Eblock ATes Bblock Eblock ETes EDEFV(image,image_validation); Eblock ) ); CALi(Iupdate_image(nom_imageR,image_redimensionnee)); Eblock ATes Bblock DEFV(Int,INIT(translation_horizontale,DIMENSION(Xmin,Xmax))); DEFV(Int,INIT(translation_verticale,DIMENSION(Ymin,Ymax))); /* Pour translater la "fenetre" dans 'ImageA'... */ BSaveVariable(Int,Iredimensionnement_____Atranslation_OY); /* Sauvegarde du "debut de colonne"... */ EGAL(mXminR,XminR); EGAL(mXmaxR,XYZmax(XminR,MULD(DIMENSION(XminR,XmaxR),multiplicite_horizontale))); EGAL(mYminR,YminR); EGAL(mYmaxR,XYZmax(YminR,MULD(DIMENSION(YminR,YmaxR),multiplicite_verticale))); /* Dimension de l'image Resultat, apres prise en compte d'une eventuelle "multiplicite"... */ Test(IL_FAUT(editer_formatI_lors_du_redimensionnement)) Bblock CAL3(Prme1("setenv Xmin %d\n",mXminR)); CAL3(Prme1("setenv Xmax %d\n",mXmaxR)); CAL3(Prme1("setenv Ymin %d\n",mYminR)); CAL3(Prme1("setenv Ymax %d\n",mYmaxR)); Eblock ATes Bblock Eblock ETes Test(IFNE(methode_de_redimensionnement_a_utiliser ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_POSITIONNEMENT_QUELCONQUE ) ) Bblock PRINT_ERREUR("lors de la generation d'une sequence, le mode est impose"); EGAL(methode_de_redimensionnement_a_utiliser ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_POSITIONNEMENT_QUELCONQUE ); Eblock ATes Bblock Eblock ETes EGAL(numero_d_image,premiere_image); /* Numero de la premiere image. */ Repe(nombre_d_images_sur_la_verticale) Bblock BSaveVariable(Int,Iredimensionnement_____Atranslation_OX); /* Sauvegarde du "debut de ligne"... */ Repe(nombre_d_images_sur_l_horizontale) Bblock DEFV(genere_p,INIT(niveau_minimum,NOIR)); DEFV(pointF_2D,point_minimum); DEFV(genere_p,INIT(niveau_maximum,BLANC)); DEFV(pointF_2D,point_maximum); /* Afin de pouvoir appeler 'Inivo_extrema(...)' si necessaire. On notera l'initialisation */ /* {NOIR,BLANC} a priori des extrema permettant de gerer facilement le cas ou les images */ /* uniformes sont a conserver... */ CALi(Iinitialisation(image_redimensionnee ,REECHANTILLONNAGE_GENERAL_____niveau_manquant ) ); /* Initialisation de l'image Resultat. */ CALS(Iredimensionnement(image_redimensionnee ,Xmin,Xmax,Ymin,Ymax ,ImageA ,EnTete_de_sauvegardM ## Xmin,EnTete_de_sauvegardM ## Xmax ,EnTete_de_sauvegardM ## Ymin,EnTete_de_sauvegardM ## Ymax ,methode_de_redimensionnement_a_utiliser ) ); /* On notera que l'on peut utiliser indifferemment : */ /* */ /* Xmin,Xmax,Ymin,Ymax */ /* */ /* ou : */ /* */ /* XminR,XmaxR,YminR,YmaxR */ /* */ /* qui sont, lors de l'appel a 'Iredimensionnement(...)' des valeurs egales... */ Test(IL_FAUT(eliminer_les_images_uniformes)) Bblock CALS(Inivo_extrema(image_redimensionnee ,ADRESSE(niveau_minimum),ADRESSE(point_minimum) ,ADRESSE(niveau_maximum),ADRESSE(point_maximum) ) ); /* Lorsqu'il faut eliminer les images uniformes, on recherche les extrema des niveaux. */ Eblock ATes Bblock Eblock ETes Test(IFET(IFEQ(niveau_minimum,definition_des_images_uniformes) ,IFEQ(niveau_maximum,definition_des_images_uniformes) ) ) Bblock /* Cas d'une image dite "uniforme", on l'elimine de la suite generee lorsque cela est */ /* demande... */ Eblock ATes Bblock /* Cas d'une image non "uniforme", ou bien cas ou toutes les images sont conservees... */ EGAL(nom_image ,COND(IFEQ_chaine(nom_postfixe,NOM_UNDEF_VIDE) ,chain_Aconcaten2_sauf_nom_pipe(nom_imageR ,chain_numero(numero_d_image,nombre_de_chiffres) ) ,chain_Aconcaten3_sauf_nom_pipe(nom_imageR ,chain_numero(numero_d_image,nombre_de_chiffres) ,nom_postfixe ) ) ); Test(IFOU(IFET(IFEQ(multiplicite_horizontale,UN),IFEQ(multiplicite_verticale,UN)) ,IFET(IFET(IFEQ(mXminR,XminR) ,IFEQ(mXmaxR,XmaxR) ) ,IFET(IFEQ(mYminR,YminR) ,IFEQ(mYmaxR,YmaxR) ) ) ) ) Bblock CALi(Iupdate_image(nom_image,image_redimensionnee)); /* Generation de l'image courante de la sequence, */ Eblock ATes Bblock PUSH_DIMENSIONS_2D; SET_DIMENSIONS_2D_SANS_VALIDATION(mXminR,mXmaxR,mYminR,mYmaxR); /* Sauvegarde et changement du dimensionnement... */ begin_nouveau_block Bblock BDEFV(image,image_redimensionnee_et_retaillee); /* Definition de l'image Resultat maintenant que l'on a change les dimensions... */ CALi(Iinitialisation(image_redimensionnee_et_retaillee ,REECHANTILLONNAGE_GENERAL_____niveau_manquant ) ); /* Initialisation de l'image Resultat. */ CALS(Iredimensionnement(image_redimensionnee_et_retaillee ,Xmin,Xmax,Ymin,Ymax ,image_redimensionnee ,EnTete_de_sauvegardM ## Xmin,EnTete_de_sauvegardM ## Xmax ,EnTete_de_sauvegardM ## Ymin,EnTete_de_sauvegardM ## Ymax ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_MISE_AU_CENTRE ) ); CALi(Iupdate_image(nom_image,image_redimensionnee_et_retaillee)); /* Generation de l'image courante de la sequence, */ EDEFV(image,image_redimensionnee_et_retaillee); /* Definition de l'image Resultat maintenant que l'on a change les dimensions... */ Eblock end_nouveau_block PULL_DIMENSIONS_2D; Eblock ETes INCR(numero_d_image,pas_des_images); /* Numero de l'image suivante. */ Eblock ETes INCR(Iredimensionnement_____Atranslation_OX,translation_horizontale); /* Translation du "debut de ligne"... */ Eblock ERep ESaveVariable(Int,Iredimensionnement_____Atranslation_OX); /* Restauration du "debut de ligne"... */ INCR(Iredimensionnement_____Atranslation_OY,translation_verticale); /* Translation du "debut de colonne"... */ Eblock ERep ESaveVariable(Int,Iredimensionnement_____Atranslation_OY); /* Restauration du "debut de colonne"... */ Eblock ETes EDEFV(image,image_redimensionnee); /* 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 /* Cas d'une image 'imageF' : */ Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(IFmageA,nom_imageA)))) /* On notera que le chargement de l'image Argument a lieu avec les dimensions definies */ /* par '$formatI"... */ Bblock PUSH_DIMENSIONS_2D; REDIMENSIONNEMENT_DE_L_IMAGE_RESULTAT; /* Sauvegarde et changement du dimensionnement... */ begin_nouveau_block Bblock BDEFV(imageF,image_redimensionnee); /* Definition de l'image Resultat maintenant que l'on a change les dimensions... */ CALi(IFinitialisation(image_redimensionnee,FZERO)); /* Initialisation de l'image Resultat. */ CALS(IFredimensionnement(image_redimensionnee ,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 ) ); /* On notera que l'on peut utiliser indifferemment : */ /* */ /* Xmin,Xmax,Ymin,Ymax */ /* */ /* ou : */ /* */ /* XminR,XmaxR,YminR,YmaxR */ /* */ /* qui sont, lors de l'appel a 'Iredimensionnement(...)' des valeurs egales... */ /* */ /* L'argument (inutile) 'methode_de_redimensionnement_a_utiliser' a ete introduit le */ /* 20030824111710 par symetrie avec 'Iredimensionnement(...)'. */ VALIDATION_D_UN_REDIMENSIONNEMENT_NEUTRE ( BLOC(Bblock BDEFV(imageF,image_validation); CALS(IFsoustraction(image_validation,image_redimensionnee,IFmageA)); Test(IFNE(IFcomptage_des_points_dans_un_intervalle(image_validation,FLOT__NOIR,FLOT__NOIR),dimXY)) Bblock PRINT_ERREUR("un redimensionnement qui devrait etre neutre ne l'est pas"); Eblock ATes Bblock Eblock ETes EDEFV(imageF,image_validation); Eblock ) ); CALi(IupdateF_image(nom_imageR,image_redimensionnee)); EDEFV(imageF,image_redimensionnee); /* 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 ETes RETU_Commande; Eblock ECommande