Red de conocimiento informático - Material del sitio web - Cómo utilizar la programación en C++ para extraer el valor de color RGB de cualquier punto de una imagen determinada

Cómo utilizar la programación en C++ para extraer el valor de color RGB de cualquier punto de una imagen determinada

La consola lee el archivo de imagen BMP y genera el componente de color del punto dado

#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)

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")))

{

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;

}

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>

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);

*r = *(ptr + 2);

devuelve 1;

}