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
Seçtiğiniz platform için iyi bir görüntü düzenleme kitaplığı bulmak kolay yolu ve bunu kullanmak olacaktır.
- LinuxImLib/GDK-Pixbuf (Gnome/GTK)/QT Image (KDE/Qt) neye ihtiyacınız yapmak gerekir.
- Windows Uygun sistem kitaplığına aşina değilim, ancak bir MSDN Search for "Bitmap" büyük olasılıkla başlamak için iyi bir yerdir.
- Mac OSX Kakao bazı görüntü işleme yeteneklerine sahiptir, bkz. this article.
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.
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.
- Vikipedi'de gösterilen 2x2 BMP görüntüsünü oluşturun.
- C programınızı kullanarak dosyayı ikili modda açın.
- Bayt konumuna gitme 54.
- 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.
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
yok mu? –
@Anon Dosyam jpeg ise ne olur? – Kraken