2008-10-13 31 views
9

Tôi muốn tải một tệp BMP, thực hiện một số thao tác trên bộ nhớ và xuất tệp BMP mới bằng C++ trên Windows (Win32 gốc). Tôi biết về ImageMagick và đó là ràng buộc C++ Magick++, nhưng tôi nghĩ rằng đó là quá mức cần thiết cho dự án này vì tôi hiện không quan tâm đến các định dạng hoặc nền tảng tệp khác.C++: Cách đơn giản nhất để đọc và ghi tệp BMP bằng C++ trên Windows là gì?

Cách đơn giản nhất để thiết lập mã để đọc và ghi tệp BMP là gì? Câu trả lời có thể là "chỉ sử dụng Magick ++, nó đơn giản nhất."

Câu hỏi liên quan: What is the best image manipulation library?

Trả lời

7

Khi phát triển chỉ dành cho Windows Tôi thường chỉ cần sử dụng ATL lớp CImage

+0

Tôi nghĩ CImage là một phần của các lớp/ATL chia sẻ MFC - có thể được dễ dàng hơn một chút để bao gồm sau đó lớp CBitmap, đòi hỏi MFC. – Aardvark

+1

Có, bạn chỉ cần bao gồm atlimage.h – Gerald

+0

nếu bạn không chỉ nhắm mục tiêu các cửa sổ thì sao? – JohnIdol

1

Tôi đã không được sử dụng Magick ++, nhưng Windows có một thư viện được gọi là Windows Imaging Component mà có khả năng sẽ phù hợp với nhu cầu của bạn.

2
#include <windows.h> 

LoadImage

+0

ồ không, tôi muốn nói là (sharp) "windows.h" nhưng một phần nhận xét của tôi bị thiếu – user27732

+0

Tôi đã sửa bài đăng của bạn và thêm liên kết. Hy vọng bạn không nhớ. –

5

tập tin Một BMP gồm 3 cấu trúc. Một BITMAPFILEHEADER theo sau là một BITMAPINFO theo sau bởi một mảng các byte. Cách đơn giản nhất để tải một tệp BMP bằng Win32 là gọi CreateFile, GetFileSize, ReadFile và CloseHandle để tải hình ảnh tệp vào bộ nhớ, và sau đó chỉ cần đưa con trỏ đến bộ đệm tới BITMAPFILEHEADER và đi từ đó.

Tôi nói dối, cách đơn giản hơn là gọi hàm LoadImage. Đảm bảo vượt qua cờ LR_DIBSECTION để đảm bảo rằng GDI không chuyển đổi hình ảnh được tải vào bất kỳ bitmap nào mà màn hình chính của bạn được cấu hình. Điều này có lợi thế là bạn nhận được một HBITMAP mà bạn có thể chọn vào một DC và do đó rút ra tất cả hơn bằng cách sử dụng GDI.

Tuy nhiên, để lưu nó, không có phím tắt. Bạn cần chuẩn bị một BITMAPFILEHEADER, viết nó ra, điền vào một cấu trúc BITMAPINFO, viết nó ra, và sau đó là dữ liệu pixel thực tế.

6

EasyBMP nếu bạn chỉ muốn hỗ trợ bmp. Tôi đủ đơn giản để bắt đầu sử dụng trong vòng vài phút, và đó là nhiều nền tảng nếu bạn cần.

1

Tôi đã thử CImage như trên, nhưng tôi đã có một mảng C đầy đủ các giá trị pixel mà tôi chỉ đơn giản muốn kết xuất dưới dạng BMP (hoặc bất kỳ định dạng nào khác). CImage không có hàm tạo nào cho điều đó và tôi không muốn liên kết MFC (cho CBitmap) hoặc cũng không cố gắng hiểu IWIC.

là gì dễ dàng là CImg:

#include <cimg/cimg.h> 
using namespace cimg_library; 
//... 
void SaveMyData(uint8_t *pxarray, int width, int height) 
{ 
    CImg<uint8_t> img(pxarray, width, height); 
    img.save_bmp("sav.bmp"); 
} 
+0

Tôi nên đề cập đến: Tôi không nghĩ rằng tôi muốn sử dụng CImg trong một sản phẩm. Tôi không thích các tiêu đề nguyên khối, cũng không phải là nó ném rất nhiều cảnh báo. –