2009-12-28 25 views
5

tôi có câu hỏi để đọc hình ảnh bmp. Làm thế nào tôi có thể nhận được giá trị pixel (R, G, B giá trị) trong một hình ảnh bmp? Có ai có thể giúp tôi sử dụng ngôn ngữ lập trình C không?Lấy giá trị pixel của tệp BMP

Trả lời

7

Cách dễ dàng là tìm thư viện thao tác hình ảnh tốt cho nền tảng bạn đã chọn và sử dụng nền tảng đó.

Cách khó khăn là mở tệp và thực sự giải thích dữ liệu nhị phân bên trong. Để làm điều đó bạn sẽ cần BMP File Specification. Tôi khuyên bạn nên thử một cách dễ dàng trước.

6

Bạn cần nghiên cứu định dạng tệp BMP. Nó dễ đọc hơn các tập tin BMP 24-bit không nén. Chúng chỉ chứa một tiêu đề ở đầu và giá trị RGB của mỗi pixel.

Để bắt đầu, hãy kiểm tra ví dụ về hình ảnh bitmap 2x2 tại http://en.wikipedia.org/wiki/BMP_file_format. Thực hiện theo các bước dưới đây.

  1. Tạo hình ảnh 2x2 BMP được hiển thị trên Wikipedia.
  2. Mở tệp ở chế độ nhị phân bằng chương trình C.
  3. Tìm kiếm vị trí byte 54.
  4. Đọc 3 byte.

Các byte tương ứng là 0, 0 và 255. (Không chắc chắn cho dù thứ tự là RGB. Tôi đã thực hiện điều này trở lại dài và tôi nghĩ rằng thứ tự không phải là RGB. Chỉ cần xác minh điều này.)

Đơn giản như vậy! Nghiên cứu tiêu đề của BMP để hiểu thêm về định dạng.

10

Lưu ý: bạn có thể cần phải lấy thêm byte cho giá trị alpha nếu BMP của bạn có kênh alpha. Trong trường hợp đó, hình ảnh sẽ là image[pixelcount][4] và bạn sẽ thêm một dòng getc(streamIn) khác để giữ chỉ mục thứ tư đó. BMP của tôi hóa ra là không cần điều đó. không có

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

là một đoạn tiêu đề bạn cần phải vượt qua trước khi bạn nhấn các dữ liệu hình ảnh? –

+1

@Anon Nếu tệp của tôi là jpeg thì sao? – Kraken