C ++:WindowsでC ++を使用してBMPファイルを読み書きする最も簡単な方法は何ですか?
-
11-07-2019 - |
質問
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>
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");
}