C ++:WindowsでC ++を使用してBMPファイルを読み書きする最も簡単な方法は何ですか?

StackOverflow https://stackoverflow.com/questions/199403

質問

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

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

関連質問:最適な画像操作ライブラリとは

役に立ちましたか?

解決

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

他のヒント

EasyBMP (bmpサポートのみが必要な場合)。私は数分以内に使用を開始するのに十分なほど単純ではなく、必要な場合はマルチプラットフォームです。

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

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

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

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

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

#include <windows.h>

LoadImage

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

上記のように CImage を試しましたが、単にBMP(またはその他の形式)としてダンプしたいピクセル値でいっぱいのC配列がありました。 CImage にはそのためのコンストラクターがなく、MFC( 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");
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top