2009-12-28 24 views
5

piksel değerini alma bmp görüntüsünü okumak için bir sorum var. Bir bmp görüntüsünde piksel değerini (R, G, B değerleri) nasıl alabilirim? C programlama dilini kullanmama yardımcı olan var mı?BMP dosyasının

cevap

7

Seçtiğiniz platform için iyi bir görüntü düzenleme kitaplığı bulmak kolay yolu ve bunu kullanmak olacaktır.

Dosyayı açmak ve aslında ikili verileri gerçekten yorumlamak zor olacak. Bunu yapmak için BMP File Specification'a ihtiyacınız olacak. Önce kolay yolu denemenizi tavsiye ederim.

6

BMP dosya biçimini incelemelisiniz. Sıkıştırılmamış 24 bit BMP dosyalarını okumak daha kolaydır. Sadece başlangıçta bir başlık ve her bir pikselin RGB değerlerini içerirler.

Bununla başlayabilmek için, http://en.wikipedia.org/wiki/BMP_file_format adresindeki 2x2 bitmap görüntüsünün örneğini kontrol edin. Aşağıdaki adımları takip edin.

  1. Vikipedi'de gösterilen 2x2 BMP görüntüsünü oluşturun.
  2. C programınızı kullanarak dosyayı ikili modda açın.
  3. Bayt konumuna gitme 54.
  4. 3 bayt okuyun.

Bayt sırasıyla 0, 0 ve 255 olur. (Siparişin RGB olup olmadığından emin değilim. Bu kadar uzun geri yapmıştım ve siparişin RGB olmadığını düşünüyorum. Sadece bunu doğrulayın.)

Bu kadar basit! Biçimle ilgili daha fazla bilgi edinmek için BMP'nin başlığını inceleyin.

10

Not: BMP'nizde alfa kanalı varsa, alfa değerleri için fazladan bir bayt almanız gerekebilir. Bu durumda görüntü image[pixelcount][4] olur ve bu dördüncü dizini tutmak için başka bir getc(streamIn) satırı eklersiniz. BMP'm buna gerek yoktu. Eğer görüntü verilerini vurmadan önce geçmiş olsun gerek bir başlık yığın

// 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

+0

yok mu? –

+1

@Anon Dosyam jpeg ise ne olur? – Kraken