2009-12-16 79 views
10

Làm cách nào để mở và đọc các pixel của hình ảnh trong c + +? Đọc chúng dưới dạng X, Y và biết màu sắc.Đọc các pixel của hình ảnh trong C++

+1

Bất kỳ định dạng hình ảnh cụ thể không? Các định dạng khác nhau có các thư viện khác nhau. –

+1

Định dạng hình ảnh là gì? BMP? PNG? JPEG? –

+0

Có thể là JPG hoặc BMP. Nó sẽ được trích xuất từ ​​OpenGL vì vậy tôi chưa chắc chắn. Nó có quan trọng không? Nếu có, thì tốt hơn? –

Trả lời

3

Nếu bạn đang đi để được làm việc với hình ảnh mà bạn nên xem xét các thư viện OpenCV, nó có khá nhiều tất cả mọi thứ bạn cần làm việc với hình ảnh.

OpenCV 2.0 ra mắt một vài tháng trước và rất thân thiện với C++.

+4

OpenCV quá mức cần thiết để chỉ đọc hình ảnh. –

+0

Vâng, nó là một thư viện lớn, tôi chỉ đặt nó như là một lựa chọn nếu anh ta muốn làm những thứ khác ngoài việc đọc/viết nó sẽ là tốt để làm quen với nó. – rem7

5

Sử dụng thư viện như DevIL (http://openil.sourceforge.net/). DevIL sẽ tải dữ liệu hình ảnh vào một mảng và bạn có thể truy cập dữ liệu điểm ảnh thô bằng cách sử dụng một hàm như ilGetPixels() hoặc như vậy.

DevIL cũng có hỗ trợ OpenGL.

+0

s/ilGetPixels()/ilGetData() –

2

BMP cực kỳ đơn giản. BMP không nén bao gồm tiêu đề, một số thông tin về BMP, bảng màu (nếu có) và sau đó là dữ liệu bitmap, pixel theo pixel. Viết trình phân tích cú pháp bitmap của riêng bạn là một bài tập thú vị mặc dù có rất nhiều công việc phụ xử lý tất cả các tính năng (nén 8 bit, RLE, v.v.).

Đặt cược tốt nhất của bạn là sử dụng thư viện. Image Magick có thư viện C cho phép bạn mở bất kỳ định dạng hình ảnh nào và truy cập pixel. SDL_image là một thư viện khác rất dễ sử dụng và SDL có thể dễ dàng được sử dụng với OpenGL.

Định dạng hình ảnh bạn nên sử dụng sẽ tùy thuộc vào ứng dụng. JPG có độ nén khá tốt, nhưng nén là LOSSY, nghĩa là bạn mất chi tiết. Nếu hình ảnh có văn bản, hoặc có các khu vực rộng lớn của màu sắc hoặc các cạnh (như truyện tranh) thì điều này là xấu, bạn sẽ nhận được sự tạo tác đáng chú ý. Đối với ảnh, JPG thường tốt. PNG là một lựa chọn tốt đẹp, chúng được nén nhưng nén là LOSSLESS. JPG thường sẽ nhỏ hơn PNG, cả hai sẽ nhỏ hơn BMP.

4

Hoặc bạn sử dụng thư viện hiện có hoặc bạn viết mã của riêng mình. Nói chung cách tiếp cận đầu tiên là tốt hơn vì định dạng tệp hình ảnh thường phức tạp hơn so với bề ngoài và bạn có thể kết thúc với hình ảnh lộn ngược hoặc thứ tự thành phần màu không chính xác nếu bạn không cẩn thận.

Tùy thuộc vào yêu cầu của bạn, bạn cũng có thể cần xem xét khả năng của định dạng. Nếu hỗ trợ cho phạm vi động cao là thú vị, OpenEXR là một lựa chọn tuyệt vời, nếu nó không phải là nó chỉ có thể bất tiện vì nó không có sự hỗ trợ lớn giữa các chương trình khác như ví dụ PNG.

Dưới đây là hai thư viện tôi thường tìm đến khi cần phải đọc và ghi hình ảnh: libpng, OpenExr

+0

Chúng tôi sử dụng libpng để tạo hình ảnh, nó thực sự dễ sử dụng và mã C++ thuần túy nên không cần phải xử lý giao diện crappy. –

+1

@Matthieu M .: libpng chắc chắn không được viết bằng "pure C++". Nó được viết bằng C89, như nó nói trên trang được liên kết bởi Laserallan. – unwind

5

Reading màu của một điểm ảnh từ một file ảnh bằng cách sử dụng thư viện Magick++

#include <Magick++.h> 
#include <iostream> 

using namespace Magick; 
using namespace std; 

int main(int argc, char **argv) { 
try { 
    InitializeMagick(*argv); 
    Image img("C:/test.bmp"); 
    ColorRGB rgb(img.pixelColor(0, 0)); // ie. pixel at pos x=0, y=0 
    cout << "red: " << rgb.red(); 
    cout << ", green: " << rgb.green(); 
    cout << ", blue: " << rgb.blue() << endl; 
} 
    catch (Magick::Exception & error) { 
    cerr << "Caught Magick++ exception: " << error.what() << endl; 
} 
return 0; 
} 
Các vấn đề liên quan