ページ 11

画像をロードせずに画像の幅と高さを取得したい

Posted: 2015年7月20日(月) 16:51
by natsu
はじめまして。
現在DXライブラリとC++を用いてゲーム開発をしています。

質問はタイトルの通りです。
なぜこんなことをしたいかというと、非同期読み込みでLoadDivGraphを使いたいからです。
LoadDivGraphに渡すための画像サイズをさくっと取得したいのです。
(ちなみに分割数は別ファイルに記述してます。
そこに画像サイズも書けばいいのではという意見もあるかと思いますが、
分割数そのままでサイズの異なる画像に差し替えってとき等にいろいろ面倒なので・・・)

最初、通常のLoadGraphで仮読み込みをした後にGetGraphSizeで画像サイズを取得しようとしましたが、
非同期読み込みが完了するまではハンドルが有効ではないので、結局LoadGraphが完了するまで待たないといけなくて面倒です。

FileRead_size関数みたいに、中身全部はメモリ上に読まずに画像サイズ(高さと幅)の情報だけ欲しいのですが、何か良い方法はないでしょうか?

Re: 画像をロードせずに画像の幅と高さを取得したい

Posted: 2015年7月20日(月) 17:26
by Dixq (管理人)
DXライブラリに頼らず自分でファイルヘッダを見ればすぐわかりますがこれではダメですか?
例えばPNGの場合
http://www.setsuki.com/hsp/ext/png.htm
イメージヘッダ IHDR
の中の
0x0008 (4) Chunk Data 画像の幅
0x000C (4) 〃 画像の高さ
に書いてあります。

Re: 画像をロードせずに画像の幅と高さを取得したい

Posted: 2015年7月20日(月) 17:45
by yuran
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=3574
恐らく該当する関数を追加して下さっています。
URLは本家様掲示板を貼ってます。
最新版でしたら使用可能でしょう。

Re: 画像をロードせずに画像の幅と高さを取得したい

Posted: 2015年7月20日(月) 17:53
by Dixq (管理人)
yuranさんが仰る通りついこの前追加されたようです。
管理人さん神対応ですね・・。最新版Ver 3.14dに存在することを確認しました。
せっかくなので自力でやるサンプルも付けます。

コード:

#include "DxLib.h"

typedef struct {
	int w,h;
}Size_t;

int cenvertByteOrder(int x){
	return ((x & 0xFF000000) >> 24) | ((x & 0x00FF0000) >> 8) | ((x & 0x0000FF000000) << 8) | ((x & 0x000000FF) << 24);
}

bool GetImageSize(char* fileName, Size_t *size){
	FILE* fp = fopen(fileName, "rb");
	if(fp == NULL){
		return false;
	}
	fseek(fp, 16L, SEEK_SET);
	fread(&size->w, sizeof(int), 1, fp);
	fread(&size->h, sizeof(int), 1, fp);
	fclose(fp);
	return true;
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	Size_t size={};
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
	GetImageSize("test.png", &size);
	size.w = cenvertByteOrder(size.w);
	size.h = cenvertByteOrder(size.h);
	printfDx("w=%d, h=%d", size.w, size.h);
	while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen());
	DxLib_End();
	return 0;
}

Re: 画像をロードせずに画像の幅と高さを取得したい

Posted: 2015年7月20日(月) 21:29
by natsu
>管理人さん、yuranさん

ご返信ありがとうございます!
最初に管理人さんが仰ったように自力でどうにかするしかないのかなと思っていましたが
既に関数が存在していたとは・・・。
私の調査不足でお手数をかけてしまいすみません。

最新版をDLして使ってみます。
ありがとうございました!

管理人さんもわざわざコードをありがとうございます。
ヘッダ情報を読むには結構面倒なイメージがありましたが案外短く済むのですね・・・。