| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Max Invitado
|
Publicado: Mie 11 Jun, 2003 7:57 am Asunto: Problema con imagen |
|
|
Hola Foro
Tengo el siguiente problema.
Tengo una imagen bmp monocromatica (creada en paint) de 256*256, y quiero copiar los valores de los pixeles en una matriz (la matriz imag), pero cuando el contador col del for llega a 32 sale un error que dice access violation at address 00401678, y no se porque; ya que si cambio la imagen monocromatica por una a 256 colores el error ya no aparece. El codigo que estoy manejando es el siguiente
int imag[256][256];
Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
pBitmap->PixelFormat = pf8bit;
pBitmap->Height = 256;
pBitmap->Width = 256;
Byte *ptr;
pBitmap->LoadFromFile("h:\\delimg.bmp"); //imagen monocromatica
for(int fil=0; fil<256;fil++)
{
ptr = (Byte *)pBitmap->ScanLine[fil];
for(int col=0; col<256;col++)
imag[col][fil] = ptr[col];
}
Alguien puede decirme como puedo solucionar este inconveniente.
Gracias |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 11 Jun, 2003 3:37 pm Asunto: |
|
|
Te da error al llegar a 32 porque para representar cada píxel de una imagen monocromática solo se necesita 1 bit (32bytes=256bits), por tanto cada vez que lees un byte dentro de el tienes 8 píxeles. No se si me he explicado bien... así quedaría tu código para rellenar correctamente ese array.
| Código: | Byte imag[256][256];
Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
pBitmap->Height = 256;
pBitmap->Width = 256;
Byte *ptr;
pBitmap->LoadFromFile("c:\\_\\imagen-mono.bmp"); //imagen monocromatica
// Para comprobar que realmente se trata de una imagen monocromática
// podemos comprobar que pBitmap->PixelFormat contiene pf1bit
for(int fil=0; fil<256; fil++)
{
ptr = (Byte*)pBitmap->ScanLine[fil];
for(int col=0; col<32; col++)
for (int bit=0; bit<8; ++bit)
imag[col*8+bit][fil] = ptr[col] & (1 << (7-bit));
}
// Y para comprobar que el array se ha rellenado correctamente
// lo recorremos y pintamos sobre el Canvas del Form por ejemplo
for (int y=0; y<256; ++y)
for (int x=0; x<256; ++x)
Canvas->Pixels[x][y] = imag[x][y] ? clWhite : clBlack;
delete pBitmap; |
|
|
| Volver arriba |
|
 |
|