はじめまして。
高校時代、C言語を覚えて1年目くらいの大学生です。
どうしても解決方法がわからなかったので、初めてですが、電子掲示板で質問をさせていただきます。
DXライブラリによるゲーム制作を行っているのですが、どうしてもロードした画像の透過処理ができません。
image = LoadGraphScreen( 0 , 0 , "test.bmp" , TRUE ) ;
だと、test.bmp_aを読み取り、DrawGraph関数で描写させたとき、思い通りに透過処理が行われるのですが、
image = LoadGraphScreen( 0 , 0 , "test.png" , TRUE ) ;
に変えると、なぜか透過処理が行われません。(透過処理を行わないまま描写されます。)
いろいろためしてみたのですが、どうしても原因がつかめません。
test.bmpは思い通りに透過処理が行われたので、プログラムにミスはないはずですが・・・。
ちなみに、上と下の違いは同じサイズで同じ画像、「test」のファイル形式がbmpかpngかの違いです。
フォルダの中にはtest.bmp、test_a.bmp 、 test.png、test_a.png があります。
コンパイルしたときに、エラーはありません。
いったいなぜなのでしょうか・・・。
OS:Windows7
画像作成:ペイント
開発環境:Visual C++ 2008 Express Edition
知識:C言語入門書を一冊(全ページを)読んだレベル。pngとbmpの違いが(容量が軽いくらいしか・・・)わからない。絵に関する知識は0に等しい。
透過処理がうまくいきません;
Re:透過処理がうまくいきません;
LoadGraphScreen関数はファイルを読み込んで、直接画面に描画する関数です。
ですので、image = LoadGraphScreen( 0 , 0 , "test.bmp" , TRUE ) ;では
直接画面に描画しており、メモリに画像を読み込んでいるわけではありません。
DrawGraph関数はメモリに読み込んだ画像を画面に描画する関数です。
DrawGraph関数は以下のようにLoadGraph関数で画像を読み込み、
そのグラフィックハンドルを引数に設定し描画を行います。
int GHandle;
GHandle = LoadGraph( "test1.bmp" ) ;
// 読みこんだグラフィックを画面左上に描画
DrawGraph( 0 , 0 , GHandle , TRUE ) ;
一度作り直してみて下さい。
追記:
すいません。全然関係ないこと言ってるかもしれません。
全然関係無いようだったらスルーして下さい。。。
ですので、image = LoadGraphScreen( 0 , 0 , "test.bmp" , TRUE ) ;では
直接画面に描画しており、メモリに画像を読み込んでいるわけではありません。
DrawGraph関数はメモリに読み込んだ画像を画面に描画する関数です。
DrawGraph関数は以下のようにLoadGraph関数で画像を読み込み、
そのグラフィックハンドルを引数に設定し描画を行います。
int GHandle;
GHandle = LoadGraph( "test1.bmp" ) ;
// 読みこんだグラフィックを画面左上に描画
DrawGraph( 0 , 0 , GHandle , TRUE ) ;
一度作り直してみて下さい。
追記:
すいません。全然関係ないこと言ってるかもしれません。
全然関係無いようだったらスルーして下さい。。。

Re:透過処理がうまくいきません;
>なぜか透過処理が行われません
test.pngがアルファチャンネル付のフォーマットになっている可能性があります。
アルファチャンネルを含まない画像に保存しなおしてみて下さい。
test.pngがアルファチャンネル付のフォーマットになっている可能性があります。
アルファチャンネルを含まない画像に保存しなおしてみて下さい。
Re:透過処理がうまくいきません;
> KOZASTさん
はじめまして。
では最初にbmpとpngの違いから整理してみましょう。
とりあえず解らない事があればググれば大抵解決します。
png
http://www.google.co.jp/search?hl=ja&q=png&lr=lang_ja
bmp
http://www.google.co.jp/search?hl=ja&lr ... =&gs_rfai=
画像 種類
http://www.google.co.jp/search?hl=ja&tb ... =&gs_rfai=
画像 形式
http://www.google.co.jp/search?hl=ja&lr ... =&gs_rfai=
まずディスプレイに表示する色は光の三原色で出来ています。
R(赤)G(緑)B(青)で、全て合わせると白になります。(ホントは無色ですが)
で、bmpというのは全くデータを圧縮していない、RGBのデータをそのままファイルに保存したものです。
ですから、重いですし、解像度が同じなら画像の中身によってファイルサイズが変わる事はありません。
一方で圧縮した画像ファイル形式にpngやjpgがあります。
画像を扱うなら最低この3種類知っておく必要があるでしょう。
写真などに特化した圧縮はjpg、テキストデータを画像にしたものなどに適した圧縮はpngです。
また、pngは3原色の他に「透過度」を持つ事が出来るので、ゲームではよく使います。
DXライブラリではデフォルトで「真っ黒」が透過されるようになっています。
しかし真っ黒は透過して欲しくない場合もあり、「ちょっと透過」みたいな事がしたい事もあります。
そんな時は画像ソフトで画像自体に透過要素をいれてやります。
pngはRGBの他に透過度であるAが一緒に保存されます。
この透過はwindows標準のペイントなどでは無理で、編集するならGIMP等が必要です。
http://www.geocities.jp/gimproject/gimp2.0.html
私はフォトショップというソフトを使っています。
http://www.adobe.com/jp/products/photoshop/compare/
他にも絵を描きたいならSAIなど色々あります。
ゲーム制作に力を入れてくると、「真っ黒を透過色に」というやり方は使わなくなってきます。
画像自体に透過処理を施すやり方を覚えた方が良いでしょう。
はじめまして。
では最初にbmpとpngの違いから整理してみましょう。
とりあえず解らない事があればググれば大抵解決します。
png
http://www.google.co.jp/search?hl=ja&q=png&lr=lang_ja
bmp
http://www.google.co.jp/search?hl=ja&lr ... =&gs_rfai=
画像 種類
http://www.google.co.jp/search?hl=ja&tb ... =&gs_rfai=
画像 形式
http://www.google.co.jp/search?hl=ja&lr ... =&gs_rfai=
まずディスプレイに表示する色は光の三原色で出来ています。
R(赤)G(緑)B(青)で、全て合わせると白になります。(ホントは無色ですが)
で、bmpというのは全くデータを圧縮していない、RGBのデータをそのままファイルに保存したものです。
ですから、重いですし、解像度が同じなら画像の中身によってファイルサイズが変わる事はありません。
一方で圧縮した画像ファイル形式にpngやjpgがあります。
画像を扱うなら最低この3種類知っておく必要があるでしょう。
写真などに特化した圧縮はjpg、テキストデータを画像にしたものなどに適した圧縮はpngです。
また、pngは3原色の他に「透過度」を持つ事が出来るので、ゲームではよく使います。
DXライブラリではデフォルトで「真っ黒」が透過されるようになっています。
しかし真っ黒は透過して欲しくない場合もあり、「ちょっと透過」みたいな事がしたい事もあります。
そんな時は画像ソフトで画像自体に透過要素をいれてやります。
pngはRGBの他に透過度であるAが一緒に保存されます。
この透過はwindows標準のペイントなどでは無理で、編集するならGIMP等が必要です。
http://www.geocities.jp/gimproject/gimp2.0.html
私はフォトショップというソフトを使っています。
http://www.adobe.com/jp/products/photoshop/compare/
他にも絵を描きたいならSAIなど色々あります。
ゲーム制作に力を入れてくると、「真っ黒を透過色に」というやり方は使わなくなってきます。
画像自体に透過処理を施すやり方を覚えた方が良いでしょう。
Re:透過処理がうまくいきません;
すみません;ソース見ないで打ち込んだせいで間違えました;
シエルさんの指摘のおかげで気がつきました。
正しくは以下の通りです。
DXライブラリによるゲーム制作を行っているのですが、どうしてもロードした画像の透過処理ができません。
LoadDivGraph( "image//test.bmp" , 5 , 20 , 20 , 20 , 20 , image );
だと、test.bmp_aを読み取り、DrawGraph関数で描写させたとき、思い通りに透過処理が行われるのですが、
LoadDivGraph( "image//test.png" , 5 , 20 , 20 , 20 , 20 , image );
に変えると、なぜか透過処理が行われません。(透過処理を行わないまま描写されます。)
返答の後ですみません;以後、問題のプログラムのソースはコピペするように気をつけます。
アルファチャンネルを含まない画像というと・・・・ペイントで、保存するときに設定をいじれるのでしょうか・・・?ためしてみます。
入力が遅いんで、こうしている間にいろいろ返答きているかも・・・・失礼しました。。
シエルさんの指摘のおかげで気がつきました。
正しくは以下の通りです。
DXライブラリによるゲーム制作を行っているのですが、どうしてもロードした画像の透過処理ができません。
LoadDivGraph( "image//test.bmp" , 5 , 20 , 20 , 20 , 20 , image );
だと、test.bmp_aを読み取り、DrawGraph関数で描写させたとき、思い通りに透過処理が行われるのですが、
LoadDivGraph( "image//test.png" , 5 , 20 , 20 , 20 , 20 , image );
に変えると、なぜか透過処理が行われません。(透過処理を行わないまま描写されます。)
返答の後ですみません;以後、問題のプログラムのソースはコピペするように気をつけます。
アルファチャンネルを含まない画像というと・・・・ペイントで、保存するときに設定をいじれるのでしょうか・・・?ためしてみます。
入力が遅いんで、こうしている間にいろいろ返答きているかも・・・・失礼しました。。
Re:透過処理がうまくいきません;
シエルさん
Justyさん
管理人さん
ありがとうございます!
(この返信メッセージを書いているときに返信した方がいましたら、その人にも感謝です!)
みなさんのアドバイスのおかげで解決しました。
ペイントでは不可能だったので、SAYというソフトを落として画像を上書き保存したら成功しました。
上書き保存するとき、
PNG保存オプションというのが出てきて、
「24bbp RGB」を選択したら成功しました。
これで、ゲーム制作を再び進めることができそうです。
また、質問することがあるかもしれませんが、そのときはまたよろしくお願いします。
(即答でびっくりしました。感謝。)
Justyさん
管理人さん
ありがとうございます!
(この返信メッセージを書いているときに返信した方がいましたら、その人にも感謝です!)
みなさんのアドバイスのおかげで解決しました。
ペイントでは不可能だったので、SAYというソフトを落として画像を上書き保存したら成功しました。
上書き保存するとき、
PNG保存オプションというのが出てきて、
「24bbp RGB」を選択したら成功しました。
これで、ゲーム制作を再び進めることができそうです。
また、質問することがあるかもしれませんが、そのときはまたよろしくお願いします。
(即答でびっくりしました。感謝。)
Re:透過処理がうまくいきません;
ちょっと気になったんですが、
LoadDivGraph( "image//test.bmp" , 5 , 20 , 20 , 20 , 20 , image ); の
5 , 20 , 20, の部分はまちがっていませんか?
LoadDivGraph( "image//test.bmp" , 5 , 20 , 20 , 20 , 20 , image ); の
5 , 20 , 20, の部分はまちがっていませんか?
Re:透過処理がうまくいきません;
本当だ・・・おかしいですね。
今、修正しました。
偶然なのか、修正後と修正前の表示がおなじだったので気がつかなかったです。
ありがとうございます。
今、修正しました。
偶然なのか、修正後と修正前の表示がおなじだったので気がつかなかったです。
ありがとうございます。