トップページ > 記事閲覧
マスク画像の縮小について
名前:Tir 日時: 2019/08/19 18:33

今まで高解像度版と通常解像度でサイズ違いの画像を2種類用意していたのですが流石に大変になってきたので内部で縮小する事にしたのですが 通常のグラフィックは以下の処理で半分にすることができましたがプログラム的に問題はないでしょうか? またマスク画像を内部で縮小する事は可能でしょうか? //画像を半分のサイズにする処理 int ScaleDownHD(int *handle) { //高解像度だったら終了 if (Game->HDVer == 2) return 0; int TempGraph; int x, y; //オリジナルのサイズを取得 GetGraphSize(*handle,&x,&y); x /= 2; y /= 2; //半分のサイズの画像を作成 TempGraph = MakeScreen(x , y ,true); SetDrawScreen(TempGraph); SetDrawMode((DX_DRAWMODE_BILINEAR)); DrawExtendGraph(0, 0, x, y , *handle, true); //オリジナルのサイズを消去 DeleteGraph(*handle); SetDrawScreen(Game->GameScreen); *handle= TempGraph; return 0; }
メンテ

Page: 1 |

Re: マスク画像の縮小について ( No.1 )
名前:管理人 日時:2019/08/19 23:25

> 通常のグラフィックは以下の処理で半分にすることができましたがプログラム的に問題はないでしょうか? 丁度2分の1のサイズの画像を作成するのでしたら、DrawExtendGraph ではなく GraphFilterBlt の DX_GRAPH_FILTER_DOWN_SCALEフィルターを使用する方が綺麗な画像を作成できます SetDrawScreenも使用する必要が無くなるので以下のようにコード量も減らせます //画像を半分のサイズにする処理 int ScaleDownHD(int *handle) { //高解像度だったら終了 if (Game->HDVer == 2) return 0; int TempGraph; int x, y; //オリジナルのサイズを取得 GetGraphSize(*handle,&x,&y); x /= 2; y /= 2; //半分のサイズの画像を作成 TempGraph = MakeScreen(x , y ,true); GraphFilterBlt(*handle, TempGraph, DX_GRAPH_FILTER_DOWN_SCALE, 2); //オリジナルのサイズを消去 DeleteGraph(*handle); *handle= TempGraph; return 0; } > またマスク画像を内部で縮小する事は可能でしょうか? マスク画像は現状画像の情報を取得する手段が無いので、ScaleDownHDのように マスクハンドルから縮小マスクハンドルを作成することはできません 以下のようにマスクハンドルを作成する際に使用した画像ファイルを使用する方法なら現状でも可能です ( 戻り値が半分サイズに縮小されたマスクのハンドルとなります ) int ScaleDownHDMask( const char *FilePath ) { int TempGraph; int x, y; int handle; int MaskHandle; BASEIMAGE BaseImage; //透過色は使用しない設定にする SetUseTransColor( FALSE ); //マスクとして使用する画像を読み込み handle = LoadGraph( FilePath ); //オリジナルのサイズを取得 GetGraphSize( handle, &x, &y ); //半分のサイズの画像を作成 x /= 2; y /= 2; TempGraph = MakeScreen( x , y ,true ); //半分のサイズに縮小して転送 GraphFilterBlt( handle, TempGraph, DX_GRAPH_FILTER_DOWN_SCALE, 2 ); //半分のサイズのソフトウェア画像を作成 CreateARGB8ColorBaseImage( x, y, &BaseImage ); //ソフトウェア画像に縮小した画像を取得 int DrawScreen = GetDrawScreen() ; // 描画先を取得 SetDrawScreen( TempGraph ); // 描画先を半分のサイズの画像に変更 GetDrawScreenBaseImage( 0, 0, x, y, &BaseImage ); // 半分のサイズの画像からソフトウェア画像に転送 SetDrawScreen( DrawScreen ) ; // 描画先を元に戻す //半分のサイズのマスクハンドルを作成 MaskHandle = MakeMask( x, y ); //マスクハンドルに縮小した画像を転送 GraphImageBltToMask( &BaseImage, 0, 0, MaskHandle ); //ソフトウェア画像の後始末 ReleaseBaseImage( &BaseImage ); //オリジナルのサイズの画像と半分のサイズの画像を削除 DeleteGraph( handle ); DeleteGraph( TempGraph ); //マスクハンドルを返す return MaskHandle; }
メンテ
Re: マスク画像の縮小について ( No.2 )
名前:管理人 日時:2019/08/20 00:38

マスクハンドルからソフトウェア画像情報を取得するための関数を追加することが容易だったので、 そのための関数 GetMaskBaseImageInfo を追加して、マスクハンドルについてもマスクハンドルから 縮小されたマスクハンドルを作成できるようにしてみました 関数 GetMaskBaseImageInfo を追加したバージョンをアップしましたので、よろしければ ダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.2 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.zip // Android版 ARM用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM64.zip // Android版 ARM64用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.zip // Android版 x86用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x64.zip // Android版 x64用 https://dxlib.xsrv.jp/temp/DxLibiOSTest.zip // iOS版 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) 以下の関数を追加しました // マスクハンドルが持つマスクイメージのBASEIMAGEデータを取得する int GetMaskBaseImageInfo( BASEIMAGE *BaseImage, int MaskHandle ) ; この関数を使用して作り直した ScaleDownHDMask は以下のようになります int ScaleDownHDMask( int *handle ) { int TempGraph1; int TempGraph2; int x, y; int TempMaskHandle; BASEIMAGE ScaleDownBaseImage; BASEIMAGE MaskBaseImage; //マスクハンドルのソフトウェア画像情報を取得する GetMaskBaseImageInfo( &MaskBaseImage, *handle ); //ソフトウェア画像情報からグラフィックハンドルを作成 TempGraph1 = CreateGraphFromBaseImage( &MaskBaseImage ); //半分のサイズの画像を作成 x = MaskBaseImage.Width; y = MaskBaseImage.Height; TempGraph2 = MakeScreen( x , y ,true ); //半分のサイズに縮小して転送 GraphFilterBlt( TempGraph1, TempGraph2, DX_GRAPH_FILTER_DOWN_SCALE, 2 ); //半分のサイズのソフトウェア画像を作成 CreateARGB8ColorBaseImage( x, y, &ScaleDownBaseImage ); //ソフトウェア画像に縮小した画像を取得 int DrawScreen = GetDrawScreen() ; // 描画先を取得 SetDrawScreen( TempGraph2 ); // 描画先を半分のサイズの画像に変更 GetDrawScreenBaseImage( 0, 0, x, y, &ScaleDownBaseImage ); // 半分のサイズの画像からソフトウェア画像に転送 SetDrawScreen( DrawScreen ) ; // 描画先を元に戻す //半分のサイズのマスクハンドルを作成 TempMaskHandle = MakeMask( x, y ); //マスクハンドルに縮小した画像を転送 GraphImageBltToMask( &ScaleDownBaseImage, 0, 0, TempMaskHandle ); //半分サイズのソフトウェア画像の後始末 ReleaseBaseImage( &ScaleDownBaseImage ); //オリジナルサイズのマスクハンドルを削除 DeleteMask( *handle ); //半分サイズのマスクハンドルを保存 *handle = TempMaskHandle; //オリジナルのサイズの画像と半分のサイズの画像を削除 DeleteGraph( TempGraph1 ); DeleteGraph( TempGraph2 ); return 0; }
メンテ
Re: マスク画像の縮小について ( No.3 )
名前:Tir(解決) 日時:2019/08/20 09:40

改善方法及び関数の追加本当にありがとうございます 無事に通常画像とマスク画像の縮小に成功しました
メンテ

Page: 1 |

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

   クッキー保存