Re: 画像と画像の一部をブレンド ( No.1 ) |
- 名前:管理人 日時:2022/02/15 01:02
GraphBlendRectBlt ではブレンドする画像の範囲を指定することができるので、
こちらを使用すれば分割画像を作成しなくても画像と画像の一部をブレンドすることができます
int GraphBlendRectBlt(
int SrcGrHandle, int BlendGrHandle, int DestGrHandle,
int SrcX1, int SrcY1, int SrcX2, int SrcY2,
int BlendX, int BlendY,
int DestX, int DestY,
int BlendRatio, int BlendType, ... ) ;
<GraphBlendRectBlt>
https://dxlib.xsrv.jp/function/dxfunc_graph1.html#R3N31
よろしければお使いください m(_ _)m
|
Re: 画像と画像の一部をブレンド ( No.2 ) |
- 名前:名無三 日時:2022/02/15 23:28
すいません、それでは画像の一部と画像のブレンドになるのではないでしょうか?
小さい画像に大きい画像の中の任意の矩形範囲をブレンドできればと思うのですが…
|
Re: 画像と画像の一部をブレンド ( No.3 ) |
- 名前:管理人 日時:2022/02/16 00:04
> すいません、それでは画像の一部と画像のブレンドになるのではないでしょうか?
画像( SrcGrHandle )の一部と画像( BlendGrHandle )の一部のブレンドになります
( BlendX=0 BlendY=0 で SrcX2 - SrcX1 と SrcY2 - SrcY1 のサイズが BlendGrHandle のサイズと一致する場合は
画像の一部( SrcGrHandle の一部 )と画像全体( BlendGrHandle )のブレンドになりますが… )
> 小さい画像に大きい画像の中の任意の矩形範囲をブレンドできればと思うのですが…
はい、それができるのが GraphBlendRectBlt です
具体的に使用する場合は GetFloor_BlendShadow は以下のように書き換えられると思います
auto& GetFloor_BlendShadow(const Vector2D_I& _p1, const Vector2D_I& _p2, GraphHandle* _handle) noexcept {
int SrcX1 = std::max(0, _p1.x);
int SrcY1 = std::max(0, _p1.y);
GraphBlendRectBlt(
m_shadow_graph.get(), _handle->get(), g, m_res_floor.get(),
SrcX1, SrcY1, SrcX1 + std::min(m_DrawPts->disp_x, _p2.x - _p1.x), SrcY1 + std::min(m_DrawPts->disp_y, _p2.y - _p1.y),
0, 0, // BlendX, BlendY
0, 0, // DestX, DestY
128, DX_GRAPH_BLEND_NORMAL );
return m_res_floor;
}
|
Re: 画像と画像の一部をブレンド ( No.4 ) |
- 名前:名無三 日時:2022/02/16 22:43
サンプルプログラムで動くようにしてみましたがやはりそれでは同じ描画結果が得られないのではないでしょうか…?
実行結果のスクショはこちらです。下の2枚が比較したものです。
https://drive.google.com/file/d/1O84i_oKLNLHULVDrk92Jf3oF8rf8Xa_H/view?usp=sharing
#define NOMINMAX
#include <algorithm>
#include "DxLib.h"
struct Vector2D_I
{
int x;
int y;
};
int DestHandle;
//床面に影をブレンド
auto& GetFloor_BlendShadow(const Vector2D_I& _p1, const Vector2D_I& _p2, int _handle, int _handle2) noexcept {
int SrcX1 = std::max(0, _p1.x);
int SrcY1 = std::max(0, _p1.y);
GraphBlendRectBlt(
_handle,
_handle2,
DestHandle,
SrcX1, SrcY1,
SrcX1 + std::min(640, _p2.x - _p1.x), SrcY1 + std::min(480, _p2.y - _p1.y),
0, 0, // BlendX, BlendY
0, 0, // DestX, DestY
128, DX_GRAPH_BLEND_NORMAL);
return DestHandle;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
int SrcHandle;
int BlendHandle;
// DXライブラリの初期化
if (DxLib_Init() < 0)
return -1;
DrawBox(0, 0, 640, 480, GetColor(0, 255, 0), TRUE);
// 画像を読み込む
SrcHandle = LoadGraph("Src1.bmp");
// ブレンドする画像を読み込む
BlendHandle = LoadGraph("Src2.tga");
// 出力先のグラフィックハンドルを作成する
DestHandle = MakeScreen(128, 128, TRUE);
// Handle と BlendHandle で覆い焼き合成を行う
GraphBlendRectBlt(
SrcHandle,
BlendHandle,
DestHandle,
128, 128, 256, 256,
0, 0,
0, 0,
255, DX_GRAPH_BLEND_DODGE);
// 合成後の画像を画面に描画
DrawGraph(50, 50, SrcHandle, TRUE);
DrawGraph(250, 50, BlendHandle, TRUE);
DrawGraph(450, 50, DestHandle, TRUE);
Vector2D_I P1,P2;
P1.x = 0;
P1.y = 0;
P2.x = 128;
P2.y = 128;
DrawGraph(250, 250, GetFloor_BlendShadow(P1, P2, SrcHandle, BlendHandle), TRUE);
DrawGraph(450, 250, GetFloor_BlendShadow(P1, P2, BlendHandle, SrcHandle), TRUE);
// 読み込んだ画像のグラフィックハンドルを削除
DeleteGraph(SrcHandle);
DeleteGraph(BlendHandle);
// MakeScreen で作成したグラフィックハンドルの削除
DeleteGraph(DestHandle);
// キー入力待ち
WaitKey();
// DXライブラリの後始末
DxLib_End();
return 0;
}
 |
Re: 画像と画像の一部をブレンド ( No.5 ) |
- 名前:管理人 日時:2022/02/17 05:35
載せていただいたプログラムの結果がどのようになれば名無三さんの意図した結果なのかは
分かりませんが、とりあえず GetFloor_BlendShadow の中身を以下のように変更しても
載せていただいたプログラムと同じ描画結果になりました
auto& GetFloor_BlendShadow(const Vector2D_I& _p1, const Vector2D_I& _p2, int _handle, int _handle2) noexcept {
int SrcX1 = std::max(0, _p1.x);
int SrcY1 = std::max(0, _p1.y);
int g = DerivationGraph(
SrcX1, SrcY1,
SrcX1 + std::min(640, _p2.x - _p1.x), SrcY1 + std::min(480, _p2.y - _p1.y),
_handle2 );
GraphBlendBlt(_handle, g, DestHandle, 128, DX_GRAPH_BLEND_NORMAL);
DeleteGraph(g);
return DestHandle;
}
これはつまり
DerivationGraph -> GraphBlendBlt -> DeleteGraph
の3関数を呼ばなければならないところを
GraphBlendRectBlt
の1関数の呼び出しで済むことができている
( ”チップごとに分割画像を作ってブレンドしたら削除するプロセスをせずとも画像と画像の一部をブレンドできている” )
ということだと思うのですが、そうではないのでしょうか?
|
Re: 画像と画像の一部をブレンド ( No.6 ) |
- 名前:名無三 日時:2022/02/17 22:46
GraphBlendBlt(SrcHandle, BlendHandle, DestHandle, 128, DX_GRAPH_BLEND_NORMAL);
と
GraphBlendBlt(BlendHandle, SrcHandle, DestHandle, 128, DX_GRAPH_BLEND_NORMAL);
の結果は違いますのでそれでは同じ結果を得ることができないです…
GraphBlendRectBltのBlendGrHandle左上、右下指定版があればと思います。
やりたいことは
マップチップ1枚1枚に対して、ディスプレイサイズで作成した影画像の一部をブレンドするというものです。
|
Re: 画像と画像の一部をブレンド ( No.7 ) |
- 名前:管理人 日時:2022/02/19 01:54
すみません、やっと状況が理解できました
ブレンドしたい『分割画像』と『画像の一部』の大きさが同じものだと勘違いしていました
( あと GraphBlendBlt で SrcGrHandle と BlendGrHandle の大きさが異なる場合の挙動についても失念していました )
GraphBlendRectBlt の BlendGrHandle の左上、右下指定版の関数を追加しましたので、
よろしければこちらをダウンロードしてください
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.3 用
https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用
https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用
https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース
(中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
以下の関数を追加しました
// 二つの画像をブレンドして結果を指定の画像に出力する( 矩形指定、ブレンド画像も矩形指定 )
int GraphBlendRectBlt2( int SrcGrHandle, int BlendGrHandle, int DestGrHandle, int SrcX1, int SrcY1, int SrcX2, int SrcY2, int BlendX1, int BlendY1, int BlendX2, int BlendY2, int DestX, int DestY, int BlendRatio , int BlendType , ... ) ;
GraphBlendRectBlt に BlendX2 と BlendY2 を追加しただけの関数です
よろしければお試しください m(_ _)m
 |
Re: 画像と画像の一部をブレンド ( No.8 ) |
- 名前:名無三(解決) 日時:2022/02/20 00:35
ありがとうございます。すいません、こちらもうまく説明できませんでした…
|
|