 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
ailis Ens


Registrado: 12 Nov 2002Mensajes: 48
|
Publicado: Mar 12 Nov, 2002 7:05 pm Asunto: trabajar con imagenes |
|
|
Hola,
Necesito meter una imagen en una matriz, es decir que los valores de los pixeles de la imagen se metan en una matriz para poder trabajar con ellos. En Matlab la función seria [A]=imread("archivo.bmp", "bmp");
Alguien me puede ayudar y decirme como tendria que hacerlo aqui?.
La imagen la seleccionaria el usuario en Archivo,abrir, esa imagen sera parametro de entrada de la funcion, y en la funcion es donde necesito meter los valores de los pixeles en una matriz.
Espero que alguien me haya entendido y me pueda ayudar.
Muchas gracias.
Ailis |
|
| Volver arriba |
|
 |
John Invitado
|
Publicado: Mie 13 Nov, 2002 4:22 am Asunto: Ayuda |
|
|
Hola:
Aqui te pongo un ejemplo de la ayuda:
| Código: |
int Matriz[256][256];
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
Byte *ptr;
try
{
pBitmap->LoadFromFile("directorio donde este tu imagen");
for (int y = 0; y < pBitmap->Height; y++)
{
ptr = (Byte *)pBitmap->ScanLine[y];
for (int x = 0; x < pBitmap->Width; x++)
{
ptr[x] = (Byte)y;
Matriz[y][x] = ptr[y];
}
}
Canvas->Draw(0,0,pBitmap);
}
catch (...)
{
ShowMessage("Could not load or alter bitmap");
}
delete pBitmap;
}
|
Ahi ya tienes los datos de la imagen en la matriz, pero eso si la imagen tiene que ser de 8 bits por pixel(256 colores), o si no no te funciona, ojo con esto. Tambien se ausume en el codigo anterior que la imagen puede tener maximo una resolucion de 256X256, esto quiere decir que para que lo anterior te funcione la imagen debe tener maximo estas dimensiones, si quieres aumentale a la Matriz[n][n] para trabajar con imagenes de dimensiones mas grandes aunque lo mas conveniente seria crear una matriz dinamicamente de acuerdo a las dimensiones de la imagen.
Espero que esto te sirva.
Saludos desde Buenos Aires. |
|
| Volver arriba |
|
 |
John Invitado
|
Publicado: Mie 13 Nov, 2002 4:31 am Asunto: Ayuda |
|
|
Hola ailis me equivoque en unas lineas de codigo:
Ojo:
| Código: |
//Atencion quita esta linea
ptr[x] = (Byte)y;
//Reemplaza
Matriz[y][x] = ptr[y];
//por esto otro
Matriz[y][x] = ptr[x];
|
Ais ya funciona.
Saludos. |
|
| Volver arriba |
|
 |
ailis Ens


Registrado: 12 Nov 2002Mensajes: 48
|
Publicado: Mie 13 Nov, 2002 7:19 pm Asunto: gracias |
|
|
muchas gracias John, voy a probar a ver que tal  |
|
| Volver arriba |
|
 |
ailis Ens


Registrado: 12 Nov 2002Mensajes: 48
|
Publicado: Mar 26 Nov, 2002 9:52 pm Asunto: ayuda otra vez |
|
|
Hola jonh soy Ailis, use el codigo que me adanste para meter una iagen en na matriz y me funciona perfectamente pero solo, como tu decias para imagenes de 256*256, y me propusistes hacer dinamica la matriz para que no limitar el tamaño de la matriz, el caso es que lo estoy intentado pero no me deja. o estoy haciendo de la siguiente forma:
N=Bitmap1->Width;
M =Bitmap1->Height;
int Matriz[N][M];
y me da un error de que tengo que poner una constante en la definicion de matriz, ¿tu sabes como arreglarlo?
Si no te importa me lo comentas vale?.
Muchas gracias y un saludo desde España, Málaga. |
|
| Volver arriba |
|
 |
Raúl Capt


Registrado: 16 Ago 2002Mensajes: 174Ubicación: Oruro (Bolivia)
|
Publicado: Mar 26 Nov, 2002 10:06 pm Asunto: |
|
|
Hola Ailis...
por lo que veo tu mensaje es muy comun, puesto que lo que estas haciendo esta mal, ya que al declarar una matriz o un vector lo estas haciendo estaticamente es por eso que te pide un valor constante...
En fin el problema que tienes no lo vas a poder solucionar tan facilmente tendrias que aprender a usar listas enlazadas y asi de esta manera solucionaras tu problemita, espero haberte ayudado.
bye _________________
 |
|
| Volver arriba |
|
 |
di Invitado
|
Publicado: Mie 27 Nov, 2002 7:53 pm Asunto: respuesta a la matriz dinamica |
|
|
ombre declara la matriz asi
int *m=new[Bitmap->width*Bitmap->Height]; |
|
| Volver arriba |
|
 |
jhonalba Ens


Registrado: 24 Ago 2002Mensajes: 40Ubicación: Colombia
|
Publicado: Jue 28 Nov, 2002 5:51 am Asunto: Ayuda |
|
|
Hola ailis,
Primero no estoy de acuerdo con di, porque el sugiere declarar una matriz como un arreglo.
| Código: |
int *m=new[Bitmap->width*Bitmap->Height];
|
Lo mas conveniente es accesar a los datos de la imagen tal cual como estan alamcenados, es decir en una matriz de NxM, pues mi querida ailis te sugiero usar la sigiuiente funcion para crear una matriz utilizando memoria dinamica, espero que tengas nociones basicas sobre lo que esto significa(memoria dinamica????).si no es asi me cuentas; aqui va:
| Código: |
//Esta funcion crea un matriz de nxm
int **CrearMatriz(int n, int m)
{
int **NuevaMatriz;
int i,j;
NuevaMatriz = new int*[n];
for (i = 0; i < n; i++)
NuevaMatriz[i] = new int[m];
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
NuevaMatriz[i][j]=0;
return(NuevaMatriz);
}
|
Como utlizas o llamas esta funcion?????:
| Código: |
//Cambia esto:
int Matriz[256][256];
//Por esto
int **Matriz = CrearMatriz(pBitmap->Width,pBitmap->Height);
|
Con esta funcion ya puedes cargar una imagen de cualquier tamaño en una matriz,por cierto es conveniente que elimines memoria cuando ya no la necesites, como asi??? como creas una matriz dinamicamente esta ocupa cierta memoria de tu equipo, entonces eliminala al salir de tu aplicacion o donde sea conveniente. como lo haces???
| Código: |
//Despues de que ya no necesites los datos de la Matriz, haces
delete[]Matriz;
//Con esto liberas la memoria utilizada.
|
Espero haberte ayudado.
Saludos desde los Angeles(USA).
regards,
bye. |
|
| Volver arriba |
|
 |
Johnn Invitado
|
Publicado: Jue 28 Nov, 2002 6:53 am Asunto: Ayuda |
|
|
Hola denuevo ailis:
Estoy aqui nuevamente porque me equivoque en una partecita:
| Código: |
//Despues de que ya no necesites los datos de la Matriz, haces
delete[]Matriz;
//Con esto liberas la memoria utilizada
|
Pues no es asi de sencillo, asi no estariamos eliminando toda la memoria utilizada(asi funcionaria para un vector creado dinamicamente int *Vector). La forma correcta para una matriz(int **Matriz) seria:
| Código: |
if (Matriz) //Verifica que la matriz dinamica exista. antes de borrar.
{
for (int i = pBitmap->Height - 1; i >= 0; i--)
delete[]Matriz[i];
delete[] Matriz;
}
|
Ailis, espero que te haya ayudado(que me hayas entendido), avisame si si o no??, espero tu respuesta.
Saludos. |
|
| Volver arriba |
|
 |
ailis Ens


Registrado: 12 Nov 2002Mensajes: 48
|
Publicado: Jue 28 Nov, 2002 6:36 pm Asunto: hoy no tengo un buen dia |
|
|
Hola Johnn.
Pues estoy intentando ver si me funciona lo de la matriz dinamica, que supongo que si, pero hoy me da estos errores:
[Linker Error] Unresolved external '_CG_DESC' referenced from D:\CIFRADO\CIFRA.OBJ
[Linker Error] Unresolved external '_CG_DTORTHIS' referenced from D:\CIFRADO\CIFRA.OBJ
[Linker Error] Unresolved external '_CG_A_BP' referenced from D:\CIFRADO\CIFRA.OBJ
[Linker Error] Unresolved external '_CG_GDA_EGY' referenced from D:\CIFRADO\CIFRA.OBJ
[Linker Error] Unresolved external '_CG_THIS' referenced from D:\CIFRADO\CIFRADO.OBJ
[Linker Error] Unresolved external '_CG_DA_EPY' referenced from D:\CIFRADO\CIFRADO.OBJ
[Linker Error] Unresolved external '_CG_DA_EPXSY' referenced from D:\CIFRADO\CIFRADO.OBJ
[Linker Error] Unresolved external '_CG_LDA_BEPXSY' referenced from D:\CIFRADO\CIFRADO.OBJ
[Linker Error] Unresolved external 'Tclave::CrearMatriz(int, int)' referenced from D:\CIFRADO\INSERCLAVE.OBJ
He seleccionado CodeGuard y me los quita todos menos el ultimo, y no se que hacer!!! .
Y ya lo ultimo que te pido, es como convertir ahora la matriz en una imagen...
Agradezco mucho mucho de verdad la ayuda que me estas dando, se que estoy muuuuy pegada pero no he programado mucho (algo en Matlab) y tengo que sacar este proyecto como sea para poder acabar mi carrera.
Muchas gracias otravez y saludos desde Malaga, España.  |
|
| Volver arriba |
|
 |
jhonalba Ens


Registrado: 24 Ago 2002Mensajes: 40Ubicación: Colombia
|
Publicado: Vie 29 Nov, 2002 2:46 am Asunto: Ayuda |
|
|
Hola Ailis, soy John otra vez.
Pues he leido tu mensaje y te cuento que la lista de errores que mencionas, podrian presentarse por varias razones, lo que creo es que estas declarando algunas variables en varias unidaddes(Unit) o probablemente si estas programando orientado a objetos declaras funciones miembro que no existen(no estan implementadas), sin tener el codigo que estas desarrollando es dificil acertar, ademas no se exactamente lo que quieres hacer con tu aplicacion, en cuanto al ultimo error:
[Linker Error] Unresolved external 'Tclave::CrearMatriz(int, int)' referenced from D:\CIFRADO\INSERCLAVE.OBJ
Parece ser que la funcion CrearMatriz(int, int) , pertenece a una Clase llamada TClave(si o no??), si es asi, el error podria ser por la declaracion de esta funcion, en la parte public de la clase TClave debes declarla como :
| Código: |
class TClave
{
private:
Datos y funciones ......
:
:
:
public:
Datos y funciones ......
:
:
:
int ** CrearMatriz(int,int);
}
|
y para implemetar esta funcion como miembro de la clase TClave, debes declararla asi:
| Código: |
int ** TClave::CrearMatriz(int n, int m)
{
Codigo que ya tienes....
:
:
:
}
|
Creo que este error es por eso. si puedes darme mas pistas de lo que quieres que haga tu aplicacion, y algo de codigo, para entender mejor podria ayudarte un poco mas, por lo pronto espero haberte ayudado en algo, y esperemos que algunos amigos del foro nos colaboren.
En cuanto a la ultima parte de: Y ya lo ultimo que te pido, es como convertir ahora la matriz en una imagen..., pues lo que entiendo es que quieres, una vez modificada la imagen(Matriz) Pixel a Pixel guardarla(si o no??), puedes convertirla en imagen de varias formas, te voy a citar la que creo mas facil:
Para convertir la Matriz en una Imagen podrias utilizar una funcion que te permita recoger los datos de la Matriz(con la que manipulas la imagen), Esta matriz puede ya estar modificada a tu antojo.
| Código: |
Graphics::TBitmap *CBMP::Obtener_Resultado(Graphics::TBitmap *Mapa)
{
Byte *ptr;
for (int x = 0; x < Alto;x++)
{
ptr = (Byte *)Mapa->ScanLine[x];
for (int y = 0; y < Ancho; y++)
ptr[y] = Matriz[x][y];
}
return(Mapa);
}
|
Con esta funcion ya tienes la matriz convertida en Imagen, como usas la funcion anterior????, la puedes llamar asi:
| Código: |
Graphics::TBitmap *Imagen = new Graphics::TBitmap();
Imagen = Obtener_Resultado(pBitmap);
//Si quieres almacenarla en disco la nueva imagen.
Imagen->SaveToFile("c:\\ailis.bmp");
|
En el codigo anterior pBitmap es en donde cargas la imagen originalmente, o mas bien la variable en donde estan los datos de la imagen(te acuerdas).
| Código: |
pBitmap->LoadFromFile("directorio donde este tu imagen");
|
Ailis, espero haberte ayudado, eso si confirma que has recibido y leido este mensaje, no te pierdas que estamos en contacto.
Pd: No olvides que este foro es para intercambiar conocimientos, no importa el nivel en el que te encuentres, asi que no es problema que preguntes y preguntes, pues para eso estamos.
Un abrazo,
Saludos.
Espero tu respuesta. |
|
| Volver arriba |
|
 |
ailis Ens


Registrado: 12 Nov 2002Mensajes: 48
|
Publicado: Lun 02 Dic, 2002 10:05 am Asunto: aqui estoy otra vez |
|
|
Hola Jhon, te voy a poner un poco al tanto de lo que tengo que hacer.
Se trata de un programa para encriptar una imagen, es decir, a una imagen cualquiera aplicarle un algortimo de tal forma que se envie oculta (se veria como ruido), el que recibe la imagen tiene el algortimo de desencriptacion y puede verla, de esta forma se protegen las imagenes de posibles piratas.
El algortimo de encriptacion tendra tres parametros de entrada, la propia matriz y dos claves que es lo que conoce tanto el receptor como el trransmisor (el algoritmo puede ser publico).
Para hacer esto en mi programa hay un main menu que es para cifrar la imagen, esto me abre una nueva ventana (Tclave) en la que se podra selecionar la imagen e insertar las dos claves.
Esta nueva ventana tiene tres botones:
-cancelar: cierra la ventana.
-abrir: abre la imagen en una nueva ventana, y mete esta imagen en una matriz como tu me dijistes.
-aceptar: este boton captura las claves que se han insertado y en principio llama a una funcion que se llama cifrar que tiene los siguientes parametros
cifrar(Matriz,iter,perm,ancho,largo); la matriz el ancho y el largo (que corresponden a pBitmap->Width y pBitmap->Heigth) son variables publicas, ya que las he capturado en el boton abrir y las estoy usando en el boton acepta, iter y perm son las claves. Hasta aqui todo me funciona bien.
La funcion cifrar con la martriz y las claves vuelve un poco loco a los pixeles aplicandole algunas funciones matematicas simples, y ahora tendria que presentar el resultado en una nueva ventana, para eso te pedi el algortimo de me explicas.
Bien pues mi problema es que como necesita pBitmap no se como hacerlo llegar hasta la funcion cifrar (pBtimap lo obtengo en el boton abrir, y cifrar la llamo con el boton aceptar) para luego poder pasarlo como parametro a la funcion ObtenerResultado, y tampoco se como tengo que declarar la funcion ObtenerResulatdo, si pongo en la cabecera en la parte publica:
Graphics::TBitmap *CBMP::Obtener_Resultado(Graphics::TBitmap *Mapa)
no lo entiende el progrmama, ¿que es CBMP?.
Por ultimo supongo que para pintar de nuevo la imagen usare Canvas->Draw(0,0,pBitmap).
En fin, espero que comprendas mas o menos que es lo que pretendo hacer
A mi para solucionar esto se me ocurre que pBtimap sea una variable publica com las anteriores, pero no se como declarala, porque no se bien de que tipo es, si opngo TBtmap pBitmap ,me da un error.
Bueno pues esto es todo por hoy, espero tu respuesta, y de nuevo muchas gracias por tu ayuda.
Un saludo. Ailis |
|
| Volver arriba |
|
 |
jhonalba Ens


Registrado: 24 Ago 2002Mensajes: 40Ubicación: Colombia
|
Publicado: Lun 02 Dic, 2002 8:25 pm Asunto: Ayuda |
|
|
Hola Ailis:
John otra vez, pues te cuento que ahora entiendo mejor lo que quieres hacer, entonces aqui vamos:
Estoy de acuerdo contigo puedes solucionar el problema declarando pBitmap como una variable publica, asi no tienes que estar pasandola por parametro de una fuuncion a otra, por otro lado la funcion ObtenerResultado, tambien puedes declararla como publica asi:
(Mira aqui como declarar la funcion ObtenerResulatdo))
| Código: |
class TClave : public TForm
{
__published: // IDE-managed Components
:
:
:
:
private: // User declarations
:
:
:
:
public: // User declarations
__fastcall TClave(TComponent* Owner);
Graphics::TBitmap *pBitmap;//Aqui lo declaras.
Graphics::TBitmap *Obtener_Resultado();//Asi declaras la funcion.
};
|
Observa que la funcion Obterner_Resultado ya no tiene parametro de entrada, pues como metimos la variable pBitmap dentro de la parte public de la clase ya no es necesario,Cierto?
Entonces la implementacion de la funcion Obtener_Resultado(Imagen encriptada) quedaria como sigue:
| Código: |
Graphics::TBitmap *TClave::Obtener_Resultado()
{
Byte *ptr;
for (int x = 0; x < pBitmap->Height;x++)
{
ptr = (Byte *)pBitmap->ScanLine[x];
for (int y = 0; y < pBitmap->Width; y++)
ptr[y] = Matriz[x][y];
}
return(pBitmap);
}
|
Y para llamarla lo puedes hacer asi:
| Código: |
Graphics::TBitmap *Imagen_Encriptada = new Graphics::TBitmap();
Imagen_Encriptada = Obtener_Resultado();//Ya no hay parametro.
Canvas->Draw(0,0,Imagen_Encriptada);//Para dibujarla
delete Imagen;
|
Observa que para mostrar el resultado pintamos nuevamente en el canvas del formulario( Canvas->Draw(0,0,Imagen)), tal y como lo pensaste.
Antes de usar lo anterior fijate bien en lo siguiente:
Cuando abrimos la Imagen(en el Boton abrir), no debes borrar la variable que luego vas a utilizar, hablo de la variable pBitmap, que es la que luego utilizamos como puente para visualizar el resultado de la imagen encriptada, es decir debes quitar la siguiente linea de codigo de la funcion que carga la imagen en una Matriz(lo primero que te envie):
Debes mirar en que momento ya no utilizas dicha variable(pBitmap) y la puedes borrar, podria ser al terminar el programa(debes fijarte bien donde eliminas memoria).
Recuerda tambien que si quieres acceder a esta variable(pBitmap), o a la funcion Obtener_Resultado desde otras unidades o formularios(ventanas), basta con anteponer el nombre de la instancia de la clase(TClave) donde estan declarados, es decir,
| Código: |
//esto desde una unidad diferente
Clave->pBitmap->.....
Clave->Obtener_Resultado();
|
De esta forma podras manipular la variable y la funcion a tu antojo desde cualquier parte de tu programa.
Por otra parte te sugiero no pintar las imagenes en el canvas del formulario, en vez de esto puedes pintarlas usando un componente llamado TImage que encuantras en la paleta Additional del Builder de la siguiente manera:
Agregas un Image(componente TImage) sobre el formulario, llamado en este ejemplo Image1(propiedad name),y reemplazas la linea de codigo:
| Código: |
Canvas->Draw(0,0,Imagen_Encriptada);//Para dibujarla
|
por esta otra:
| Código: |
Image1->Picture->Assign(pBitmap);
|
De esta forma tu imagen no se borrara, por ejmeplo cuando pases otra ventana por encima de esta.
Espero haberte ayudado, espero tu pronta respuesta. |
|
| Volver arriba |
|
 |
ailis Ens


Registrado: 12 Nov 2002Mensajes: 48
|
Publicado: Lun 02 Dic, 2002 10:15 pm Asunto: linker error |
|
|
Hola Jhon.
Ya he implementado todo lo que me has comentado y errores de codigo no me da, pero si me da el siguiente error:
| Código: |
[Linker Error] Fatal: Error detected (LME279)
[Linker Warning] Out of memory
|
y no se porque, he ido poniendo como comentario los subalgoritmos para ver si en alguno esta el error pero siempre sale...
Esta mañana no salia ese error pero ahora parece que no se quiere quitar.
Y ya lo voy a dejar por hoy que empiezo a estar espesa (me cuesta pensar)
Un saludo, muchas gracias y que sepas que me estas slavando la vida. |
|
| Volver arriba |
|
 |
John Invitado
|
Publicado: Mar 03 Dic, 2002 4:19 am Asunto: Ayuda |
|
|
Hola ailis,
La verdad no se bien porque te da ese error, podria ser porque la memoria de tu equipo no tenia la capacidad suficiente de generar el codigo objeto del programa en el momento que lo intentaste correr(demasiadas aplicaciones corriendo) o porque se accesa a posiciones de memoria no validas en tiempo de ejecucion con algun apuntador loco que esta sobrando y haciendo estragos, estoy rumorando, nada seguro pues nunca me ha sucedido algo asi, pues bien entonces por hoy descansa y mañana en la mañana prueba en el menu Project/Build all projects, haber que sucede.
Si no te funciona, pregunta nuevamente acerca de este error en el foro, haber si aguien nos dice exactamente que puede estar sucediendo.
Chao ailis,
Saludos y suerte,
Espero respuesta. |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|