ページ 11

LoadDivGraph関数

Posted: 2010年5月31日(月) 12:33
by yux
LoadDivGraph関数を使って、画像を分割して読み込み表示しようとしたのですが、"グラフィックファイルを読み込めません"と出てきて、うまく表示できませんでした。どうすればうまく読み込めるでしょうか。

OS:WindowsXP HomeEdition
VisualC++2008ExpressEdition

Re:LoadDivGraph関数

Posted: 2010年5月31日(月) 15:46
by lbfuvab
このままでは満足のいく回答は得られないでしょう。せめてソースを載せましょう。

どう質問したら良いか分からないならテンプレを使うと良いですよ。

Re:LoadDivGraph関数

Posted: 2010年5月31日(月) 17:16
by yux
すみません m(__)m 初心者なのでうっかりしてました。
ソースは、

#include "DxLib.h"


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

int main_char[36];
char Key[256];

if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;


SetDrawScreen( DX_SCREEN_BACK ) ;
LoadDivGraph("../dat/image/mainchar.png",36,4,9,32,32,main_char);


while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){


DrawGraph( 320 , 240 , main_char[1] , TRUE ) ;

ScreenFlip();
}

DxLib_End();
return 0;
}

です。
よろしくお願いします (>人<) なにかあれば教えてください m(>_<)m 画像

Re:LoadDivGraph関数

Posted: 2010年5月31日(月) 22:42
by ookami
ソースコードには問題は見当たりませんです。

フォルダの指定は合っていますか?例えば、
LoadDivGraph("../dat/image/mainchar.png",36,4,9,32,32,main_char);

LoadDivGraph("dat/image/mainchar.png",36,4,9,32,32,main_char);
で解決しませんか?

Re:LoadDivGraph関数

Posted: 2010年6月01日(火) 16:04
by ムンバ
こんにちは。

昨日から、私も気になって悩んでいたのですが
ookamiさんがおっしゃってる通りか

>DrawGraph( 320 , 240 , main_char[1] , TRUE ) ;
 ↑
>LoadDivGraph("../dat/image/mainchar.png",36,4,9,32,32,main_char);

割り切れない数値(y座標)で分割されてる様にも見受けられるんです。
勘違いでしたら、申し訳ございません。

---↓追記---
<<割り切れない数値(y座標)で分割されてる様にも見受けられるんです。

違いますね!やはりookamiさんがおっしゃってる様に
画像までのパスが違っているか、ファイル名が違っているなどが原因だと思います。 画像

Re:LoadDivGraph関数

Posted: 2010年6月01日(火) 17:42
by yux
ムンバさんやookamiさんに言われたとおりに

LoadDivGraph("../dat/image/mainchar.png",36,4,9,32,32,main_char);

LoadDivGraph("dat/image/mainchar.png",36,4,9,32,32,main_char);

としてみると、"グラフィックファイルが読み込めません"という表示は消えたのですが、

"グラフィックの分割に失敗しました in CreateDivGraphFromGraphImage"

と出てきてしまいます。
何度もすみませんが、何かあったら教えてください。m(__)m 画像

Re:LoadDivGraph関数

Posted: 2010年6月01日(火) 18:52
by ookami
ちょっと進展したようでよかったです。
が、"グラフィックの分割に失敗..."というのは... 分からないです...

とりあえず、以下を確認してもらえますか?

・pngのかわりにbmpならうまくいくか?
・画像のサイズは?
・PCを再起動したらうまくいったりして? 画像

Re:LoadDivGraph関数

Posted: 2010年6月01日(火) 21:28
by ムンバ
私も少し確認させて頂きたい事があるのですが
お手数ですが、もし宜しければ添付させて頂いた添付ファイル
char_red.png ファイルをダウンロードして頂いて(ウィルスチェック済み)
mainchar.png と同じ場所(フォルダ)に char_red.png ファイルを置いて(移動して)

ソース内の

LoadDivGraph("dat/image/mainchar.png",36,4,9,32,32,main_char);

↑の行の mainchar.png → char_red.png に変更して頂き
同じ行の 36,4,9,32,32,main_char の 9 を 4 に・・・つまり

LoadDivGraph("dat/image/char_red.png",36,4,4,32,32,main_char);

にして、再度デバッグしてみて頂けないでしょうか? ---←誤字編集箇所---
赤い四角が出れば、成功です。

もし、赤い四角が出なければ、ookamiさんがおっしゃっている
>・pngのかわりにbmpならうまくいくか?
>・PCを再起動したらうまくいったりして?
を試してみて下さい。

もし、赤い四角が出れば、分割に失敗?している
ん~?そうですよね~。割り切れなくても出るはずなんですが・・・。^^;
とりあえず、宜しければ試してみて頂けますか?

---追記---
添付ファイル、ダウンロードする時ファイル名が変わっちゃうと思うので
ダウンロードしたファイル名を char_red.png に変更してから試してみて下さい。 画像

Re:LoadDivGraph関数

Posted: 2010年6月01日(火) 22:14
by yux
ありがとうございます!分かりました。
明日学校から帰ったらやってみたいと思います。

Re:LoadDivGraph関数

Posted: 2010年6月02日(水) 00:02
by ムンバ
Xさん、ぜひぜひ分割画像を表示できる様、がんばって下さいねっ!

以前に単細胞なRPGゲームを作った時に、フリー画像の分割表示で悩みました。
その時には、「グラフィックの分割に失敗しました in CreateDivGraphFromGraphImage」
の様なエラーは出なかったので、ちょっと気になったので
このエラーが出る様に試してみたところ

txtファイルで添付させて頂いた各ソース内でのメイン関数内のコメント // の様にすると
(4つのソースで試してますので、各ソースの /* ~ */ を削除して、それぞれ試してみて下さい。
 他のソースを試す時は、元の状態 /* ~ */ に戻して下さい。←解りにくいかも。)

グラフィックの分割に失敗しました in CreateDivGraphFromGraphImage
のエラーが出る値を試行錯誤しながら試してみました。

OS:Win7(Pro)
VC++2008(SP1)

ちなみに---追加ソース、すみません。---
#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    int main_char[32];
    char Key[256];
    
    if(ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
    
    SetDrawScreen(DX_SCREEN_BACK);

    LoadDivGraph("char_red.png", 32, 123456789, 123456789, 2, 16, main_char);
    
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll(Key) && !Key[KEY_INPUT_ESCAPE])
    {
        DrawGraph(320, 240, main_char[0], TRUE);
        ScreenFlip();
    }
    
    DxLib_End();
    
    return 0;
}
これでも、画像は表示されました。エラーも出ませんでした。
根本的に、私が理解できてないのかもしれません。^^;
---↑追加ソース、すみません。---

明日(今日)、別のPC
OS:WinXP(Home SP3?)
VC++2008(SP1)
でも、このソース試してみますね。

>>ookamiさん
 もしも、宜しければで申し訳御座いませんが
 お時間あれば、試して頂けませんでしょうか?
 私の環境でも
 グラフィックの分割に失敗しました in CreateDivGraphFromGraphImage
 が出てしまいました。(汗

誤字・脱字など御座いましたら、ご指摘の程、宜しくお願い致します。
おやすみなさい!(∪。∪)。。。zzzZZ

---↓追記・編集---
何度も編集しまして、申し訳御座いません。
このtxtファイルが、文字化けしてた場合は
ブラウザIEでしたら、「表示」→「エンコード」→「日本語(自動選択)」で
うまく表示されるかと思います。
長文、すみませんでした。

---職場での結果---
同じでした。^^; 画像

Re:LoadDivGraph関数

Posted: 2010年6月02日(水) 19:58
by yux
ムンバさん、ookamiさん、頑張って悩んでくださってありがとうございます!!

今日学校から帰って、まずchar_red.pngにして、実行してみました。
するとちゃんと赤い四角が表示されて、エラーも消えました。
分割するときの数値が合っていなかったから正常に分割できなくて、表示も出来なかったのでしょうか??
画像

Re:LoadDivGraph関数

Posted: 2010年6月03日(木) 18:05
by yux
今後、自分で考えて、無事解決しました!!

これまで協力してくださった、ムンバさん、ookamiさん、lbfuvabさん、

本当に私のために必死で尽くしてくださって、ありがとうございます!!

本当に感謝します!! m(_ _*)m

Re:LoadDivGraph関数

Posted: 2010年6月03日(木) 22:19
by ookami
> Xさん
解決したようで何よりです!

> ムンバさん

No. 53239 の件、
やってみましたよwwww

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
int main_char[32];
char Key[256];

if(ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;

SetDrawScreen(DX_SCREEN_BACK);

LoadDivGraph("char_red.png", 32, 2, 2, 64, 127, main_char);

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll(Key) && !Key[KEY_INPUT_ESCAPE])
{
DrawGraph(320, 240, main_char[0], TRUE);
ScreenFlip();
}

DxLib_End();

return 0;
}

/*

☆のところを次のように変更して確認しました。
LoadDivGraph("char_red.png", 32, 4, 4, 32, 32, main_char); → 問題なし
LoadDivGraph("char_red.png", 32, 5, 4, 32, 32, main_char); → グラフィックの分割に失敗しました
LoadDivGraph("char_red.png", 32, 4, 5, 32, 32, main_char); → グラフィックの分割に失敗しました
LoadDivGraph("char_red.png", 32, 8, 8, 16, 16, main_char); → 問題なし
LoadDivGraph("char_red.png", 32, 9, 8, 16, 16, main_char); → グラフィックの分割に失敗しました
LoadDivGraph("char_red.png", 32, 8, 9, 16, 16, main_char); → 問題なし
LoadDivGraph("char_red.png", 32, 8, 123456789, 16, 16, main_char); → 問題なし
LoadDivGraph("char_red.png", 32, 2, 2, 64, 64, main_char); → 問題なし
LoadDivGraph("char_red.png", 32, 2, 2, 65, 64, main_char); → 問題なし
LoadDivGraph("char_red.png", 32, 2, 2, 96, 64, main_char); → 問題なし
LoadDivGraph("char_red.png", 32, 2, 2, 112, 64, main_char); → 問題なし
LoadDivGraph("char_red.png", 32, 2, 2, 120, 64, main_char); → 問題なし
LoadDivGraph("char_red.png", 32, 2, 2, 127, 64, main_char); → 問題なし
LoadDivGraph("char_red.png", 32, 2, 2, 128, 64, main_char); → グラフィックの分割に失敗しました
LoadDivGraph("char_red.png", 32, 2, 2, 64, 127, main_char); → 問題なし
LoadDivGraph("char_red.png", 32, 2, 2, 64, 128, main_char); → グラフィックの分割に失敗しました

*/

まとめ:
元画像の画像サイズをOrigXSize,OrigYSizeとすると、
LoadDivGraph(FileName,AllNum,XNum,YNum,XSize,YSize,HandleBuf);
で、
( (XNum-1)*XSize>=OrigXSize ||
(YNum-1)*YSize>=OrigYSize )
では「グラフィックの分割に失敗しました」になるような感じですね。ただし、YNumはあらかじめAllNum/XNum以下になるように切り捨てられている感じですと...
...ていうか、ここまで踏み込まなくても(ノリで踏み込みましたが)、元画像をはみ出さないように設定するのが大前提ですね;

Re:LoadDivGraph関数

Posted: 2010年6月04日(金) 15:57
by ムンバ
こんにちは。

Xさん、良かったです。^^

<<ookamiさん

お手数お掛けします。w
>>...ていうか、ここまで踏み込まなくても(ノリで踏み込みましたが)
 踏み込まないと気が済まない性格でして。^^;
>>元画像をはみ出さないように設定するのが大前提ですね
 その様ですね。お騒がせしました。

私も勉強になりました。失礼します。

変数の計算がうまくいきません。

Posted: 2010年6月10日(木) 17:44
by ひよこ
私は今、小数第3位までを文字列から取り出すプログラムを書いているのですが
下の関数で

//小数点第三桁までdoubleのポインタに代入
void atof(double *Double,const char *String){
int i,s,num;//num :整数を入れる
char one,two,three;//Stringの.の後3ケタを入れるバッファ
int one_num,two_num,three_num;//小数第1位、小数第2位、小数第3位の値
one_num=0;two_num=0;three_num=0;
for(i=0;i<String!='\0';i++){
if(String=='.'){
for(s=i+1;String!='\0';s++){
if(s-i==1){
one=String;
one_num=atoi(&one);
}
if(s-i==2){
two=String;
two_num=atoi(&two);
}
if(s-i==3){
three=String;
three_num=atoi(&three);
}
}
}
}
if(Double!=NULL){
num=atoi(String);
*Double=num+(one_num*0.1+two_num*0.01+three_num*0.001);
}
}
double a;

atof(&a,"1.1\0");とすると、aには1.1000000000000001と謎の1が入ってしまうのですが
どうすればいいでしょうか?
VC++EE2008 Vistaです。お願いいたします。

Re:変数の計算がうまくいきません。

Posted: 2010年6月10日(木) 18:12
by たいちう
> どうすればいいでしょうか?

有限の桁数で小数を扱うため誤差は付き物です。
関数から受け取った値をうまく使えばよいでしょう。

Re:変数の計算がうまくいきません。

Posted: 2010年6月10日(木) 18:15
by たいちう
ちょっと補足

double a = 1.1;

この代入の結果はどうなりますか?
謎の1が入りますか?
原理的に誤差は付いて回るものと思ってください。

Re:変数の計算がうまくいきません。

Posted: 2010年6月10日(木) 18:23
by ひよこ
double a = 1.1;
>>この計算は謎の1が入りました。
これは計算の誤差ということですか。わかりました。

原理的にというと、どういう原理でしょうか?

Re:変数の計算がうまくいきません。

Posted: 2010年6月11日(金) 00:08
by たいちう
1/3を10進数で表そうとすると、小数点以下何桁で四捨五入しても
正確な値を表現できません。

1.1をコンピュータが一般的に使う2進数で表そうとすると、
小数点以下何桁で四捨五入しても正確な値を表現できません。
(本当は四捨五入でなく、切り捨てか切り上げですが)

Re:変数の計算がうまくいきません。

Posted: 2010年6月11日(金) 06:15
by ひよこ
なるほど、つまり小数は2進数では計算しきれないことですね。
わかりました。たいちうさん、詳しい説明ありがとうございました。

Re:変数の計算がうまくいきません。

Posted: 2010年6月11日(金) 10:21
by YuO
> つまり小数は2進数では計算しきれないことですね。

10進数で表せる小数の中に,2進数で表せない物がある,というだけです。
具体的に書くならば,Σk<sub>n</sub>2-n (ただしk<sub>n</sub>は0または1, nは正整数) という形で書き表せるものは,
10進数でも2進数でも小数として正確に書き表せます。
e.g.) 0.5<sub>(10)</sub> = 0.1<sub>(2)</sub>, 0.375<sub>(10)</sub> = 0.011<sub>(2)</sub>

Re:変数の計算がうまくいきません。

Posted: 2010年6月12日(土) 23:29
by ひよこ
YuOさん補足ありがとうございます。
数式まで書いてくださりありがとうございます。
しかし、数式はよくわかりませんでしたが、
2の-n乗なら10進数でも2進数でも表せるという見方でよろしいでしょうか?

Re:変数の計算がうまくいきません。

Posted: 2010年6月13日(日) 17:09
by YuO
> 2の-n乗なら10進数でも2進数でも表せるという見方でよろしいでしょうか?

2の-n乗ではなく,2の-n乗の和という形で表せるのであれば,2進数でも10進数でも表すことができます。
# -nにしたのは,小数部だけを取り出すため。

Re:変数の計算がうまくいきません。

Posted: 2010年6月13日(日) 21:41
by ひよこ
2の-n乗の和ならできるのですか。わかりました。
Yuoさんありがとうございました。