11

BMP ファイルをロードし、メモリ内でいくつかの操作を行い、Windows (Win32 ネイティブ) で C++ を使用して新しい BMP ファイルを出力したいと考えています。私はImageMagickを認識しており、それは C++ バインディングMagick++ ですが、現在他のファイル形式やプラットフォームには興味がないため、このプロジェクトではやり過ぎだと思います。

BMP ファイルを読み書きするためのコード設定に関して、最も簡単な方法は何ですか? 答えは、「Magick++ を使用するだけです。これが最も簡単です」かもしれません。

関連する質問:最適な画像操作ライブラリは何ですか?

4

7 に答える 7

8

Windows 用に開発するときは、通常、ATL CImageクラスを使用します。

于 2008-10-13T23:31:32.440 に答える
6

bmpサポートだけが必要な場合はEasyBMP 。私は数分以内に使い始めるのに十分単純です、そしてあなたがそれを必要とするならばそれはマルチプラットフォームです。

于 2011-08-16T12:29:25.117 に答える
5

BMP ファイルは 3 つの構造で構成されています。BITMAPFILEHEADER の後に BITMAPINFO が続き、その後にバイト配列が続きます。

Win32 を使用して BMP ファイルをロードする最も簡単な方法は、CreateFile、GetFileSize、ReadFile、および CloseHandle を呼び出してファイル イメージをメモリにロードし、バッファへのポインタを BITMAPFILEHEADER にキャストしてそこから移動することです。

もっと簡単な方法は、LoadImage を呼び出すことです。LR_DIBSECTION フラグを渡して、GDI がロードされた画像をプライマリ ディスプレイの設定されているビット深度に変換しないようにします。これには、DC に選択できる HBITMAP を取得できるという利点があるため、GDI を使用して全体を描画できます。

ただし、保存するための近道はありません。BITMAPFILEHEADER を準備し、それを書き出し、BITMAPINFO 構造体に入力し、それを書き出し、そして実際のピクセル データを書き出す必要があります。

于 2008-10-14T07:30:01.287 に答える
3

上記のように試しCImageましたが、単純に BMP (またはその他の形式) としてダンプしたいピクセル値でいっぱいの C 配列がありました。 CImageにはそのためのコンストラクターがありません。また、MFC をリンクしたり ( for CBitmap)、IWIC を理解しようとしたりしたくありませんでした。

簡単だったのは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");
}
于 2012-08-14T22:36:39.687 に答える
2
#include <windows.h>

LoadImage

于 2008-10-14T05:47:47.827 に答える
2

CBitmapクラスは BMP I/O を 行います。

于 2008-10-13T23:28:26.597 に答える
1

私は Magick++ を使用したことはありませんが、Windows には Windows Imaging Component と呼ばれるライブラリがあり、ニーズに合う可能性があります。

于 2008-10-13T23:25:57.693 に答える