/*************************************************************************************************************************************/
/* */
/* 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