• ベストアンサー

DirectXのテスクチャから画像データを取れますか?

複数の小さなパーツ画像を読み込んで、 一枚の大きめのテスクチャを複数作りたいのですが このサイトにあるような http://marupeke296.com/DXG_CreateTextureMethod.html テスクチャ作成関数から 画像データ(RGB)をBYTE配列等へコピーする事は出来るのでしょうか? それともやはり、デバイスコンテキスト等を使わないと無理でしょうか? 可否だけでも構いませんので、教えて下さると幸いです。

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

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

 こんにちは。  可能です。IDirect3DTexture9::LockRectメソッドを使用します。  http://msdn.microsoft.com/ja-jp/library/cc324038.aspx  テクスチャからサーフェースを取り出している場合は、IDirect3DSurface9::LockRectメソッドを使用します。  http://msdn.microsoft.com/ja-jp/library/cc324048.aspx  以下はアイコンファイルを開いて、テクスチャから取り出したサーフェースに向かってピクセルコピーをしたものです。  便宜的にアイコンからピクセルを取り出す為にHDCを使用していますが、取ったピクセルをテクスチャイメージへのポインタに向かって書き込んでいます。  http://oshiete1.goo.ne.jp/qa4501830.html  取り出したポインタはy軸を逆転計算させなければいけない事と、以下の構造体のPitchメンバを使用して1ライン毎の移動量を計算しなければいけない事に注意して下さい。  http://msdn.microsoft.com/ja-jp/library/cc323934.aspx

zaxs5968
質問者

お礼

可能なのですね。ありがとうございます。 そしてすいません、初歩的な質問かもなのですが、 3番目のリンクのコード ::D3DXCreateTexture(pDevice, ~省略~); 上の部分で >error C2039: 'D3DXCreateTexture' : '`global namespace'' のメンバではありません。 >error C3861: 'D3DXCreateTexture': 識別子が見つかりませんでした とエラーが出てしまいます。 「::」スコープ解決演算子は同名の関数・変数が有る場合に グローバルに有るものを呼ぶと学んだのですが、この場合は違うのでしょうか? 4番目のリンクのD3DLOCKED_RECT 構造体は別の事で扱っていたので そこは多分なんとか出来ると思います。 注意してくれてありがとうございます。 自分でも調べなおしていますが、「::」について教えて頂けると幸いです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.2

 こんにちは。御礼頂きました。  「::」の解釈については其れで合っている筈です。  D3DXと付く関数やインターフェースはD3Dに対する拡張ライブラリの方なので、  #include<d3dx9.h>  をインクルードしていないと使えない筈です。    http://msdn.microsoft.com/ja-jp/library/cc372290.aspx  http://msdn.microsoft.com/ja-jp/library/cc372751.aspx

zaxs5968
質問者

お礼

本当にありがとうございます! 該当部分のヘッダーがd3d9.hしか読み込んでいませんでした; そして、D3DXは拡張されたものだったのですね。 MSDNの関数紹介の最下部にヘッダー情報が付いている事、 スコープ解決演算子の実例、ほんとに色々と勉強になりましたっ ありがとうございましたっ!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 大きな画像ByteデータをUDP転送したい

    VB.net2005でサーバーアプリとクライアントアプリを作って 全クライアントに一定間隔で画像を送信しようと思ってます。 クライアント側は全部取れなくてもいいので、UDPを使ってみたのですが、 送る画像をbmp.GetPixel()で取得してByte型の配列に詰めて 縦160*横120*3(RGB)分で転送する分にはOKだったのですが、 縦320*横240*3(RGB)分はNGでした。 (65535バイト以上送信するとエラーになる…UDPのデフォルトの バッファ最大値?) それでMemoryStreamとDeflateStreamと使って圧縮してみたものの 230401Byte → 222169Byte程度にしかなりませんでした。 jpgのByteデータにして送れば小さくなるのかと思ったのですが 良いやり方がわかりませんでした。 他の方法でもいいのですが、Byteデータを小さくする手段って ありますでしょうか?

  • フォント画像の取得方法

    BYTE配列にフォント画像を取得する関数をご存知の方がいましたら 教えて頂けると幸いです。 ウィンドウハンドルから直接描画する方法しか見つかりません orz

  • 画像の転送処理について

    前後の処理は省くとして 1.CreateCompatibleDCでメモリデバイスコンテキスト作成 2.SelectObjectでビットマップオブジェクトを選択 3.BitBltで画像を転送 4.SelectObjectで元のオブジェクトを選択 5.DeleteDCでメモリデバイスコンテキストを削除 サンプルを公開されているサイトここのような書き方になっているのですが 5. の段階で削除するのであれば 4. の元に戻す処理の必要性がわかりません。 ※BitBltの直後にSelectObjectで戻し、DeleteDCで削除しており、  間に余計な処理は入っていません。 上記の処理を行う場合、 1.CreateCompatibleDCでメモリデバイスコンテキスト作成 2.SelectObjectでビットマップオブジェクトを選択 3.BitBltで画像を転送 4.DeleteDCでメモリデバイスコンテキストを削除 このようなやり方だと問題ありますでしょうか?

  • HTMLでRGBデータを使って画像を表示させることはできますか?

     ブラウザで表示できないファイル形式の画像を表示させるためのCGIプログラムを作成しています。  ファイルから圧縮されたRGBデータを解凍して取り出すことまではできました。これを別のファイル形式にして保存するのではなく、RGBデータをそのまま使用してHTMLで表示できないかと考えています。  ファイルを指定して画像を表示するのではなく0から255もしくは00からffのデータの配列でHTMLに出力する方法があるか教えてください。

    • ベストアンサー
    • HTML
  • RGB値を画像(PNG・BMPJPEGなど)に出力したい

    配列に格納したRGB値からPNG画像(またはBMP画像JPEG画像)を作成したいと思っているのですが、画像ファイルの作り方がわかりません。 ファイルを作成⇒ヘッダ書きこみ⇒色情報書き込み と、漠然とした手順しかわかりません。 詳しい方法、または参考URLがわかる方、アドバイスお願いします。 以下補足です。 ・開発環境はwindowsXPのVC7でC言語を使っています。 ・openCVで適切な関数があれば助かります。 (openCVのIplImageの読み込みなども参考にしようと思いましたがxmlファイルからの取得とは違うのでわかりませんでした。)

  • imgctl.dllを使って読み込んだ画像ファイルをTransparentBltで画く方法

    今、LoadImage()で読み込んだBMP画像を BitBlt(hdc,x,y,dx,dy, hMin,0,0,SRCCOPY));や TransparentBlt(hdc,x,y,dx,dy, hMin,0,0,dx,dy,RGB(r,g,b)); で画面に書くCプログラムがあります。このプログラムをBMP画像だけでなくPNG画像も扱えるように拡張しています。いろいろと調べた結果PNG画像を読み込むためにライブラリimgctl.dllを使うプログラムに変更している途中です。しかし、imgctl.dllではLoadImage()の代わりにToDIB()関数で読み込むため、JPEG画像もPNG画像も読めるのですが、独自のDIBデータハンドル(HDIB)で管理するためHDC(デバイスコンテクストハンドル)が取得できません。そのため、 問題1、画面書き出しはBitBlt()が使えない。 問題2、TransparentBlt()関数が使えない。 という問題があります。 問題1は、DIBtoDC()で代用することで、解決しましたが、問題2が未解決です。 お知恵をお貸しください。 たとえば、HDIBからHDCを得る方法、あるいは、特定の色RGB(r,g,b)を透明として扱うTransparentBlt()関数に代わるHDIBを使った関数をお教えいただければうれしいです。

  • GDI+について

    いつもお世話になっております。 今回教えていただきたいことは、GDI+についてです。 今まで GDI と OpenGL を組み合わせてプログラミングをしていましたが、GDIでは自前でアンチエリアス処理をしなければならないなど面倒な部分が多く困っていました。 そこで GDI+ を使用して楽にプログラミングしようと考えて色々とプログラムをしてみたのですが、ここにきて壁にぶち当たりましたので、先人の方にご教授していただきたいのです。 《 GDI でプログラムしていた時 》 (1)画像バッファを作成しておく  //ディスクトップのDCを取得  HDC hdcTmp = GetDC( GetDesktopWindow() );  //ビットマップのハンドルと、作成したバッファの先頭アドレスを取得  hBitmap = CreateDIBSection( hdcTmp, &bmi, DIB_RGB_COLORS, (void**)&buffer, 0, 0 );  //HBITMAPにHDCを結び付ける  hdc = CreateCompatibleDC( hdcTmp );     //DIBSection用メモリデバイスコンテキスト作成  hOldHandle = SelectObject( hdc, hBitmap );       //画像バッファ(m_hBitmap)をメモリデバイスコンテキストに選択 (GDIでも描画出来るようにするため) (2)画像バッファ上にGDIで描画する  hdcに対してGDIの関数を使用して描画 (3)BitBlt()でウィンドウに転送する  WM_PAINTのメッセージのときだけウィンドウに対して転送 上記(1)(2)(3)のようにして描画を行っていました。 ■したいこと(1)■ 今したい事は 上記(1)で作成したGDI の画像バッファのhdcを使ってGDI+関数で描画したいのです。 そうするといままで使っていたGDIの知識を生かして両方使えます。 ■したいこと(2)■ したいこと(1)がもし出来ないのであればGDI+での画像バッファがつくれるかどうか、その画像バッファのデバイスコンテキスト は取得できるのかどうか教えていただきたいと思います 情報不足かもしれませんが、ご教授よろしくお願いいたします。

  • vector配列の重複を無くすには?

    画像処理で各ピクセルごとのRGB値をそれぞれ取得し、 重複を除いた形で全て表示したいと考えています。 (仮に4ピクセルしかないとして、RGB(255,255,0), RGB(255,255,255),RGB(255,255,255),RGB(255,0,255) といった値が取れたときにRGB(255,255,0), RGB(255,255,255),RGB(255,0,255)のみを表示するといった感じです。) 画像ごとにピクセル数が異なり分からないので、 各ピクセルのRGB値を格納するのに動的配列vector<int*> pixelを 用い、そこにred,green,blueそれぞれの値を格納した 配列RGB[3]を格納しようと思い以下のように書いたのですが、 vector配列に配列を格納したときに重複を削除する方法が 分からず困っています。 for(int x = 0; x->width; x++) { for(int y = 0; y->height; y++) { /*getRGBはそのピクセルのRGB値を取得する仮想関数*/ RGB[0] = (int)getRGB(x,y,RED); RGB[1] = (int)getRGB(x,y,GREEN); RGB[2] = (int)getRGB(x,y,BLUE); } } pixel.push_back(RGB); と格納しても、そこからpixel配列に格納された物の中から RGBが全て一致するものを消去する方法が分かりません。 格納していたものが配列でなければ、pixelをsortして、 unique関数で重複を無くせるのでしょうが… どなたか良い方法をご教授願えませんでしょうか?

  • C言語の配列のコピーについて質問です。

    intを要素とする二つの配列a、bとその配列の要素数を受け取り、配列aのすべての要素の値を配列bにコピーする関数を定義し、その関数の機能を確認するプログラム作成するという問題について質問です。 (1)配列aを配列bに「先頭から順番に」コピーする関数を作成する (2)配列aを配列bに「後ろから順番に」コピーする関数を作成する ただし、配列の要素数(例では4)が変更されても処理できる関数を作成したいです。また、配列の要素の値は関数main()内で表示したいです。 [ヒント] (1)関数宣言の例 void array_copy(コピー元の配列, コピー先の配列, 配列の要素数) [実行結果の例] (1)先頭から順番にコピーする コピー前 a[0]: 1 b[0]: 0 a[1]: 2 b[1]: 0 a[2]: 3 b[2]: 0 a[3]: 4 b[3]: 0 コピー後 a[0]: 1 b[0]: 1 a[1]: 2 b[1]: 2 a[2]: 3 b[2]: 3 a[3]: 4 b[3]: 4 (2)後ろから順番にコピーする コピー前 a[0]: 1 b[0]: 0 a[1]: 2 b[1]: 0 a[2]: 3 b[2]: 0 a[3]: 4 b[3]: 0 コピー後 a[0]: 1 b[0]: 4 a[1]: 2 b[1]: 3 a[2]: 3 b[2]: 2 a[3]: 4 b[3]: 1 #include <stdio.h> void array_copy() から始めて int main(void) { とプログラムを作成したいのですが教えてください。

  • c言語を用いて画像の透明度をあげる方法を教えてください。

    c言語を用いて画像の透明度をあげる方法を教えてください。 下プログラムの画像処理ができません。 #include <stdio.h> #include <stdlib.h> #include <memory.h> #include "mybmpi.h" /*メイン関数*/ int main(void) { int width, height; int x, y; BYTE *buffer_f; /*入力画像(前景)用メモリのポインタ*/ BYTE *buffer_b; /*入力画像(背景)用メモリのポインタ*/ BYTE *Rbuffer_f, *Gbuffer_f, *Bbuffer_f; /*入力(前景)用*/ BYTE *Rbuffer_b, *Gbuffer_b, *Bbuffer_b; /*入力(背景)用*/ BYTE *Rbuffer2, *Gbuffer2, *Bbuffer2; /*出力用*/ double tmp_pix; double ratio=0.5; /*どの割合で混ぜるか ratio : 1-ratio */ /*前景画像ファイルを開く*/ buffer_f = LoadBitmap("front.bmp", &width, &height); if(buffer_f==NULL) { /*ファイルが開けなかったので終了*/ return 0; } /*背景画像ファイルを開く*/ buffer_b = LoadBitmap("back.bmp", &width, &height); if(buffer_b==NULL) { /*ファイルが開けなかったので終了*/ return 0; } /*RGBを色平面に分解*/ Rbuffer_f = (BYTE*)malloc( width*height ); /*メモリ確保*/ Gbuffer_f = (BYTE*)malloc( width*height ); Bbuffer_f = (BYTE*)malloc( width*height ); RGB2Plane(buffer_f, Rbuffer_f, Gbuffer_f, Bbuffer_f, width, height); Rbuffer_b = (BYTE*)malloc( width*height ); /*メモリ確保*/ Gbuffer_b = (BYTE*)malloc( width*height ); Bbuffer_b = (BYTE*)malloc( width*height ); RGB2Plane(buffer_b, Rbuffer_b, Gbuffer_b, Bbuffer_b, width, height); /*出力用*/ Rbuffer2 = (BYTE*)malloc( width*height ); /*メモリ確保*/ Gbuffer2 = (BYTE*)malloc( width*height ); Bbuffer2 = (BYTE*)malloc( width*height ); /*****************画像処理をここで行う********************/ for(y=0; y<height; y++){ for(x=0; x<width; x++){ /*この部分がわかりません*/ /*前景画像と背景画像を ratio : 1-ratio で合成する方法?*/ /*R,G,Bそれぞれについて同じ処理をする*/ } } /*******************ここまで******************************/ /*書き込み処理*/ Plane2RGB(buffer_f, Rbuffer2, Gbuffer2, Bbuffer2, width, height); /*bufferは入力のものを転用する*/ SaveBitmap("result.bmp", buffer_f, width, height); /*メモリを解放する*/ free( buffer_f ); free( buffer_b ); free( Rbuffe

このQ&Aのポイント
  • ドアホンチャイムを途中で止めたい方法について解説します。遮断スイッチを設置することで、一瞬信号を遮断してチャイムを停止することが可能です。
  • ドアホンチャイムの問題点を解決する方法について考えてみましょう。ユーザーの声から分かるように、チャイムが長く鳴り続けることがあります。そこで、ワンプッシュの押し釦スイッチを設置し、信号を遮断すればチャイムを止められるかもしれません。
  • ドアホンチャイムの持つ問題を解決するためには、遮断スイッチの設置が有効です。チャイムが鳴りっぱなしになることを防ぐためには、ワンプッシュの押し釦スイッチを設けて、一瞬信号を遮断することでチャイムを停止させることができます。
回答を見る