No.1ベストアンサー
- 回答日時:
こんばんは。
アイコンを取り込んで容易にテクスチャ化する事は無理な様です。ピクセルを複写していく原始的なやり方が必要です。
LoadImage()でアイコンを読み込んで、そのイメージデータに基づいてテクスチャに書き込んでいきます。
アイコンがマスクイメージも所有している場合は、マスクデータに基づいて、テクスチャのアルファチャンネルへ書き込まないといけません。、
口で説明しきれる程、短絡的な事では無いので、取り合えず以下参考に。
struct CIcon2Texture
{
enum { COLOR = 0, MASK = 1, TOTAL = 3 };
LPDIRECT3DTEXTURE9 CreateTextureFromIcon(LPDIRECT3DDEVICE9 pDevice, LPCSTR pszName/*アイコンファイル名*/)
{
//アイコンのロード
HICON hIcon = static_cast<HICON>(::LoadImage(::GetModuleHandle(NULL), pszName, IMAGE_ICON, 0, 0, LR_LOADFROMFILE));
LPDIRECT3DTEXTURE9 pd3dtex9 = this->CreateTextureFromIcon(pDevice, hIcon);
::DeleteObject(hIcon);
return pd3dtex9;
}
LPDIRECT3DTEXTURE9 CreateTextureFromIcon(LPDIRECT3DDEVICE9 pDevice, HICON hIcon/*アイコンハンドル*/)
{
//アイコンのデータを記録する
this->GetObject(hIcon);
LPDIRECT3DTEXTURE9 pTexture = 0;
LPDIRECT3DSURFACE9 pSurface = 0;
//アルファチャンネル付き32ビットテクスチャの作成
::D3DXCreateTexture(pDevice, bmp[COLOR].bmWidth, bmp[COLOR].bmHeight, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pTexture);
if(!pTexture)
return 0;
pTexture->GetSurfaceLevel(0, &pSurface);
if(!pSurface)
return 0;
this->PixelCopy(pSurface);
return pTexture;
}
private:
//アイコンリソースに基づいて、テクスチャサーフェースにピクセルをセットする
void PixelCopy(LPDIRECT3DSURFACE9 pSurface)
{
D3DLOCKED_RECT rc;
//サーフェースをロックする
pSurface->LockRect(&rc, NULL, 0);
//アイコンイメージ用のHDCを作成する
HDC hDCIcon = ::CreateCompatibleDC(NULL);
//逆転しているので高さの最大からスタートする
for(int y = bmp[COLOR].bmHeight - 1; y >= 0 ; --y)
{
for(int x = 0; x < bmp[COLOR].bmWidth; ++x)
{
//32ビット前提でアクセスするポジションを計算する
const int pos = (rc.Pitch * y) + (x * 4);
LPDWORD pdw = reinterpret_cast<LPDWORD>
(
static_cast<LPBYTE>(rc.pBits) + pos
);
//アイコンイメージを選択
::SelectObject(hDCIcon, ici.hbmColor);
//色彩をサーフェースに書き込む
*pdw = ::GetPixel(hDCIcon, x, y);
//マスクイメージが無ければ引き返す
if(!ici.hbmMask)continue;
//マスクイメージを選択
::SelectObject(hDCIcon, ici.hbmMask);
//マスク値をサーフェースに書き込む
*pdw |= ::GetPixel(hDCIcon, x, y) == 0 ? 0x0 : 0xff;
}
}
//開放
pSurface->UnlockRect();
::DeleteDC(hDCIcon);
}
void GetObject(HICON hIcon)
{
::GetIconInfo(hIcon, &ici);
::GetObject(ici.hbmColor, sizeof(BITMAP), &bmp[COLOR]);
::GetObject(ici.hbmMask, sizeof(BITMAP), &bmp[MASK]);
}
ICONINFOici;
BITMAPbmp[TOTAL];
};
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングについて プログ...
-
プログラミングの進学について
-
Web初心者です。 簡易的なWebペ...
-
vba クリップボードクリアにつ...
-
pythonでAmazonのほしいものリ...
-
プログラマーは誘惑にさらされ...
-
Google Colabでimport soxが出...
-
Google ColaboでGUI作成
-
ExcelVBAでFormulaR1C1を列範囲...
-
HTMLソースが表示のページのも...
-
VBAでパワーシェルを実行したい...
-
Pythonで指定時間までスリープ...
-
近年誕生したプログラミング言語
-
Python... 環境設定 初心者です...
-
chatGPTで次々と質問をしていく...
-
このURLで広告を出しているのは...
-
テキストファイルの1行目のみを...
-
ITパスポートの勉強をしていま...
-
初心者powershellのPS1ファイル...
-
python エラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アセンブリ言語のcasl2について...
-
マスクをとるとオーバーフロー...
-
C言語でネットワーク範囲のIPア...
-
Simulinkのサブシステムの完全...
-
OpenGLで背景をグラデーション...
-
Fireworks4の写真の切り取り方...
-
FLASHで使用するマスクやイラス...
-
マスクをかけた外部テキストの表示
-
ピクセルシフトさせる方法
-
マスクのサイズを変更すると対...
-
OpenGLのグラデーションについて
-
ぼかしたマスク
-
photoshopで書いた四角の枠の中...
-
Pythonを使ってせん断応力図、...
-
python ボタンを押すと複数の関...
-
VBAで改行の入ったデータの正規...
-
【VB.NET】別Formのボタンが押...
-
別のアプリケーションのテキス...
-
VBScriptでMsgBoxのYesNoボック...
-
変数に256文字以上のテキストを...
おすすめ情報