SoloCodigo
Programación General => C/C++ => C++ Builder => Mensaje iniciado por: citrico en Domingo 4 de Febrero de 2007, 01:58
-
Hola a todos. Estoy haciendo un programa que permita aplicar algoritmos de criptografía a imágenes. Pero tengo un pequeño problema.
Resulta que leeo una imagen de un fichero *.bmp y pretendo almacenarla en memoria para luego procesarla mediante dichos algoritomos.
Antes de aplicar los algoritmos, la leo, la dibujo, la almaceno en memoria y la vuelvo a pintar en otro TImage, pero me aparece en B/N. El código que empleo es el siguiente:
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->unsigned char *textura;
TColor tcolor;
unsigned char *color = (unsigned char *) &tcolor;
textura = (unsigned char *) malloc (altoImagen*anchoImagen*3);
int n = 0;
for (int i = 0; i < altoImagen; i++) { //escaneo las líneas
for (int j = 0; j < anchoImagen; j++) {
tcolor = imagenClaro->Picture->Bitmap->Canvas->Pixels[j][i];
textura[n] = GetRValue(tcolor);
textura[n + 1] = GetGValue(tcolor);
textura[n + 2] = GetBValue(tcolor);
tcolor = (TColor)RGB(textura[n], textura[n+1], textura[n+2]);
n++;
imagenCopia->Canvas->Pixels[j][i] = tcolor;
//la imágen se pinta bien
}
}
n = 0;
for (int i = 0; i < altoImagen; i++) {
for (int j = 0; j < anchoImagen; j++){
tcolor= (TColor)RGB(textura[n], textura[n+1], textura[n+2]);
imagenPrueba ->Canvas->Pixels[j][i] = tcolor;
n++;
//aquí la imagen se pinta el B/N
}
}
delete textura;<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->
Creo que el problema está en la composición del color, pero no lo se.
¿me echa alguien una mano? Gracias
-
El problema es que no estas llenando bien la textura, de hecho estas dañando la información que vas acumulando en ella y luego la pintas y vuelves y la recorres mal..
En resumen no estas incrementando la variable n sino de 1 por vez y deberías hacerlo de a 3por vez puesto que vas llenandola textura de a 3 , uno para red otro para green otro para blue
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->unsigned char *textura;
TColor tcolor;
unsigned char *color = (unsigned char *) &tcolor;
textura = (unsigned char *) malloc (altoImagen*anchoImagen*3);
int n = 0;
for (int i = 0; i < altoImagen; i++) { //escaneo las líneas
for (int j = 0; j < anchoImagen; j++) {
tcolor = imagenClaro->Picture->Bitmap->Canvas->Pixels[j][i];
textura[n] = GetRValue(tcolor);
textura[n + 1] = GetGValue(tcolor);
textura[n + 2] = GetBValue(tcolor);
tcolor = (TColor)RGB(textura[n], textura[n+1], textura[n+2]);
n+=3;
imagenCopia->Canvas->Pixels[j][i] = tcolor;
//la imágen se pinta bien
}
}
n = 0;
for (int i = 0; i < altoImagen; i++) {
for (int j = 0; j < anchoImagen; j++){
tcolor= (TColor)RGB(textura[n], textura[n+1], textura[n+2]);
imagenPrueba ->Canvas->Pixels[j][i] = tcolor;
n+=3;
//aquí la imagen se pinta el B/N
}
}
delete textura;<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->
Por otro lado la manera en que lo hace es la mas fácil pero también la mes lenta, si tienes problemas de performance peganos una visita luego.
-
Gracias por la respuesta Juank, vaya error más tonto. No me había dado cuenta.
De todas formas, ¿ podrías indicarme brevemente una manera más rápida de hacer esto ?
Muchas gracias !!
-
haciendo un lock bits del bitmap que hay en
imagenXXX->Picture->Bitmap
y recorriendo los bytes a travez de un puntero teniendo en cuenta el padding del bmp.
Podemos mirarlo luego ya que no conozco el objeto
imagenXXX->Picture->Bitmap
pero intuyo que debe tener algo para hacer ese tipo de cosas ya que eso es regla general cuando se trabaja haciendo dispay de imagenes.
-
Que rápido juanK !!! agradecido me quedo.
De todas formas, cuando tengas un poco de tiempo, si fueras un poco más explicito.... es que no me he aclarado con tus últimas explicaciones.
Saludos.
-
muy buena Juank eso me sirve a mi tambien