
No.1ベストアンサー
- 回答日時:
こんにちは。
こう言った類の変換を容易に引き受けてくれるwin32APIは存在しません。
RGB565のビットマップを以下で作成して
http://msdn.microsoft.com/ja-jp/library/cc428334 …
以下のAPIでRGB565に向かって描写すれば変換が出来ます。
http://msdn.microsoft.com/ja-jp/library/cc428307 …
但し、気をつけなければ成らないのが、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 …
コードまで提示していただいて、ありがとうございます。CreateDIBSectionとBitBltを使って無事解決することができました。565フィールドの設定方法も大変参考になりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- フリーソフト 倍率自動調整して全画面表示できるフリーの画像ビューアー 1 2023/08/24 10:55
- Excel(エクセル) 【至急 詳しい方教えて下さい】Excelの表を変換したい 6 2022/04/21 18:35
- アプリ Steam 動画のmp3変換について SteamのアプリでOBS studioを使っています。 これ 2 2023/06/01 01:49
- 一眼レフカメラ 「Imaging Edge」を手動起動せず、ARWファイルを最高画質JPEGへ変換する方法は? 2 2022/08/05 11:38
- 画像編集・動画編集・音楽編集 コムテックのドライブレコーダーZDR-015の録画データ(前後カメラ)を通常は専用のソフトで映像を再 1 2022/06/13 15:03
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- 写真・ビデオ iPhoneで撮影した動画の画角をキープした状態で容量を減らす方法。 3 2022/09/25 17:23
- その他(Microsoft Office) VBAで横データを縦データに変換する方法を教えて下さい。 4 2023/06/25 21:12
- C言語・C++・C# キャスト演算について。 1 2023/07/15 15:28
- その他(メールソフト・メールサービス) メールソフトを教えてください 1 2023/03/28 23:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
秋月PICプログラマーを使っ...
-
JPGからSWFへ変換
-
緯度、経度の 10進法と 60進法...
-
ローマ字の出し方
-
C++で文字コードの変換
-
FPDFでPHPファイルをPDFに変換...
-
N88BASICのバイナリデータをテ...
-
ActiveXの使い方を教えてくださ...
-
ShijtJIS -> UTF-8 変換スピー...
-
.jpgと.pngファイルを...
-
複数のテキストの文字コード変更
-
htaccessでURLを変えたい
-
Visual C++のサンプルプログラ...
-
RGBからCMYKの変換で生じる差で...
-
アセンブラ言語の数字を数値に...
-
Mac 乗数の入力方法
-
VB OracleからSQL変換
-
Excel2007のPDF変換機能
-
シフト演算の結果の型
-
一括文字列変換
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
家電製品の電力周波数を変える機械
-
エクセルVBAの自動変換機能?
-
緯度、経度の 10進法と 60進法...
-
Mac 乗数の入力方法
-
C/C++→JAVAに変換するツール
-
なぜ通信には16進数文字列が使...
-
VB6からVB2010への変換について
-
10進数をBCDに変換する方法
-
画像ファイル変換(Tiff→PDF)
-
エクセルのvbaで検索ボタンを作る
-
分を時間に変換するプログラム
-
StrConvの使い方について教えて...
-
三角形を逆三角形にしたいです...
-
逆コンパイルと逆アセンブルの...
-
VB.NETをJavaに変換するツール...
-
UTF8→ShiftJISに変換したいです!
-
FortranをC++(VC++)へ変換
-
3のつく数字と3の倍数のみを表...
-
c++でmatからvectorへの変換の...
-
C#でのpngからbmpへの変換について
おすすめ情報