Tôi đang làm việc trên một công cụ trò chơi và tôi quá lo lắng khi viết trình tải ảnh cho nhiều định dạng, vì vậy câu hỏi của tôi là: Có thư viện tải hình ảnh trừu tượng để tải tệp hình ảnh không ? Tôi chỉ cần tải các tập tin sau đó splat chúng vào màn hình bằng cách sử dụng một mảng pixel.C/C++ Hình ảnh Đang tải
Trả lời
Tôi luôn là người hâm mộ của CImg. Nó rất dễ sử dụng. Một người dùng khác cũng thích the answer. Tôi sẽ đăng cùng một ví dụ mà tôi đã đăng trong câu trả lời để bạn có thể thấy việc truy cập pixel và thông tin thứ nguyên dễ dàng như thế nào.
CImg<unsigned char> src("image.jpg");
int width = src.width();
int height = src.height();
unsigned char* ptr = src.data(10,10); // get pointer to pixel @ 10,10
unsigned char pixel = *ptr;
Một sự xấu hổ họ không có cổng 64 bit. Ít nhất họ nói như vậy trong Câu hỏi thường gặp của họ. –
Ý của bạn là gì? Thư viện này chỉ là một tệp tiêu đề và nó biên dịch ở chế độ 64 bit. –
FreeImage là một mở tốt thư viện nguồn
Dưới đây là một ví dụ mã, dữ liệu có thể truy cập với "out.data()"
FREE_IMAGE_FORMAT format = FreeImage_GetFileTypeU(filename.c_str());
if (format == FIF_UNKNOWN) format = FreeImage_GetFIFFromFilenameU(filename.c_str());
if (format == FIF_UNKNOWN) throw(std::runtime_error("File format not supported"));
FIBITMAP* bitmap = FreeImage_LoadU(format, filename.c_str());
FIBITMAP* bitmap2 = FreeImage_ConvertTo32Bits(bitmap);
FreeImage_Unload(bitmap);
std::vector<char> out(FreeImage_GetWidth(bitmap2) * FreeImage_GetHeight(bitmap2) * 4);
FreeImage_ConvertToRawBits((BYTE*)out.data(), bitmap2, FreeImage_GetWidth(bitmap2) * 4, 32, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, true);
FreeImage_Unload(bitmap2);
Trình bao bọc C++ có vẻ hơi lỗi, ít nhất với g ++. Liên kết thư viện là có vấn đề, mặc dù phiên bản c hoạt động tốt. – jiggunjer
Bạn có thể có một cái nhìn tại SDL_Image, một tiểu dự án của Simple DirectMedia Layer. Nó phục vụ như là một trừu tượng dễ dàng để tải một số định dạng hình ảnh khác nhau. SDL được viết bằng C nhưng rất dễ sử dụng với mã C hoặc C++.
OP thậm chí không ngụ ý rằng C và C++ là 'ngôn ngữ'. OP đang tìm kiếm một giải pháp là C hoặc C++. –
@gbrandt, đã cập nhật câu trả lời của tôi để phản ánh ngôn ngữ triển khai cho SDL. –
Nếu bạn đang sử dụng OpenGL, thì DevIL là lựa chọn tốt vì phong cách và quy ước của nó tuân thủ OpenGL nhiều hơn bất kỳ thư viện nào khác. Nó tương đối dễ dàng để thiết lập và cũng có hỗ trợ tuyệt vời cho nhiều định dạng.
Một điều về điều phiền toái. Mặc dù rất hay để thiết lập mã làm việc của bên thứ ba đã được kiểm tra tốt và tiết kiệm thời gian cho bạn, có điều gì đó cũng được nói về cách tìm hiểu cách tải hình ảnh hoạt động và tại sao nó hoạt động theo cách của nó. Nếu bạn thực sự muốn nhận được một cái gì đó tốt, tôi tin rằng bạn cần phải thực sự tìm hiểu làm thế nào để làm điều đó từ đầu. Ngay cả khi bạn kết thúc bằng cách sử dụng mã bên thứ 3 cuối cùng.
Một khả năng khác (chủ yếu, nếu không dành riêng cho Windows) là CXImage
. Lợi thế rõ ràng của nó so với nhiều người khác là hỗ trợ nhiều định dạng máy ảnh thô, trong trường hợp có vấn đề với bạn.
Có Boost's GIL ban đầu được Adobe phát triển. Nó có thể không phải là trực quan nhất, nhưng nó chắc chắn là một trong những libs đầy đủ nhất và mạnh mẽ nhất.
'boost :: gil' không tự tải bất kỳ định dạng hình ảnh nào. Những gì nó làm là cung cấp một giao diện thống nhất để thực hiện các thuật toán pixel. Trình trợ giúp trình tải ảnh trong 'boost :: gil' yêu cầu bạn phải có các thư viện tương ứng (ví dụ' libtiff', 'libpng', v.v.) – kizzx2
cũng đúng cho CImg, nó hỗ trợ một vài định dạng nguyên bản, phần còn lại cần thứ 3 thư viện bên. – jiggunjer
OpenImageIO hỗ trợ nhiều định dạng tệp khác nhau giữa chúng TIFF, JPEG/JFIF, OpenEXR, PNG, HDR/RGBE, ICO, BMP, Targa, JPEG-2000, RMan Zfile, FITS, DDS, Softimage PIC, PNM, DPX, Cineon, IFF, Field3D, Ptex, Photoshop PSD, RLA dạng sóng, SGI, WebP và GIF
Nền tảng nào? – bshields
Là một wuss dường như là cách tiếp cận đúng. Đừng sáng tạo lại bánh xe. – Tom
http://stackoverflow.com/a/28633405/184572 –