トップページ > 記事閲覧
マスク画像の拡大縮小
名前:だんごさん 日時: 2014/07/12 16:09

マスクを表示させるDrawMaskですが、これの拡大縮小ができるものはないでしょうか? ウィンドウを自由に変形できるようにしているのですが、DrawMaskだと固定サイズしか表示できないので困っています。 もし差支えなければ作成していただけませんでしょうか? よろしくお願いいたします。 [追記] 現在、事前に用意したソフトイメージ画像で、マウスの座標判定を行おうとしています。 クリックしたときにソフトイメージの色をマウス座標と比較、取得して判定を行う感じです。(これが正当な方法かは分かりませんが…) ただ同様にウィンドウのサイズが変更可能なため、用意したソフトイメージも拡大縮小を行いたいのですがどのようにすればよいでしょうか?
メンテ

Page: 1 | 2 |

Re: マスク画像の拡大縮小 ( No.5 )
名前:管理人 日時:2014/07/12 23:47

ご返答ありがとうございます うーん、だんごさんのされようとしていることがわかってきたような・・・ ソフトイメージを拡大する機能はありませんので、判定にのみ使用したいということでしたら まず「拡大されている箇所がクリックされたか」を判定して、 拡大されている箇所がクリックされていたら、 「クリックされた座標」を「拡大される前の座標」に変換して、 「拡大される前の座標」を使用してソフトイメージのピクセルの色をチェックする、 という方法は如何でしょうか?
メンテ
Re: マスク画像の拡大縮小 ( No.6 )
名前:だんごさん 日時:2014/07/13 00:15

理屈は分かりました。確かにそれが一番いいと思います。 ですがこれをプログラムに書き出す方法が分かりません…。 ただ拡大縮小の理屈が分かっていないのが原因だろうと思いますが 座標を変換する計算式?が分からないので書きようが…すみません。
メンテ
Re: マスク画像の拡大縮小 ( No.7 )
名前:管理人 日時:2014/07/13 00:22

例えば 縦横 64pixel の画像を2倍の 128pixel に拡大して x 100 y 150 〜 x 228 y 278 の範囲に配置されていたとします ここで x 164 y 200 の座標がクリックされたら、拡大前の画像の どの座標がクリックされたかを算出するには以下の計算を行います クリックされた画像内の座標x = ( クリック座標x - 配置左上座標x ) / 拡大率 クリックされた画像内の座標y = ( クリック座標y - 配置左上座標y ) / 拡大率 例の値を当てはめると以下のようになります 32 = ( 164 - 100 ) / 2 25 = ( 200 - 150 ) / 2 算出できた座標を使ってソフトイメージのピクセル色をチェックします
メンテ
Re: マスク画像の拡大縮小 ( No.8 )
名前:だんごさん 日時:2014/07/13 21:51

なるほど。ありがとうございます。 後ほど試してみたいと思います。 マスクについても無事表示されました。 しかし、MakeScreen関数をするためにSetUseDirectDrawFlagを trueにした(今まではメモリ節約ためなんとなくつけていました)ところ、 動画の再生終了時にフリーズを起こすようになりました。 動画はLoadGraphでロードしたものをPlayMovieToGraphで再生、 GetMovieStateToGraphでチェックしています。 しかも毎回フリーズするわけではなく4〜5回に1回のペースで起きます。 形式はogvです。 [追記] デバッグしてみた結果、SetUsePremulAlphaConvertLoad関数を使って非同期で読み込みを行う ときに起こるようです。SetUsePremulAlphaConvertLoad関数をコメントアウトすると フリーズすることは恐らくなくなりました。 たまたまロードが動画終了後だったので動画終了時にエラーが起こったと勘違いしたかもしれません。 しかし、ソフトの画面が表示されるときにもたまにフリーズするのでそこは現在調査中です。
メンテ
Re: マスク画像の拡大縮小 ( No.9 )
名前:管理人 日時:2014/07/14 00:22

非同期+SetUsePremulAlphaConvertLoad の使用の有無でフリーズが発生することがある・・・ですか ( 因みにフリーズとはエラーが発生してプログラムが強制終了すること、という認識で合っていますでしょうか? ) 手元で SetUsePremulAlphaConvertLoad( TRUE ) ; を実行した状態で非同期で読み込む というテストを10回ほど行ってみましたが、特にエラーは発生しませんでした SetUsePremulAlphaConvertLoad 周りで非同期時にエラーが発生しそうな箇所が無いかを 調べてみたのですが、怪しい箇所も無く、若干行き詰まり気味です・・・ お手数で申し訳ないのですが、よろしければ、DXライブラリのソースをだんごさんの プロジェクトに追加した状態で実行して、エラーが発生した際のソースファイル名と行番号を 教えて頂けないでしょうか? m(_ _;m もしご承諾いただけるということでしたら、お手数で申し訳ありませんが現状の最新版の ライブラリファイルを以下からダウンロードしてください ( 前回と同じURLですが、今日もまたプログラムを変更していますので、  お手数ですがもう一度ダウンロードしてください ) http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 上記のライブラリファイルに加えて、こちらのソースファイルをダウンロードしてください http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース そして、こちら↑の圧縮ファイルの中にある以下の二つのフォルダ DxLibMakeTest DxLibMakeTest\Windows の中にあるファイルを、以下のファイルを除いて全てプロジェクトに追加してください <プロジェクトに追加しないファイル> DxKeyHook.c DxUseCLib.cpp DxUseCLib.h DxUseCLibOgg.cpp DxUseCLibPhysics.cpp DxUseCStrmBaseFilter.cpp ソースをプロジェクトに追加した状態でデバッグ実行すると、DXライブラリの中で エラーが発生した場合はDXライブラリのエラーが発生したソースと行番号を 確認することができますので、お手数で申し訳ありませんがエラーが発生した際の ソースファイル名と行番号を教えてください m(_ _;m
メンテ
Re: マスク画像の拡大縮小 ( No.10 )
名前:だんごさん 日時:2014/07/14 18:34

ありがとうございます。 試してみたところ、ビルドでエラーが発生しデバッグできませんでした。 DxLib_d.lib(DxGraphicsAPIWin.obj) : error LNK2005: "struct DxLib::GRAPHICSAPIINFO_WIN DxLib::GAPIWin" (?GAPIWin@DxLib@@3UGRAPHICSAPIINFO_WIN@1@A) は既に DxGraphicsAPIWin.obj で定義されています。 という「既に定義されている」エラーが数えきれないほどと、 1>DxGraphicsFilter.obj : error LNK2019: 未解決の外部シンボル "int __cdecl DxLib::GraphFilterRectBltBase_PF(int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,char *)" (?GraphFilterRectBltBase_PF@DxLib@@YAHHHHHHHHHHHHHHHHPAD@Z) が 関数 "int __cdecl DxLib::GraphFilter(int,int,...)" (?GraphFilter@DxLib@@YAHHHZZ) で参照されました。 という「未解決の外部シンボル」エラーが15個ほど出ています。 何かリンクさせておくべきものでもございますでしょうか?
メンテ
Re: マスク画像の拡大縮小 ( No.11 )
名前:管理人 日時:2014/07/15 01:20

すみません、DxLibMakeTest.exe に含めるべきDXライブラリのソースファイル ( Windows\DxGraphicsD3D9Filter.cpp ) が抜けていました 何度も申し訳ありませんが再度こちらからソースファイルをダウンロードしてください m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe
メンテ
Re: マスク画像の拡大縮小 ( No.12 )
名前:だんごさん 日時:2014/07/15 20:00

すみません、まだビルドできずにいます。 以前書いた「既に定義されている」エラーが、恐らくDxLibの関数分すべて出ていると思います。 あと、1>DxBaseImage.obj : error LNK2001: 外部シンボル " "int __cdecl DxLib::LoadTiffImage(struct DxLib::tagSTREAMDATA *,struct DxLib::tagBASEIMAGE *)" (?LoadTiffImage@DxLib@@YAHPAUtagSTREAMDATA@1@PAUtagBASEIMAGE@1@@Z)" は未解決です。 という外部シンボルのエラーが1つ出ています。
メンテ
Re: マスク画像の拡大縮小 ( No.13 )
名前:管理人 日時:2014/07/15 22:40

すみません、説明不足だった点が一つありました DXライブラリのソースをプロジェクトに追加した場合もDXライブラリの インクルードファイルのディレクトリとライブラリファイルのディレクトリを指定する必要があるのですが、 指定しているディレクトリには最新( No.9 の DxLibVCTest.exe の中身 )のファイルがありますでしょうか?
メンテ
Re: マスク画像の拡大縮小 ( No.14 )
名前:だんごさん 日時:2014/07/15 22:58

自分の知識不足で申し訳ないです。 さて、デバッグを行ったところ原因が分かりました。 というのもまだ始めたばかりですので一概には言えませんが。 ファイル名:DxGraphicsAPIWin.cpp 行番号:1732 原因はメモリのアクセス違反です。
メンテ
Re: マスク画像の拡大縮小 ( No.15 )
名前:管理人 日時:2014/07/15 23:56

ご確認いただきありがとうございます サーフェスのロックに失敗・・・うーん・・・ 何度も申し訳ありません、よろしければエラーが発生した際の 呼び出し履歴( どの関数を経てエラーの箇所に辿り着いたか )を教えて頂けないでしょうか?
メンテ
Re: マスク画像の拡大縮小 ( No.16 )
名前:だんごさん 日時:2014/07/16 00:05

d3d9.dll!59a21704() [下のフレームは間違っているか、または見つかりません。d3d9.dll に対して読み込まれたシンボルはありません。] > soft.exe!DxLib::Direct3DSurface9_LockRect(DxLib::D_IDirect3DSurface9 * pSurface, DxLib::tagD_D3DLOCKED_RECT * pLockedRect, const tagRECT * pRect, unsigned long Flags) 行 1732 + 0x1c バイト C++ soft.exe!DxLib::Direct3DSurface9_LockRect_ASync(DxLib::D_IDirect3DSurface9 * pSurface, DxLib::tagD_D3DLOCKED_RECT * pLockedRect, const tagRECT * pRect, unsigned long Flags, int ASyncThread) 行 757 + 0x15 バイト C++ soft.exe!DxLib::BltBmpOrBaseImageToGraph3_NoMipMapBlt(DxLib::IMAGEDATA2_ORIG * Orig, const tagRECT * SrcRect, const tagRECT * DestRect, int UseSysMemSurface, DxLib::D_IDirect3DBaseTexture9 * UseTex, int TexWidth, int TexHeight, int TexUseWidth, int TexUseHeight, const DxLib::tagBASEIMAGE * RgbImage, const DxLib::tagBASEIMAGE * AlphaImage, const DxLib::tagCOLORDATA * DestColor, int RedIsAlphaFlag, int UseTransColorConvAlpha, int ASyncThread) 行 1594 + 0x30 バイト C++ soft.exe!DxLib::BltBmpOrBaseImageToGraph3_PF(const tagRECT * SrcRect, int DestX, int DestY, int GrHandle, const DxLib::tagBASEIMAGE * RgbImage, const DxLib::tagBASEIMAGE * AlphaImage, int RedIsAlphaFlag, int UseTransColorConvAlpha, int TargetOrig, int ASyncThread) 行 2110 + 0x86 バイト C++ soft.exe!DxLib::BltBmpOrBaseImageToGraph3(const tagRECT * SrcRect, int DestX, int DestY, int GrHandle, const DxLib::tagBASEIMAGE * RgbImage, const DxLib::tagBASEIMAGE * AlphaImage, int RedIsAlphaFlag, int UseTransColorConvAlpha, int TargetOrig, int ASyncThread) 行 940 + 0x33 バイト C++ soft.exe!DxLib::BltBmpOrGraphImageToGraph2Base(const DxLib::tagBASEIMAGE * RgbImage, const DxLib::tagBASEIMAGE * AlphaImage, const tagRECT * SrcRect, int DestX, int DestY, int GrHandle, int UseTransColorConvAlpha, int ASyncThread) 行 16164 + 0x2f バイト C++ soft.exe!DxLib::FontCacheCharAddToHandle(int AddNum, const char * CharData, int FontHandle) 行 2347 + 0x3c バイト C++ soft.exe!DxLib::FontCacheStringAddToHandle(int FontHandle, const char * String, int StrLen, char * DrawStrBufferP, int * DrawCharNumP) 行 1076 + 0x28 バイト C++ soft.exe!DxLib::FontCacheStringDrawToHandleST(int DrawFlag, int xi, int yi, float xf, float yf, int PosIntFlag, bool ExRateValidFlag, double ExRateX, double ExRateY, const char * StrData, int Color, DxLib::MEMIMG * DestMemImg, const tagRECT * ClipRect, int TransFlag, int FontHandle, int EdgeColor, int StrLen, int VerticalFlag, tagSIZE * DrawSize) 行 4538 + 0x1c バイト C++ soft.exe!DxLib::DrawStringHardware(int xi, int yi, float xf, float yf, int PosIntFlag, const char * String, int Color, int FontHandle, int EdgeColor, int VerticalFlag) 行 176 + 0x66 バイト C++ soft.exe!DxLib::DrawStringToHandle(int x, int y, const char * String, int Color, int FontHandle, int EdgeColor, int VerticalFlag) 行 8338 + 0x408 バイト C++
メンテ
Re: マスク画像の拡大縮小 ( No.17 )
名前:管理人 日時:2014/07/16 01:10

呼び出し履歴の貼り付けありがとうございます 頂いた情報を見る限りでは特に不自然な点は無かったので、 同じような状況を再現するようなプログラムを作成して実行してみたのですが エラーは発生しませんでした 更に細かい情報を教えて頂くという方法もあるのですが、かなり時間が掛かってしまいそうです もし不都合が無ければだんごさんさんのお手元の本件のエラーが発生するプログラムを頂けないでしょうか? 直接手元でエラーが確認できれば直ぐに原因の究明と修正をすることができると思います・・・ もしご承諾いただけるということでしたら、お手数で申し訳ありませんがこちらのメールアドレス BQE00322(あっとまーく)nifty.com ( (あっとまーく)を@に置き換えてください ) にプログラムと、プログラムの実行に必要なファイルを纏めてzip等で圧縮して送ってください m(_ _;m
メンテ
Re: マスク画像の拡大縮小 ( No.18 )
名前:だんごさん 日時:2014/07/16 18:19

分かりました。 それから他のパソコンでも同じようにフリーズを確認しました。 (No.8)>しかし、ソフトの画面が表示されるときにもたまにフリーズするのでそこは現在調査中です。 これも同様に1732行目のメモリアクセス違反だということが分かりました。
メンテ
Re: マスク画像の拡大縮小 ( No.19 )
名前:管理人 日時:2014/07/16 19:53

メールありがとうございます、私の環境でもエラーが発生しました 原因はわかっていませんが、とりあえず DxLib_Init を呼んだスレッド以外でDXライブラリの 関数を呼んだ場合の動作の保証はできませんので、一番怪しいのはその点となります ( DXライブラリ自体が複数のスレッドから同時にDXライブラリの関数が呼ばれることを  想定していないので、何が起こるかわかりません、ちょっと考えただけでも同時に実行されたら  まずそうな箇所が沢山あります・・・ ) 現在実際の動作を行うスレッドと DxLib_Init を呼ぶスレッドを別々にされていますが、 こちらを同じスレッドにすることは可能でしょうか?
メンテ
Re: マスク画像の拡大縮小 ( No.20 )
名前:だんごさん 日時:2014/07/16 20:57

同じスレッドにしました。 今のところフリーズは出ていません。 ですが、マルチスレッドにした趣旨であるシステムに取られている間にループが止まってしまう 現象は回避できませんでした。タイトルバーをドラッグしている間に止まってしまうなどです。 これは仕方がないのでしょうか…。諦めます。 最後に、恐らくプログラムを実行して分かったと思いますが、SetUseDirectDrawFlagがfalseの時は パーティクルの動画の背景が黒いのに対して、デフォルト時は少し灰色がかるのですが、これは 直りますでしょうか? 質問ばかりで大変申し訳ないです。
メンテ
Re: マスク画像の拡大縮小 ( No.21 )
名前:管理人 日時:2014/07/16 23:51

スレッドを一つにしたらフリーズがなくなりましたか・・・ 前回の書き込みの後、複数のスレッドでDXライブラリの関数を呼ぶ方法として、 DXライブラリのソースをプロジェクトに追加してコンパイルしていただいている現在の 状態でのみ使用できる手段が一つあることを思い出しました プロジェクトのプロパティの 構成プロパティ -> C/C++ -> プリプロセッサ の「プリプロセッサの定義」の箇所に DX_THREAD_SAFE を追加してください( 区切り文字はセミコロン「;」です ) これでコンパイルすると複数のスレッドで同時にDXライブラリの関数が呼ばれると 後から呼んだほうが先に呼んだ方の関数の処理が終了するまで待たされるように なるので、同時にDXライブラリの関数が実行されることはなくなります 片方が待たされている間は、そのスレッドは待つ以外のことを何もしない状態になるので 実行速度は著しく低下しますが、もしかしたらフリーズが発生することなく実行できるかもしれません 因みに、手元で久々に DX_THREAD_SAFE を有効にしてコンパイルしたところ 幾つも書式エラーが発生してしまいましたので、何度も申し訳ありませんが こちらの修正版を使用してください m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース あと最初に申し上げました通りこの方法はDXライブラリのソースを直接コンパイルする 場合のみに使用できるものですので、仮にこの方法を使用する場合は以降もずっと DXライブラリのソース( DxGraphics.cpp など )をプロジェクトに追加したままに しておいてください( そしてDXライブラリの更新時はライブラリと共にソースファイルも DxLibMakeTest.exe の中身を上書きする形で更新するようにしてください ) > 最後に、恐らくプログラムを実行して分かったと思いますが、SetUseDirectDrawFlagがfalseの時は > パーティクルの動画の背景が黒いのに対して、デフォルト時は少し灰色がかるのですが、これは > 直りますでしょうか? 私も現象を確認しました 動画はデータ容量を減らすために大抵の場合カラーフォーマットは RGB ではなく YUV なのですが、 DXライブラリでは処理の都合上描画時には RGB のフォーマットでなければならないので、 ハードウェアアクセラレーションが期待できる Direct3D9 の機能を使用して YUV カラーから RGB カラーに変換しているのですが、この処理の精度が悪いみたいです ( 若しくは何か私のやり方が間違っているか・・・ ) SetUseDirectDrawFlag( FALSE ) ; を実行している場合は Direct3D9 を利用することは 無いのでソフトウエアによる YUV カラーから RGB カラーに変換する処理を行っているのですが、 こちらは正常な変換結果が得られているみたいです、ただ、ソフトウエアで変換しているので Direct3D9 を使用する場合より処理が重いのですが・・・ というわけで、SetUseDirectDrawFlag( FALSE ) ; を実行せずに Direct3D9 を使用できる 状態でも、敢えて Direct3D9 の機能は使用せずにソフトウエアで YUV カラーから RGB カラーに 変換するようにする為の以下の関数を追加しました( 上記のURLのバージョンでは既に入っています ) // YUVフォーマットのサーフェスが使用できる場合はYUVフォーマットのサーフェスを使用するかどうかを設定する // ( TRUE:使用する( デフォルト ) FALSE:RGBフォーマットのサーフェスを使用する ) int SetMovieUseYUVFormatSurfaceFlag( int Flag ) ; この関数を、動画ファイルを読み込む前に FALSE を渡して呼べば黒い部分が 灰色になってしまう現象は解消するはずです よろしければお試しください
メンテ
Re: マスク画像の拡大縮小 ( No.22 )
名前:だんごさん 日時:2014/07/17 00:46

ありがとうございます! ですが、スレッドセーフ用のNS_GetRand関数とNS_SRand関数の中身が見つかりません。 未解決の外部シンボルとしてエラーが出ています。
メンテ
Re: マスク画像の拡大縮小 ( No.23 )
名前:管理人 日時:2014/07/17 02:39

あー、なるほど、プロジェクトに入れていない DxUseCLib.cpp なども DX_THREAD_SAFE で コンパイルする必要があったのでした・・・ただ、これらのファイルをコンパイルするには外部の ライブラリを沢山用意しなければならないので厳しいですね・・・ というわけで、DX_THREAD_SAFE を有効にしてコンパイルしたテストパッケージを作成しました こちらを DxLibVCTest.exe の中身のファイルの代わりに使ってみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest_ThreadSafe.exe // VisualC++ 用
メンテ
Re: マスク画像の拡大縮小 ( No.24 )
名前:だんごさん(解決) 日時:2014/07/17 22:05

ちゃんと動きました! 動画の件もきちんと表示されています。 今のところフリーズも起きていません。 本当にありがとうございました!
メンテ

Page: 1 | 2 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存