Cómo utilizar la programación en C++ para extraer el valor de color RGB de cualquier punto de una imagen determinada
#include
#include
#include
typedef unsigned long DWORD;
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
long biWidth;
long biHeight;
WORD bPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
biXPelsPerMeter largo;
long biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
}BITMAPINFOHEADER;
int ReadBmp(const char* szFileName );
int GetDIBColor(int X, int Y, BYTE *r, BYTE *g, BYTE *b);
BITMAPINFOHEADER bih;
BYTE * Búfer = NULL ;
long LineByteWidth;
int main(void)
{
int x, y;
BYTE r, g, b;
int n;
char szfilename[255] = "c.MAPINF:\\1.bmp";
if (ReadBmp(szfilename) == 0)
{
printf("fallo al leer el archivo %s", szfilename);
return 1 ;
p>}
printf("Ancho: %ld\n", bih.biWidth);
printf("Alto: %ld\n ", bih.biHeight );
printf("BitCount:%d\n", (int)bih.biBitCount);
mientras(1)
{
printf("Ingrese X:");
scanf("%d", &x);
si (x < 0) p>
break;
printf("ingrese la Y:");
scanf("%d", &y);
if ( GetDIBColor(x, y, &r, &g, & b) == 1)
printf("(%d, %d):r:%d, g:%d, b:%d\ n", x, y, (int)r, (int)g, (int)b);
>else
printf("error de entrada.\n");
}
free(Buffer);
devuelve 0;
}
int ReadBmp(const char* szFileName)
{
ARCHIVO *archivo;
PALABRA bfh[7];
long dpixeladd;
if (NULL == (file = fopen(szFileName, "rb")))
{ p>
return 0;
}
printf("%s\n", szFileName);
fread(&bfh, sizeof(WORD) , 7, archivo);
if (bfh[0] != (WORD)(((WORD)'B')|('M'<<8)))
{
fclose(archivo);
return 0;
}
fread(&bih, sizeof( BITMAPINFOHEADER), 1, archivo);
if (bih.biBitCount < 24)
{
fclose(archivo);
devuelve 0; p>
}
dpixeladd = bih.biBitCount / 8;
LineByteWidth = bih.biWidth * (dpixeladd);
if ((LineByteWidth % 4) ! = 0)
LineByteWidth += 4 - (LineByteWidth % 4);
if ((Buffer = (BYTE*)malloc(sizeof(BYTE)* LineByteWidth * bih .biHeight)) ! = NULL)
{
fread(Buffer, LineByteWidth * bih.biHeight, 1, archivo);
fclose(archivo);
devuelve 1;
}
fclose(archivo);
devuelve 0;
} p>
p>
int GetDIBColor(int X, int Y, BYTE *r, BYTE *g, BYTE *b)
{
int dpixeladd;
BYTE *ptr;
if (X < 0 || X >= bih.biWidth || Y < 0 || Y >= bih.biHeight)
{
Devuelve 0;
}
dpixeladd = bih.biBitCount / 8;
ptr = Búfer + X * dpixeladd + (bih.biHeight - 1 - Y)biHeight - 1 - Y) * LineByteWidth;
*b = *ptr;
*g = *(ptr + 1); p>
*r = *(ptr + 2);
devuelve 1;
}