• ベストアンサー

WindowsAPIで画像フォーマットの変換

Visual C++上でプログラムを作っています。 RGBA(32bit)の画像データを、RGB565(16bit)に変換したいのですが、このようなフォーマット変換を自動的に行ってくれるAPIは存在するでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

 こんにちは。  こう言った類の変換を容易に引き受けてくれるwin32APIは存在しません。  RGB565のビットマップを以下で作成して  http://msdn.microsoft.com/ja-jp/library/cc428334.aspx  以下のAPIでRGB565に向かって描写すれば変換が出来ます。  http://msdn.microsoft.com/ja-jp/library/cc428307.aspx  但し、気をつけなければ成らないのが、win32APIはアルファチャンネル付を受け付けていないので、事前にアルファチャンネルを剥がしてRGBA8888(32bit)からRGB888(32bit)に変換しておきます。  手順としては、RGBA(32bit)→RGB(32bit)→RGB565(16bit)となります。 #include<windows.h> #include<tchar.h> //ビットマップヘッダの初期化 static void InitHDR(LPBITMAPINFOHEADER p, long w, long h) { p->biSize = sizeof(*p); p->biPlanes = 1; p->biBitCount = 16; p->biCompression = BI_BITFIELDS; p->biWidth = w; p->biHeight= h; } //RGB565フィールドの設定 static void InitFields(DWORD f[]) { f[0] = 0xf800; f[1] = 0x07e0; f[2] = 0x001f; } //変換 static HBITMAP Convert(HBITMAP hSrc) { if(!hSrc)return NULL; //hSrcから情報を取り出す BITMAP bitmap = {0}; ::GetObject(hSrc, sizeof(bitmap), &bitmap); //RGB565の作成 HGLOBAL hMem = ::GlobalAlloc(GMEM_ZEROINIT | GMEM_FIXED, sizeof(BITMAPFILEHEADER) + (sizeof(DWORD) * 3)); LPBITMAPINFO p = static_cast<LPBITMAPINFO>(::GlobalLock(hMem)); ::InitHDR(&p->bmiHeader, bitmap.bmWidth, bitmap.bmHeight); ::InitFields(reinterpret_cast<LPDWORD>(p->bmiColors)); LPVOID pvBits = NULL; HBITMAP h565 = ::CreateDIBSection(NULL, p, DIB_RGB_COLORS, &pvBits, NULL, 0); //デバイスコンキスト作成 HDC hDC565 = ::CreateCompatibleDC(NULL); HDC hDCSrc = ::CreateCompatibleDC(NULL); HGDIOBJ h565Prev = ::SelectObject(hDC565, h565); HGDIOBJ hSrcPrev = ::SelectObject(hDCSrc, hSrc); //RGB565へ転送して変換する ::BitBlt(hDC565, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hDCSrc, 0, 0, SRCCOPY); ::SelectObject(hDC565, h565Prev); ::SelectObject(hDCSrc, hSrcPrev); //後始末 ::DeleteDC(hDC565); ::DeleteDC(hDCSrc); ::GlobalUnlock(hMem); ::GlobalFree(hMem); return h565; } int main() { //hbmp32はアルファチャンネルを剥がしたビットマップでなければ成らない HBITMAP hbmp16 = ::Convert(hbmp32); return 0; }  非常に面倒なので、GDI+をダウンロードして使用した方が賢明かもしれません。  http://msdn.microsoft.com/ja-jp/library/aa984108(VS.71).aspx  

BearCave
質問者

お礼

コードまで提示していただいて、ありがとうございます。CreateDIBSectionとBitBltを使って無事解決することができました。565フィールドの設定方法も大変参考になりました。

関連するQ&A

  • 画像のファイルフォーマットについて

    HDの信号、YPbPrでキャプチャした画像をファイルにおとしたいのですが どのファイルですればいいのかわかりません。 これまでは.bmpや.tgaでRGB変換しておとしていたのですが、 フォーマットがYPbPr4:2:2 10bitだったりするのでRGBに変換したり またそのファイルをYPbPr変換したりしてLoadする場合 計算上、多少の誤差も生じ、正確な値でデータを得られません。 一応.qtifファイルで、とも考えたんですけど、 分かり易いヘッダ情報の資料なども手元になく半分諦めかけています。 もし、.qtifのヘッダ情報を詳しく知っている方、 もしくはYPbPrも対応しているファイルを知っている方、回答をお願いします。 ちなみに対応して欲しいフォーマットは YPbPr4:4:4 8bit + K8bit YPbPr4:2:2 10bit + K8bit YPbPr4:4:4 10bit Kナシ YPbPr4:2:2 10bit Kナシ(6Pixel/4word) YPbPr4:2:2 8bit Kナシ(2Pixel/1word) です。

  • 16bit/channelの画像について

    そんなに詳しくないのですが、画像フォーマットには 16bit/channelのものがありますよね。 この画像を表示するにはどうすればいいのですか? また、1pixelの色データはどうなっているのですか? 8bit/channelの画像でRGBがそれぞれ0~255の 範囲の中にあるように、16bit/channelの場合は RGBそれぞれ0~65535の範囲で表現されているのですか? 表示の際に16bit/channelを8bit/channelに変換しているのならば、 どのようなアルゴリズムで変換しているのですか? どれかひとつでもいいので分かる方ご教授お願いします。

  • 画像フォーマットを変換するプログラム

    画像フォーマットを変換するプログラムってないのでしょうか? gifをpngにしたいのです。 お願いします

  • グレイスケール画像を透過マスクPNGに変換する方法

    PhotoShop CS5 もしくはフリーソフトで、添付したようなグレイスケールの画像から、PNG形式(RGBA32bit)のアルファチャンネル付き画像に変換する方法を教えて下さい。 グレイスケールの濃度をアルファ値に変換した画像を作成する感じです。 変換後のPNGのRGB値はなんでもいいです。 例:Grayscale 96 → (R,G,B,A) =(0,0,0,96) よろしくお願いします。

  • VCからVBに自動変換について

    早速質問なんですけど、Visual C++でかかれたデータをVisual Basicのデータに自動で変換させることは可能なんでしょうか?またはそのようなソフトはあるのでしょうか?良かったら教えてください。

  • IllustratorでRGBの画像を配置

    IllustratorCCでCMYKのAIデータに、RGBの画像データを配置したら自動的にRGBの画像はCMYKに変化されるのでしょうか? それができないならばPhotoshopでRGBの画像をCMYKに変換してから、IllustratorのAIデータに配置、ということになるのですか?

  • 画像ファイルの編集の方法

    画像にはいろんなフォーマットがありますが、ソフトウェアを使うとフォーマット変換ができます。そこで例えばビットマップに変換できたとします(変換には不可逆とか不可逆の圧縮とかありますが、そこはとりあえず不問で)。 そこでプログラムによってビットマップを何らかの方法で数値として取り出し、編集してまた元に戻すことを考えています。これが自在にできると大きな自由度を得ることができます。ビットマップですから平面に展開された数値(RGB値?)だと思います。編集作業が一番難しいのでしょうが、プログラムを駆使して何かができてそれを元に戻すと編集後の画像が再構成されます。このようなことを実行する方法はC++とかJAVAなのかなと思うのですが、実際どのようにして行うことが可能でしょうか。そのようなテンプレートのようなプログラムがあると助かるのですが。画像ファイルのヘッダーなどは形式によって決まっているのではないかと思いますが。なお、できるのであれば形式はビットマップでなくてもいいです。よろしくお願いします。

  • PSを使ったTIFFからJPEGに変換について

    こんにちは。お世話になります。 TIFFからJPEGに変換について教えて下さい。 スキャナーで取り込んだ画像をTIFFデータを貰ったので、PhotoShopCS5でJPEGに変換しようとしたのですが、保存形式でJPEGが出てきませんでした。 少し調べてみたのですが、「TIFFが16bitかもしれないので、よく確認して8bitにしてからにすれば保存できますよ」という書き込みをいくつか見ました。 私の手元にあるデータは、PhotoShopの[イメージ]→[モード]で確認しましたところ、【RGB 8bit/チャンネル】となっておりました。 レイヤーの数については、【背景】となっている1レイヤーしかありません。 なので、8bitなので保存できるはず…? スキャナーでデータを撮る時の設定で、8bitではなくて高いbitで撮ったのが原因でしょうか? 最終的にJPEGにしたい画像については、スキャンする際には、8bitでしないと駄目という事でしょうか??? でも、高階調な設定で撮ったとしても、PhotoShopならば変換できるし、何故??? というところで躓いております。 お手数ですが、ご指導願えると非常に助かります。 どうぞよろしくお願いいたします。

  • C++の画像処理について【画像のピクセル値を表示する方法】

    画像処理に関する質問です。初歩的なことかもしれませんが、ご教授お願いいたします。 開発環境はVisual C++ 2005です。 JPEGまたはBMP画像を読み込んで、その画像のピクセル値を表示するプログラムを作成したいのですが、まったくどうしてよいか判らず、行き詰っています。 これまでいろいろ試してみたのですが、読み込んだ画像をBit値に変換してしまったり(そのせいでパソコンがクラッシュしてしまいました…)、うまくいきません。 画像処理の対象となる原画像を取り込み、その原画像のピクセルの色情報を表示するためには、どのような処理を行えばよいのでしょうか? どうぞよろしくお願いします。

  • C++プログラムに変換

    Visual Studio .NET 2003を使っているのですが、C#のプログラムをC++のプログラムに変換して使用したいのですが、可能でしょうか? またVBのプログラムもC++に変換して使用したいのですが、可能でしょうか? どうか教えてください。

専門家に質問してみよう