21/01/2013, 18:14
|
| | Fecha de Ingreso: enero-2013
Mensajes: 8
Antigüedad: 11 años, 9 meses Puntos: 0 | |
Respuesta: violacion de segmento complicado gracias por responder!!
la idea de hacerlo asi, es para que quede de esta forma:
ya he utilizado esta representacion de matriz en otras ocasiones. de hecho haces unos meses hice otra version de esta misma clase Imagen (sin iteradores ni templates). utilice esta misma representacion y funcionaba.
lo que dices de las funciones Borrar y Copiar, sinceramente ahora no sabria decirte porque lo he hecho asi. estoy lo hice practicamente al principio de todo y has surgido tantos problemas que ya ni me acuerdo. pero creo recordar que en una clase (sin ninguna relacion con esta) que me facilitaron mis profesores hicieron algo parecido.
si quieres probar mi codigo (cosa que realmente agradezco, porque va a ser mucho lio solo para ayudarme) aun faltan algunos archivos:
imagenES.h
Código:
#ifndef _IMAGEN_ES_H_
#define _IMAGEN_ES_H_
enum TipoImagen {IMG_DESCONOCIDO, IMG_PGM, IMG_PPM};
TipoImagen LeerTipoImagen (const char *nombre);
unsigned char *LeerImagenPPM (const char *nombre, int& fils, int& cols);
bool EscribirImagenPPM (const char *nombre, const unsigned char *datos,const int fils, const int cols);
unsigned char *LeerImagenPGM (const char *nombre, int& fils, int& cols);
bool EscribirImagenPGM (const char *nombre, const unsigned char *datos, const int fils, const int cols);
#endif
imagenES.cpp
Código:
#include <fstream>
#include <string>
#include <imagenES.h>
using namespace std;
TipoImagen LeerTipo(ifstream& f){
char c1,c2;
TipoImagen res= IMG_DESCONOCIDO;
if (f){
c1=f.get();
c2=f.get();
if (f && c1=='P')
switch (c2) {
case '5': res= IMG_PGM; break;
case '6': res= IMG_PPM; break;
default: res= IMG_DESCONOCIDO;
}
}
return res;
}
// _____________________________________________________________________________
TipoImagen LeerTipoImagen(const char *nombre){
ifstream f(nombre);
return LeerTipo(f);
}
// _____________________________________________________________________________
char SaltarSeparadores (ifstream& f){
char c;
do{
c= f.get();
} while (isspace(c));
f.putback(c);
return c;
}
// _____________________________________________________________________________
bool LeerCabecera (ifstream& f, int& fils, int& cols){
int maxvalor;
string linea;
while (SaltarSeparadores(f)=='#')
getline(f,linea);
f >> cols >> fils >> maxvalor;
if (/*str &&*/ f && fils>0 && fils<5000 && cols>0 && cols<5000){
f.get(); // Saltamos separador
return true;
}
else
return false;
}
// _____________________________________________________________________________
unsigned char *LeerImagenPPM (const char *nombre, int& fils, int& cols){
unsigned char *res=0;
fils=0;
cols=0;
ifstream f(nombre);
if (LeerTipo(f)==IMG_PPM){
if (LeerCabecera (f, fils, cols)){
res= new unsigned char[fils*cols*3];
f.read(reinterpret_cast<char *>(res),fils*cols*3);
if (!f){
delete[] res;
res= 0;
}
}
}
return res;
}
// _____________________________________________________________________________
unsigned char *LeerImagenPGM (const char *nombre, int& fils, int& cols){
unsigned char *res=0;
fils=0;
cols=0;
ifstream f(nombre);
if (LeerTipo(f)==IMG_PGM){
if (LeerCabecera (f, fils, cols)){
res= new unsigned char[fils*cols];
f.read(reinterpret_cast<char *>(res),fils*cols);
if (!f){
delete[] res;
res= 0;
}
}
}
return res;
}
// _____________________________________________________________________________
bool EscribirImagenPPM (const char *nombre, const unsigned char *datos,
const int fils, const int cols){
ofstream f(nombre);
bool res= true;
if (f){
f << "P6" << endl;
f << cols << ' ' << fils << endl;
f << 255 << endl;
f.write(reinterpret_cast<const char *>(datos),fils*cols*3);
if (!f)
res=false;
}
return res;
}
// _____________________________________________________________________________
bool EscribirImagenPGM (const char *nombre, const unsigned char *datos,
const int fils, const int cols){
ofstream f(nombre);
bool res= true;
if (f){
f << "P5" << endl;
f << cols << ' ' << fils << endl;
f << 255 << endl;
f.write(reinterpret_cast<const char *>(datos),fils*cols);
if (!f)
res=false;
}
return res;
}
/* Fin Fichero: imagenES.cpp */
procesamiento.h
Código:
#ifndef PROCESAMIENTO_H_
#define PROCESAMIENTO_H_
#include "imagen.h"
template <class T>
void Umbralizar(const Imagen<T> &origen, Imagen<T> &destino, const T &t1, const T &t2/*,T* &v*/);
#include "procesamiento.tpp"
#endif
el modulo imagenES se utiliza para la entrada y salida de imagenes (deben ser pgm). me la dieron ya implementada mis profesores. |