1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
/* DEBUT CODE EN AMONT */
#include <assert.h>
#include <stdlib.h>
/* .... */
int rc = 0;
float * littleImg;
int dimPetit = 512;
unsigned char * largeImg;
int dimGrand = 1024;
littleImg = malloc(dimPetit*dimPetit*sizeof*littleImg);
if (!littleImg) { /* gestion erreur, sortie */ }
largeImg = malloc(dimGrand*dimGrand*sizeof*largeImg);
if (!largeImg) { /* gestion erreur, sortie */ }
/* Remplissage buffers .... */
/* Retaillage */
rc = retailler(littleImg, dimPetit, dimPetit, largeImg, dimGrand, dimGrand);
assert(!rc);
/* Affichage ou je ne sais quoi .... */
/* Libération mémoire */
free(largeImg);
free(littleImg);
/* FIN CODE EN AMONT */
/* Proposition de fonction modifiee */
int retailler(float * petiteImgBuf, int PetitX, int PetitY, MIL_ID * grandeImgBuf, int GrandX, int GrandY)
{
int rc = 0;
/* Ctrl args */
if (!petiteImgBuf) { rc = -1; }
if (PetitX < 0) { rc = -2; }
if (PetitY < 0) { rc = -3; }
if (!grandeImgBuf) { rc = -4; }
if (GrandX < 0) { rc = -5; }
if (GrandY < 0) { rc = -6; }
if (rc >= 0) {
/* 'Marges' quand la petite image est centrée sur la grande */
int deltaX, deltaY;
/* Indices de boucle */
int i,j;
float *pixelfloat = petiteImgBuf; /* Pointeur pour l'image en float */
unsigned char *pixel = (unsigned char *)grandeImgBuf; /* Pointeur pour l'image en char */
/* Calcul des marges */
deltaX = (GrandX-PetitX)/2;
deltaY = (GrandY-PetitY)/2;
for(j=0;j<GrandY;++j) {
for(i=0;i<GrandX;++i) {
/* Si le pixel lu dans la grande image n'est pas dans les marges */
if(i>=deltaX && i<(PetitX + deltaX) && j>=deltaY && j<(PetitY + deltaY)) {
/* On l'ajoute à la petite image */
*pixelfloat = (float)*pixel;
/* On passe au pixel suivant sur la petite image */
++pixelfloat;
}
/* Dans tous les cas, on doit lire le pixel suivant sur la grande image */
++pixel;
}
}
}
return rc;
} |