トップページ > 記事閲覧
画像を2つ重ねて表示する方法
名前:nic1904 日時: 2016/10/03 15:43

ある画像(jpeg形式)に、透過した画像(png形式)を重ね、それを表示するプログラムを作りたいと思っています。 どのような関数を使えばいいでしょうか。 また、重ねた状態のものを1つの画像として保存する方法も教えていただきたいです。
メンテ

Page: 1 |

Re: 画像を2つ重ねて表示する方法 ( No.1 )
名前:s8079 日時:2016/10/03 23:07

状況が分かりづらいので的確な回答をできかねますが, 画像を重ねるだけであれば単純に描画関数を2回呼び出せば良いと思います。 保存するにはSaveDrawScreenという便利な関数があります。
メンテ
Re: 画像を2つ重ねて表示する方法 ( No.2 )
名前:たろう 日時:2016/10/04 01:15

自分で使っているプログラムの切り抜きサンプルです よかったら改造して使って下さい。 乗算済みアルファの理解が必要ですが、それについては ttp://dxlib.o.oo7.jp/lecture/PremulAlpha/PremulAlpha.html ・・・に解説があります。 #include "DxLib.h" int 画像合体(int 画1,int 画2) { int 完成画像,横,縦; GetGraphSize( 画1,&横,&縦 ); 完成画像=MakeScreen( 横,縦,TRUE); SetDrawScreen(完成画像); DrawGraph( 0, 0, 画1, TRUE); DrawGraph( 0, 0, 画2, TRUE); SetDrawScreen( DX_SCREEN_BACK ); return 完成画像; } void PNG画像作成(int 画像) { int 完成画像,横,縦; GetGraphSize( 画像,&横,&縦 ); 完成画像=MakeScreen( 横,縦,TRUE); SetDrawScreen(完成画像); GraphFilter( 画像, DX_GRAPH_FILTER_INTERP_ALPHA) ;//非乗算済みアルファに変換 DrawGraph( 0, 0, 画像, TRUE); SaveDrawScreenToPNG(0, 0, 横, 縦, "00.png", 0); SetDrawScreen( DX_SCREEN_BACK ); GraphFilter( 画像, DX_GRAPH_FILTER_PREMUL_ALPHA) ;//乗算済みアルファに戻す DeleteGraph(完成画像);; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GrHandle1,GrHandle2,GrHandle3 ; ChangeWindowMode( TRUE );// ウインドウモードで起動 SetGraphMode( 400, 200, 32 ) ;// 画面サイズを400x200にする if( DxLib_Init() < 0 ) return -1;// DXライブラリの初期化 SetUsePremulAlphaConvertLoad( TRUE ) ;//乗算済みアルファ画像として読み込むように切替 SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 ) ;//乗算済みアルファ画像用のαブレンドの設定にする GrHandle1 = LoadGraph( "AlphaTest1.png" ) ;// 画像の読み込み GrHandle2 = LoadGraph( "AlphaTest2.png" ) ;// 画像の読み込み if( GrHandle1>= 0 && GrHandle2>= 0)// 読み込みに成功した場合のみ処理を実行 { GrHandle3=画像合体(GrHandle1,GrHandle2); if( GrHandle3>= 0)PNG画像作成(GrHandle3); } SetDrawScreen( DX_SCREEN_BACK ) ; DrawGraph( 0, 0, GrHandle3, TRUE ) ; ScreenFlip() ; WaitKey() ;// キー入力待ち DxLib_End(); return 0; }
メンテ
Re: 画像を2つ重ねて表示する方法 ( No.3 )
名前:nic1904 日時:2016/10/04 15:58

> s8079 さん > たろう さん 返信ありがとうございます。御二方の方法を試してみたところ、両方ともできることが確認できました。 ただ、2つの画像のサイズがもともと違っているため、重ねたときに一方が小さく一方が大きい状態で出力されてしまいます。 画像サイズを2つとも同じ大きさにそろえた上で合成を行うには、どうすればいいのでしょうか。 プログラムで、読み込む画像のサイズをかえる関数か何かがあったらぜひ教えてほしいです。 繰り返し質問になってしまい申しわけありませんが、お願いします。
メンテ
Re: 画像を2つ重ねて表示する方法 ( No.4 )
名前:たろう 日時:2016/10/04 17:55

DrawGraphの代わりにDrawRotaGraph2やDrawExtendGraphを使うと大きさを変更できます。 ↓DrawRotaGraph2を使った場合。 #include "DxLib.h" int 画像合体(int 画1=-1,double 倍率1=1.0,int 画2=-1,double 倍率2=1.0)//合体する画像と倍率を指定 { int 完成画像,横1,縦1,横2,縦2; GetGraphSize( 画1,&横1,&縦1 );横1*=倍率1;縦1*=倍率1; GetGraphSize( 画2,&横2,&縦2 );横2*=倍率2;縦2*=倍率2; if(横1<横2){横1=横2;} if(縦1<縦2){縦1=縦2;} 完成画像=MakeScreen( 横1,縦1,TRUE); SetDrawScreen(完成画像); DrawRotaGraph2( 0, 0, 0, 0, 倍率1, 0, 画1, TRUE, FALSE ) ; DrawRotaGraph2( 0, 0, 0, 0, 倍率2, 0, 画2, TRUE, FALSE ) ; SetDrawScreen( DX_SCREEN_BACK ); return 完成画像; } void PNG画像作成(int 画像) { int 完成画像,横,縦; GetGraphSize( 画像,&横,&縦 ); 完成画像=MakeScreen( 横,縦,TRUE); SetDrawScreen(完成画像); GraphFilter( 画像, DX_GRAPH_FILTER_INTERP_ALPHA) ;//非乗算済みアルファに変換 DrawGraph( 0, 0, 画像, TRUE); SaveDrawScreenToPNG(0, 0, 横, 縦, "00.png", 0); SetDrawScreen( DX_SCREEN_BACK ); GraphFilter( 画像, DX_GRAPH_FILTER_PREMUL_ALPHA) ;//乗算済みアルファに戻す DeleteGraph(完成画像);; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GrHandle1,GrHandle2,GrHandle3 ; ChangeWindowMode( TRUE );// ウインドウモードで起動 SetGraphMode( 400, 200, 32 ) ;// 画面サイズを400x200にする if( DxLib_Init() < 0 ) return -1;// DXライブラリの初期化 SetUsePremulAlphaConvertLoad( TRUE ) ;//乗算済みアルファ画像として読み込むように切替 SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 ) ;//乗算済みアルファ画像用のαブレンドの設定にする GrHandle1 = LoadGraph( "AlphaTest1.png" ) ;// 画像の読み込み GrHandle2 = LoadGraph( "AlphaTest2.png" ) ;// 画像の読み込み if( GrHandle1>= 0 && GrHandle2>= 0)// 読み込みに成功した場合のみ処理を実行 { GrHandle3=画像合体(GrHandle1 ,1.0 ,GrHandle2 , 2.5); if( GrHandle3>= 0)PNG画像作成(GrHandle3); } SetDrawScreen( DX_SCREEN_BACK ) ; DrawGraph( 0, 0, GrHandle3, TRUE ) ; ScreenFlip() ; WaitKey() ;// キー入力待ち DxLib_End(); return 0; }
メンテ
Re: 画像を2つ重ねて表示する方法 ( No.5 )
名前:nic1904 日時:2016/10/05 13:25

> たろう さん やってみたのですが、 合成後の画像のサイズが、合わせる画像のサイズにかわるだけで、 2つの画像がぴったり合わさるようにはなりませんでした。 プログラム実行後の画像は、画像1に画像2の一部分だけが重なっている状態です。 画像1より画像2の方がサイズが大きく、画像1のサイズに合わせて画像2のサイズも変えたいのです。 何回も質問してしまい、申し訳ありません。
メンテ
Re: 画像を2つ重ねて表示する方法 ( No.6 )
名前:たろう 日時:2016/10/05 17:10

画像合体()を変更すればかんたんに出来ます。 ↓DrawExtendGraphを使った場合。 #include "DxLib.h" int 画像合体(int 画1=-1,int 画2=-1)//合体する画像と倍率を指定 { int 完成画像,横,縦; GetGraphSize( 画1,&横,&縦 ); 完成画像=MakeScreen( 横,縦,TRUE); SetDrawScreen(完成画像); DrawGraph( 0, 0, 画1, TRUE ) ; DrawExtendGraph( 0, 0, 横, 縦, 画2 ,TRUE ) ; SetDrawScreen( DX_SCREEN_BACK ); return 完成画像; } void PNG画像作成(int 画像) { int 完成画像,横,縦; GetGraphSize( 画像,&横,&縦 ); 完成画像=MakeScreen( 横,縦,TRUE); SetDrawScreen(完成画像); GraphFilter( 画像, DX_GRAPH_FILTER_INTERP_ALPHA) ;//非乗算済みアルファに変換 DrawGraph( 0, 0, 画像, TRUE); SaveDrawScreenToPNG(0, 0, 横, 縦, "00.png", 0); SetDrawScreen( DX_SCREEN_BACK ); GraphFilter( 画像, DX_GRAPH_FILTER_PREMUL_ALPHA) ;//乗算済みアルファに戻す DeleteGraph(完成画像);; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GrHandle1,GrHandle2,GrHandle3 ; ChangeWindowMode( TRUE );// ウインドウモードで起動 SetGraphMode( 400, 200, 32 ) ;// 画面サイズを400x200にする if( DxLib_Init() < 0 ) return -1;// DXライブラリの初期化 SetUsePremulAlphaConvertLoad( TRUE ) ;//乗算済みアルファ画像として読み込むように切替 SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 ) ;//乗算済みアルファ画像用のαブレンドの設定にする GrHandle1 = LoadGraph( "AlphaTest1.png" ) ;// 画像の読み込み GrHandle2 = LoadGraph( "AlphaTest2.png" ) ;// 画像の読み込み if( GrHandle1>= 0 && GrHandle2>= 0)// 読み込みに成功した場合のみ処理を実行 { GrHandle3=画像合体( GrHandle1 ,GrHandle2 ); if( GrHandle3>= 0)PNG画像作成( GrHandle3 ); } SetDrawScreen( DX_SCREEN_BACK ) ; DrawGraph( 0, 0, GrHandle3, TRUE ) ; ScreenFlip() ; WaitKey() ;// キー入力待ち DxLib_End(); return 0; }
メンテ
Re: 画像を2つ重ねて表示する方法 ( No.7 )
名前:nic1904 日時:2016/10/06 09:48

> たろう さん ご回答の通りにやったら、うまくいきました! ここまで、ご丁寧に対応していただき、本当にありがとうございました!
メンテ

Page: 1 |

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

   クッキー保存