29 data =
new Pixel *[nf];
30 for (
int i = 0; i < nf; i++)
32 data[i] =
new Pixel[nc];
33 for (
int j = 0; j < nc; j++)
38 data[i][j].transp = 255;
45 for (
int i = 0; i < nf; i++)
50 void Imagen::copiar(
const Imagen &img)
55 data =
new Pixel *[nf];
56 for (
int i = 0; i < nf; i++)
58 data[i] =
new Pixel[nc];
59 for (
int j = 0; j < nc; j++)
61 data[i][j] = img.data[i][j];
78 ret_p.
r = (p1.
r + p2.
r) / 2;
79 ret_p.
g = (p1.
g + p2.
g) / 2;
80 ret_p.
b = (p1.
b + p2.
b) / 2;
88 unsigned char *aux, *aux_mask;
91 aux =
new unsigned char[f * c * 3];
93 if (mascara_path !=
"")
97 aux_mask =
new unsigned char[fm * cm];
106 int total = f * c * 3;
107 for (
int i = 0; i < total; i += 3)
109 int posi = i / (c * 3);
110 int posj = (i % (c * 3)) / 3;
112 img.data[posi][posj].
r = aux[i];
113 img.data[posi][posj].
g = aux[i + 1];
114 img.data[posi][posj].
b = aux[i + 2];
116 img.data[posi][posj].
transp = aux_mask[i / 3];
118 img.data[posi][posj].
transp = 255;
129 unsigned char *aux =
new unsigned char[nf * nc * 3];
130 unsigned char *m =
new unsigned char[nf * nc];
132 int total = nf * nc * 3;
134 for (
int i = 0; i < total; i += 3)
136 int posi = i / (nc * 3);
137 int posj = (i % (nc * 3)) / 3;
139 aux[i] = data[posi][posj].r;
140 aux[i + 1] = data[posi][posj].g;
141 aux[i + 2] = data[posi][posj].b;
142 m[i / 3] = data[posi][posj].transp;
147 cerr <<
"Ha habido un problema en la escritura de " << img_path << endl;
152 string n_aux =
"mascara_";
153 n_aux = n_aux + img_path;
154 size_t found = n_aux.find(
".ppm");
156 if (found != string::npos)
158 n_aux = n_aux.substr(0, found);
161 n_aux = n_aux +
".pgm";
165 cerr <<
"Ha habido un problema en la escritura de " << n_aux << endl;
173 assert(posi + img.nf < nf && posj + img.nc < nc);
175 for (
int i = 0; i < img.nf; i++)
176 for (
int j = 0; j < img.nc; j++)
177 if (posi + i >= 0 && posi + i < nf && posj + j >= 0 && posj + j < nc)
179 if (img(i,j).transp != 0) {
181 (*this).operator()(posi + i, posj + j) = img(i, j);
182 else if (t == BLENDING) {
183 (*this).operator()(posi + i, posj + j) = media_pixeles((*this).operator()(posi + i, posj + j), img(i, j));
190 assert(i >= 0 && i < nf && j >= 0 && j < nc);
195 assert(i >= 0 && i < nf && j >= 0 && j < nc);
201 double coseno = cos(angulo);
202 double seno = sin(angulo);
204 int rcorners[4],ccorners[4];
205 int newimgrows,newimgcols;
206 double new_row_min,new_col_min,new_row_max,new_col_max;
212 rcorners[2]=getFilas()-1;
213 rcorners[3]=getFilas()-1;
214 ccorners[1]=getColumnas()-1;
215 ccorners[3]=getColumnas()-1;
222 for(
int count=0;count<4;count++){
223 inter=rcorners[count]*coseno+ccorners[count]*seno;
225 if(inter<new_row_min)
227 if(inter>new_row_max)
229 inter1=-rcorners[count]*seno+ccorners[count]*coseno;
231 if(inter1<new_col_min)
233 if(inter1>new_col_max)
237 newimgrows=(unsigned)ceil((
double)new_row_max-new_row_min);
238 newimgcols=(unsigned)ceil((
double)new_col_max-new_col_min);
240 Imagen Iout(newimgrows,newimgcols);
241 for(
int rows=0;rows<newimgrows;rows++){
242 for(
int cols=0;cols<newimgcols;cols++){
243 float oldrowcos=((float)rows+new_row_min)*cos(-rads);
244 float oldrowsin=((float)rows+new_row_min)*sin(-rads);
245 float oldcolcos=((float)cols+new_col_min)*cos(-rads);
246 float oldcolsin=((float)cols+new_col_min)*sin(-rads);
247 float old_row=oldrowcos+oldcolsin;
248 float old_col=-oldrowsin+oldcolcos;
249 old_row=ceil((
double)old_row);
250 old_col=ceil((
double)old_col);
251 if ((old_row >= 0) && (old_row < getFilas()) &&
252 (old_col >= 0) && (old_col < getColumnas())) {
253 Iout(rows, cols) = (*this).operator()(old_row, old_col);
255 Iout(rows, cols).r = Iout(rows, cols).g = Iout(rows, cols).b = 255;
256 Iout(rows, cols).transp = 0;
Pixel & operator()(int i, int j)
Operador de acceso.
void EscribirImagen(const char img_path[]) const
Método que escribe una imagen en disco en el archivo dado por nombre.
Imagen & operator=(const Imagen &img)
Operador de asignación.
void LeerImagen(const char img_path[], const string &nombre_mascara="")
Método que lee una imagen del disco desde el archivo dado por nombre.
Imagen Rota(double rads) const
Método que rota una imagen.
void PutImagen(int i, int j, const Imagen &img, Tipo_Pegado tp=OPACO)
Método que pega una imagen sobre otra.
Imagen()
Constructor por defecto.
Fichero cabecera para la E/S de imágenes.
bool EscribirImagenPPM(const char nombre[], const unsigned char datos[], int f, int c)
Escribe una imagen de tipo PPM.
bool LeerImagenPPM(const char nombre[], int &filas, int &columnas, unsigned char buffer[])
Lee una imagen de tipo PPM sobre memoria reservada.
TipoImagen LeerTipoImagen(const char nombre[], int &filas, int &columnas)
Consulta el tipo de imagen del archivo y sus dimensiones.
bool LeerImagenPGM(const char nombre[], int &filas, int &columnas, unsigned char buffer[])
Lee una imagen de tipo PGM sobre memoria reservada.
bool EscribirImagenPGM(const char nombre[], const unsigned char datos[], int f, int c)
Escribe una imagen de tipo PGM.
Fichero cabecera para el TDA Imagen.
Tipo_Pegado
Enumerado para representar el tipo de pegado de una imagen sobre otra.
Estrucutra para representar un pixel de una imagen.
unsigned char r
Componente R de RGB del pixel.
unsigned char transp
Transparencia del pixel.
unsigned char b
Componente B de RGB del pixel.
unsigned char g
Componente G de RGB del pixel.