Obtendo o valor do pixel do arquivo BMP
Pergunta
Eu tenho uma pergunta para ler uma imagem BMP. Como posso obter o valor do pixel (valores R, G, B) em uma imagem BMP? Alguém pode me ajudar a usar a linguagem de programação C?
Solução
A maneira mais fácil seria encontrar uma boa biblioteca de manipulação de imagem para a plataforma escolhida e usá -la.
- Linux Imlib / GDK-PIXBUF (GNOME/GTK) / Imagem QT (KDE/QT) deve ser capaz de fazer o que você precisa.
- janelas Não estou familiarizado com a biblioteca do sistema apropriada, mas um Pesquise msdn por "bitmap" é provavelmente um bom lugar para começar.
- Mac OS X O cacau tem alguns recursos de manipulação de imagem, veja Este artigo.
A maneira mais difícil seria abrir o arquivo e realmente interpretar os dados binários. Para fazer isso, você precisará do Especificação do arquivo BMP. Eu recomendo tentar o caminho mais fácil primeiro.
Outras dicas
NOTA: Pode ser necessário pegar um byte extra para os valores alfa se o seu BMP tiver canal alfa. Nesse caso, a imagem seria image[pixelcount][4]
, e você adicionaria outro getc(streamIn)
linha para manter esse quarto índice. Meu BMP acabou por não precisar disso.
// super-simplified BMP read algorithm to pull out RGB data
// read image for coloring scheme
int image[1024][3]; // first number here is 1024 pixels in my image, 3 is for RGB values
FILE *streamIn;
streamIn = fopen("./mybitmap.bmp", "r");
if (streamIn == (FILE *)0){
printf("File opening error ocurred. Exiting program.\n");
exit(0);
}
int byte;
int count = 0;
for(i=0;i<54;i++) byte = getc(streamIn); // strip out BMP header
for(i=0;i<1024;i++){ // foreach pixel
image[i][2] = getc(streamIn); // use BMP 24bit with no alpha channel
image[i][1] = getc(streamIn); // BMP uses BGR but we want RGB, grab byte-by-byte
image[i][0] = getc(streamIn); // reverse-order array indexing fixes RGB issue...
printf("pixel %d : [%d,%d,%d]\n",i+1,image[i][0],image[i][1],image[i][2]);
}
fclose(streamIn);
~ Locutus
Você precisa estudar o formato do arquivo BMP. É mais fácil ler arquivos BMP de 24 bits não compactados. Eles apenas contêm um cabeçalho no início e os valores RGB de cada pixel.
Para começar com isso, verifique o exemplo da imagem de bitmap 2x2 em http://en.wikipedia.org/wiki/bmp_file_format. Siga as etapas abaixo.
- Crie a imagem BMP 2x2 mostrada na Wikipedia.
- Abra o arquivo no modo binário usando seu programa C.
- Procure a posição 54 do byte.
- Leia 3 bytes.
Os bytes seriam 0, 0 e 255, respectivamente. (Não tenho certeza se o pedido é RGB. Eu já havia feito há muito tempo e acho que o pedido não é RGB. Apenas verifique isso.)
Tão simples como isso! Estude o cabeçalho do BMP para entender mais sobre o formato.