- ベストアンサー
DirectXでのicoファイル読み込み
今デスクトップアクセサリのような物を作成しています 作成中、DirectXでのicoファイル読み込みの部分で躓いています。 icoファイルの画像をテクスチャとして読む込む方法を教えてもらえないでしょうか?
- CTester
- お礼率41% (15/36)
- その他(プログラミング・開発)
- 回答数1
- ありがとう数1
- みんなの回答 (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]); } ICONINFO ici; BITMAP bmp[TOTAL]; };
関連するQ&A
- DirectXでのテクスチャの色抜きについて
DirectXのテクスチャについて質問させていただきます. CreateTexture関数で空のテクスチャを作り,そこに画像を貼り付けることで任意の画像テクスチャを作成したのですが,こういったテクスチャを色抜きをして貼り付けるにはどうすればよろしいのでしょうか? イメージとしてはD3DXCreateTextureFromFileExのカラーキーで指定した色が透けるといったようなことを自作テクスチャでも行いたいのです.
- 締切済み
- その他(プログラミング・開発)
- [DirectX9.0]テクスチャのサイズについて
Visual C++ 6.0でDirectX9.0を使用しています。 画像ファイルからテクスチャを作り、それを画面に表示します。 その時に、画像ファイルのサイズが縦横どちらとも2の階乗の数字でないと、勝手に拡大表示されたりしてうまく表示されません。 数字が2の階乗でないサイズの画像ファイルを、テクスチャを使用してそのままの大きさで貼り付けるのにはどうすれば良いのでしょうか? よろしくお願いします。
- ベストアンサー
- C・C++・C#
- icoファイルの重複チエック
PC内から集めた物、フリー素材、自分で作成した物等、5.4MBサイズのアイコンを集めたフォルダが在ります。 1 PC内から集めたのは3回位あります(*icoで検索)が現在のフォルダに貼り付ける時に普通のファイルのように上書き確認場面が出ませんがこれは重複して保存されてるという事でしょうか? 2 jpgファイルの重複チェックはできますが、icoファイルを扱えるこのようなソフトは在るでしょうか? どうぞ宜しくご教示下さい。
- ベストアンサー
- Windows XP
- DIRECTXのスプライト描画で質問です
いつもお世話になってます。 DIRECTX9.0、VC++6.0を使っています。 DIRECTXでLPDIRECT3DTEXTURE9(テクスチャ)とLPD3DXSPRITE(スプライト)を使って描画しています。 ですが、テクスチャの縦と横のサイズが256*256を超えたものが正常に表示できません。 色々調べてみると、縦と横のピクセル数が2の乗数以外の中途半端なサイズのテクスチャは、キリの良いサイズに変換されるみたいですが、一応縦横共に2の乗数のテクスチャなのにうまく表示できません。 例:768*512ピクセルのTGA形式のファイル 大きな画像ファイルを表示する方法はないでしょうか? どうぞ宜しくお願いします。
- ベストアンサー
- C・C++・C#
- DirectXによるpmdファイルの読み込み
質問なのですが、現在DirectXでpmdファイルを読み込むプログラムを作成しているのですが サンプルプログラムで使用されていたpmdファイルを読み込むことには成功したのですが、 自分が使いたいLat式ミクを表示しようとするとフォルダの中に存在しているテクスチャが 見つからないと表示されアクセス違反が発生してしまいます。 なぜか指定されたデータは存在するのにプログラム側で「指定されたテクスチャファイルが見つかりません。」 と表示されるのか原因がわからず困っております。 読み込みのプログラムはこちらのサイトのpmdモデルの表示を参考にしました。 http://www2.ocn.ne.jp/~mhage/PIC_Trap/ データはソースコードが置いてある場所にモデル用のフォルダを作成しその中にすべて データを入れてあります。 パスの指定の方法は"関数の引数に("フォルダ名/モデル名.pmd")で指定しております。 ちなみにフォルダ内のデータをすべてソースコードが置いてるフォルダ直下に移した場合は表示されております . 環境 Windows7 VisualStudio2008 DirectXSDK November2007を使用しております
- 締切済み
- C・C++・C#
- mqoファイルをxファイルに変換するとテクスチャが無くなる
メタセコイアで作ったmqoファイルをxファイルに変換し、 それをDirectXで描画すると、なぜかテクスチャマッピングが無くなってしまいます。 ちゃんと画像のファイル形式がbmpになっている物を使ったのですが… なぜでしょうか?
- 締切済み
- グラフィックソフト
- 拡張子.icoのファイルの種類をアイコンに戻したい
「*.ico」のファイルはアイコンファイルなのでファイルの種類の欄に「アイコン」と表示されていたのですが、拡張子は「*.ico」なのにファイルの種類が「GIMP2.10.2」という表示に変わってしまい,画像編集ソフトのGIMPで編集した画像と同じになってしまいました。拡張子が「*.ico」であればファイルの種類は「アイコン」と表示されなければ、アイコンを変更するときなどに混乱が起きそうです。 もしかしたら、自作のアイコンを関連づけるとき間違ったのかもしれません。 もとのように、拡張子「*.ico」のファイルの種類を「アイコン」と表示するにはどうしたらよいのでしょうか。 ※OKWAVEより補足:「富士通FMV」についての質問です。
- 締切済み
- Windows 10
- 拡張子icoについて教えてください
拡張子icoについて教えてください。 ネットからアイコンをダウンロードしてアイコンを変更したいのですが、icoファイルは安全なのでしょうか? 拡張子偽装されていないicoファイルが前提です。 過去に画像などでもウイルスに感染する恐れがあると聞いたので気になりました。 icoに脆弱性があるのかなど気になります。 よろしくお願いします。
- 締切済み
- その他([技術者向] コンピューター)
- icoファイルの関連づけ
今まで.ico(自作等のアイコンファイル)がエクスプローラー上でSmallアイコンとして見えていたのですが(BMPの縮小と同様な漢字)nero入れて関連付けが変更されて、そのまま見えなくなりました(neroのアイコンになってしまう)レジストリエディターで.icoの部分は変更(元と思われる状態)したのですがやはり変わりません。 どうしたらエクスプローラー上で表示されるでしょうか?
- 締切済み
- Windows XP
- .icoのアイコンについて
ちょっと変なタイトルですが。。。 最近.icoファイルのアイコンが表示されません。(なんか四角いヤツになります。) USBメモリや外付けHDDのアイコンを自分で変えて(autorunで入れてあります)いるのですが、そのデバイスの最上層を開くと.icoファイルとautorunファイルがあります。以前は.icoファイルはそのアイコンが表示されていたのですが、今は何故か表示されません。(画像参照) デバイスのアイコン自体はちゃんと表示されています。 何故なのか原因が知りたいです。 また、元に戻すにはどうすればいいのでしょうか? OSはWinXPです。 ご協力お願いします
- ベストアンサー
- Windows系OS
お礼
ピクセル単位で複写する方法とても参考になりました! この方法を使えば上手くいきそうですありがとうございました。