ページ 11

背景透過のPNGの描画

Posted: 2009年9月04日(金) 22:02
by ととろ
なぜかキャラの周りの白い部分(背景)まで四角く描画されてしまうので、GIMPというツールを使って白い背景を透過(α値を0に)しました。しかし(DX_BLENDMODE_ALPHA,?)で第二引数に値を入れますよね
α値を0にすると背景は透過されるがキャラも透過される。
α値を255にすると背景が白く残る。

背景のα値を0に、キャラのα値を255にして描画する方法ってありますか?
そうでなくても背景が透過できればどういう方法でもいいのですが

Re:背景透過のPNGの描画

Posted: 2009年9月04日(金) 22:29
by kazuoni
SetTransColor
を使用すれば解決するかと思います。

ちなみに、ブレンドモードは画像全体に効果をかけるものです。

Re:背景透過のPNGの描画

Posted: 2009年9月04日(金) 22:34
by 560
質問の意図を勘違いしましたので編集しました。すみません。

Re:背景透過のPNGの描画

Posted: 2009年9月04日(金) 23:26
by Justy
[color=#d0b0c0" face="monospace]
>背景のα値を0に、キャラのα値を255にして描画する方法
[/color]

 DrawGraph()などの関数を使う時、引数 TransFlagを TRUEにしていますか?
 その素材には本当にアルファチャンネルが含まれていますか?

 もし、していてもそうなるのであれば、再現できるその素材とサンプルコードを
提示してもらえれば何かわかるかもしれません。

Re:背景透過のPNGの描画

Posted: 2009年9月05日(土) 00:30
by ととろ
>  もし、していてもそうなるのであれば、再現できるその素材とサンプルコードを
> 提示してもらえれば何かわかるかもしれません。

素材は透過したい画像でいいのでしょうか?

Re:背景透過のPNGの描画

Posted: 2009年9月05日(土) 00:33
by ととろ
ちなみにαチャンネルはちゃんと入っていてtransもTRUEになっています。

Re:背景透過のPNGの描画

Posted: 2009年9月05日(土) 00:34
by Justy
[color=#d0b0c0" face="monospace]
>素材は透過したい画像でいいのでしょうか?
[/color]

 ええ、透過処理済みの画像を。

Re:背景透過のPNGの描画

Posted: 2009年9月05日(土) 00:43
by Justy
[color=#d0b0c0" face="monospace]
>ちなみにαチャンネルはちゃんと入っていてtransもTRUEになっています
[/color]

 だとすると、DxLib_Init()より前に
[color=#d0d0ff" face="monospace]
SetNotUse3DFlag(TRUE);
[/color]

とか或いは
[color=#d0d0ff" face="monospace]
SetUseDirectDrawFlag(FALSE);
SetNotUse3DFlag(TRUE);
[/color]

とかするとどうなりますか?


[color=#d0b0c0" face="monospace]
>キャラの周りの白い部分
[/color]

 あれ? ひょっとして、キャラの周囲の1ピクセル前後だけ、の話しだったりします?

Re:背景透過のPNGの描画

Posted: 2009年9月05日(土) 01:24
by ととろ
>ちなみにαチャンネルはちゃんと入っていてtransもTRUEになっています

 だとすると、DxLib_Init()より前に

SetNotUse3DFlag(TRUE);

とか或いは

SetUseDirectDrawFlag(FALSE);
SetNotUse3DFlag(TRUE);

とかするとどうなりますか?


特に透過できませんでした。


>キャラの周りの白い部分

 あれ? ひょっとして、キャラの周囲の1ピクセル前後だけ、の話しだったりします?


いいえ。キャラを除いてロードした画像サイズの背景が白で描画されます

Re:背景透過のPNGの描画

Posted: 2009年9月05日(土) 01:28
by ととろ
すみません。あと透過した画像は東方本家のものだったりするので多分掲載はだめ、でしょうね。
GIMPなどのツールでαチャンネル追加、背景を選択、削除したのでおそらく透過できていると思いますが。

Re:背景透過のPNGの描画

Posted: 2009年9月05日(土) 01:54
by Justy
[color=#d0b0c0" face="monospace]
>GIMPなどのツールでαチャンネル追加、背景を選択、削除したのでおそらく透過できていると思いますが
[/color]

 その画像ファイル(多分 PNG?)をあらためて GIMPに読み込ませてアルファチャンネルが
入っているかどうかで確認できますよ。

 その上で、画像ファイルに問題がなければ以下のコードを実行してみて下さい。
[color=#d0d0ff" face="monospace]#include "DxLib.h"

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int)
{
ChangeWindowMode(TRUE);
if(DxLib_Init() < 0) return -1;
SetDrawScreen(DX_SCREEN_BACK);

int image = LoadGraph("******.png");
if(image == -1) return -1;

int graphSizeX, graphSizeY;
GetGraphSize(image, &graphSizeX, &graphSizeY);

int alpha = 0, offset = 5;
while(ProcessMessage() != -1)
{
char Key[256];
GetHitKeyStateAll( Key );
if(Key[ KEY_INPUT_ESCAPE ])
break;

ClearDrawScreen();
SetBackgroundColor(50, 50, 70);

int blendMode, blendParam;
GetDrawBlendMode(&blendMode, &blendParam);
SetDrawBlendMode(DX_BLENDMODE_ALPHA, alpha);

alpha += offset;
if(alpha > 255)
{
alpha = 255;
offset = -offset;
}
else
if(alpha < 0)
{
alpha = 0;
offset = -offset;
}

DrawGraph((DEFAULT_SCREEN_SIZE_X-graphSizeX)/2,
(DEFAULT_SCREEN_SIZE_Y-graphSizeY)/2, image , TRUE);

SetDrawBlendMode(blendMode, blendParam);
ScreenFlip();
}

DxLib_End();
return 0;
}
[/color]

 これは読み込んだ画像ファイル(******.png)をアルファ値が0~255に変化させながら
表示するものです。

 このプログラムでその画像ファイルを読み込ませて(******の部分は書き換えて)試しても、
同様にうまくいかないとなると、ちょっと厄介です……。

Re:背景透過のPNGの描画

Posted: 2009年9月06日(日) 00:36
by ととろ
ちょっと道それますが、
GIMPで
αチャンネル追加、背景を選択、削除。
削除した部分は縞模様になり色もなくなりますけど、
それでα値が0になったことになったのでしょうか

Re:背景透過のPNGの描画

Posted: 2009年9月06日(日) 03:57
by Dixq (管理人)
そうですね。それで保存すれば透過されるはずですが・・。

Re:背景透過のPNGの描画

Posted: 2009年9月06日(日) 16:40
by ととろ
何を試してみてもだめなようです。
GIMPでもっとじっくり調べてみます