Imagen Imagen::operator+( Imagen &imagen){ int filas, columnas; if( nfilas > imagen.filas()) filas = nfilas; else filas = imagen.filas(); columnas = ncolumnas + imagen.columnas(); Imagen resultado(filas,columnas); for (int i = 0; i < nfilas; i++){ for( int j = 0; j < ncolumnas; j++){ resultado.datos[i][j] = datos[i][j]; } } for (int i = 0; i < imagen.filas(); i++){ for ( int j = 0; j < imagen.columnas(); j++){ resultado.datos[i][j+ncolumnas] = imagen.datos[i][j]; } } return resultado; }
void graficaPuntos(double xi, double yi, double xf, double yf, double x[], double y[], int n,Color c, Imagen& I){ double dx = (xf - xi); double dy = (yf - yi); for(int i=1;i<n;i++){ int x1 = (int)floor((x[i-1]-xi)*I.columnas()/dx); int y1 = (int)floor((y[i-1]-yi)*I.filas()/dy); int x2 = (int)floor((x[i]-xi)*I.columnas()/dx); int y2 = (int)floor((y[i]-yi)*I.filas()/dy); primitivas::linea(I, x1,y1,x2,y2,c); } }
int main(int argc, char **argv){ char grises[500]=""; char ruta[300] = "imagenes/"; char ima[100] = ""; Imagen origen; cout<<"Diga el nombre de la imagen con la extension"<< endl; cin >> ima; strcat(ruta,ima); if (!origen.leerImagen(ruta)){ cerr << "error leyendo "<< ruta << "\n"; return 1; } int tama = (origen.filas()*origen.columnas())+1; char arteASCII[tama]; cout<<"Inserta los caracteres: "<< endl; cin >> grises; cout << "\nLa imagen en arte ASCII es:\n"; if(origen.aArteASCII(grises, arteASCII, tama)) cout << arteASCII; else cout << "La conversión no ha sido posible" << endl; }
bool ocultar(Imagen &imagen, char cadena[]){ int tama_ima = imagen.filas() * imagen.columnas(); int tama_mens=strlen(cadena); int contador=0; if( (tama_mens +1) *8 > tama_ima){ cerr << "La cadena es demasiado larga" << endl; // cerr return false; }else{ for (int i =0; i <= tama_mens; i++){ for(int j=7; j>=0; j--){ bool bit = get(cadena[i],j); byte byte_imagen = imagen.getPos(contador); if(bit){ on(byte_imagen,0); imagen.setPos(contador,byte_imagen); }else{ off(byte_imagen,0); imagen.setPos(contador,byte_imagen); } contador++; } } return true; } }
int main() { Imagen origen; Imagen destino(150,200); // Crear un degradado en la imagen destino for (int i=0; i < destino.filas()*destino.columnas(); i++) destino.setPos(i, i%destino.columnas()+20); // Guardar la imagen destino en el fichero degradado.pgm if (destino.escribirImagen("degradado.pgm", false)) { // si todo va bien cout << "degradado.pgm guardado correctamente \n"; cout << "usa: display degradado.pgm para ver el resultado\n"; } else { // si error cerr << "Error guardando la imagen degradado.pgm\n"; return 1; } // Leer la imagen lena.pgm if (!origen.leerImagen("imagenes/lena.pgm")) { cerr << "error leyendo imagenes/lena.pgm\n"; return 1; } // Recortar un trozo de la imagen origen Imagen aux(40,90); Imagen salida (aux); //Llamamos al operador de asignacion for (int i=0; i < salida.filas(); i++) for (int j=0; j < salida.columnas(); j++) salida.set(i, j, origen.get((i+110)%origen.filas(),(j+100)%origen.columnas())); //Hemos aplicado un filtro de modulo para que no intente leear fuera del vector de datos // Guardar la imagen salida en el fichero trozo.pgm if (salida.escribirImagen("trozo.pgm", false)) { // si todo va bien cout << "trozo.pgm guardado correctamente \n"; cout << "usa: display trozo.pgm para ver el resultado\n"; } else { // si error cerr << "Error guardando la imagen trozo.pgm\n"; return 1; } return 0; }
void Imagen::copia(Imagen & imagen){ if(datos==NULL) destruir(); nfilas = imagen.filas(); ncolumnas = imagen.columnas(); datos = new byte*[nfilas]; datos[0]=new byte[nfilas*ncolumnas]; for (int i=1; i < nfilas; i++){ datos[i] = datos[i-1] + ncolumnas; } for(int i=0;i<nfilas;i++) for(int j=0;j<ncolumnas;j++) datos[i][j]=imagen.get(i,j); }
bool revelar(Imagen imagen, char cadena[], const int tam_max){ int tama_ima = imagen.filas() * imagen.columnas(); bool fin=false; int contador=0; for (int i=0; i< tam_max && i< tama_ima && !fin; i++){ for (int j=7; j>=0; j--){ byte byte_imagen = imagen.getPos(contador); if(get(byte_imagen,0)){ unsigned char aux= cadena[i]; on(aux,j); cadena[i]=aux; }else{ unsigned char aux= cadena[i]; off(aux,j); cadena[i]=aux; } contador++; } if (cadena[i]=='\0') fin =true; } return fin; }