Ver Mensaje Individual
  #4 (permalink)  
Antiguo 21/01/2013, 18:14
rucal
 
Fecha de Ingreso: enero-2013
Mensajes: 8
Antigüedad: 11 años, 11 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.