いつもお世話になっています。GGです。
CImageクラスを使って、描画しています。
imgOriginal.GetWidth();
imgOriginal.GetHeight();
など取得できますが、
dpiの値がどう取得できるしょうか。
よろしくお願いします。
環境:.Net(2002) MFC使用、Win2000
>dpiの値がどう取得できるしょうか。
何の dpi 値が欲しいのでしょうか?
CImage 型の imgOriginal のでしょうか?だとしたら imgOriginal には
どのような画像データーがあることを前提にしていますか(画像データーに
dpi 値が必ず存在することはどうして分かりますか)?
しまさん
ご回答ありがとう。
>何の dpi 値が欲しいのでしょうか?
画像の解像度です、(例300DPI、600DPI)
>CImage 型の imgOriginal のでしょうか?だとしたら imgOriginal には
>どのような画像データーがあることを前提にしていますか(画像データーに
>dpi 値が必ず存在することはどうして分かりますか)?
CImage 型の imgOriginal.解像度があるのでしょうか。
もしなければ、別の方法で取得できるのでしょうか。
(この解像度は計算するときに使います)
よろしくお願いします。
ですから、「dpiは全てについているわけではなく、オプション項目であり、さらにそ
の値はファイルフォーマットに合わせるべきである」ということかと。
たとえば、BMPはdpi用の項目はありますが、マイクロソフトペイントで書いたファイ
ルに自分でdpiを指定したりは普通しません。
dpi指定そのものが無い場合も有ります。
1、どのようなファイルから読み取るのか。
2、無い場合はどうするのか。
3、そもそも何の計算なのか。
辺りが不明って事ではないでしょうか。
私は.Net触らないのでこの辺りの事しか書けません。
>(この解像度は計算するときに使います)
どういう計算がしたいのですか?
>>どのような画像データーがあることを前提にしていますか
>>(画像データーにdpi 値が必ず存在することはどうして分かりますか)?
についてお返事頂けていません(例えば画像データーについて言えば DIB形式,JPEG形式,
等)
ぬさん、しまさん
ご回答ありがとう。
>1、どのようなファイルから読み取るのか。
CImage 型の imgOriginal はJPEG、GIF、BMP、PNG を読めるのですが
今使っているファイルはJPEGとTIFです。
(TIFファイルも読める)
>2、無い場合はどうするのか。
使うのはJPEGとTIFですが、あるはずですね。
>3、そもそも何の計算なのか。
>辺りが不明って事ではないでしょうか。
開いたラスタファイルは一枚だけじゃなくて、複数枚ファイルを開います、
そのファイルのDPIはさまざまです、(200DPI、300DPIなど)
また、縮尺もあるのです。(1/500,1/2500)
そのため、ファイルの幅と高さを計算しているのです。
しまさんの質問も回答していますが、それでよろしいでしょうか。
今まで、問題というのは、JPEGとTIFファイルのDPI値を取得したいことです.
よろしくお願いします。
表示デバイス(例えばディスプレイ)の解像度によって、
1inchiに表示するドット数は変わると思うので、
画像ファイルにdpiが指定されていたとしても、意味が無いと思うんだけど。
dpiってdot per inchi でいいんだよね?
>そのファイルのDPIはさまざまです、(200DPI、300DPIなど)
ファイル毎の dpi 値が異なることを誰(又は何)が知っているのですか?
ファイルにデーターの一部として記録しているということですか?
>また、縮尺もあるのです。(1/500,1/2500)
縮尺は誰が(又はどのようにして)指定するのですか?
例えばファイル毎に決まっているとか、ユーザーが指定するとか
画像データーに dpi 値があるとして、それと縮尺とどういう関連があるのでしょうか?
表示する時に必要なんですか?印刷するときに必要なんですか?
hogeさん、しまさん
ご返事ありがとう。
>dpiってdot per inchi でいいんだよね?
そうです。1インチあたりのピクセル数。
>画像データーに dpi 値があるとして、それと縮尺とどういう関連があるのでしょうか?
>表示する時に必要なんですか?印刷するときに必要なんですか?
必要があるのです。
まー、質問のことが戻りたいのですが、
市販用のDLLはGetDPi()という関数があります、(そういうDLLを使わないで)
いままで、調べるところにCImageクラスはそういうメンバーがないそうです。
どうしたらいいでしょうか困っています。
よろしくお願いします。
だからそもそもビットマップ画像に dpi なんて概念は無いので
CImage にも無いのが当然。
>市販用のDLLはGetDPi()という関数があります
それは何の DLL ?
たぶん「ビットマップ」ではなくもっと上の層を扱うものだと思う。
日本語ネイティブの人?
発言内容がいつも、とてもわかりにくいんだ。
日本語ネイティブの人ならもうちょっと推敲してから送信ボタンを押すべし
CImageは、確かにさまざまなフォーマットをロードできますけれど、
それはロードして内部ではbitmapで持っているだけなので
多分、特定のフォーマットにしかないような情報は保持していないでしょう。
だから、CImageでロードしてそのままセーブしちゃうと付加情報は消えてしまうのでは
無いかと思うんですけれど。
そのフォーマット特有の情報を扱いたいのであれば、
そのフォーマット用のライブラリを使わないと多分駄目でしょう。
汎用は結局汎用でしかありませんから。
一般的な用途の場合、記録した時のDPI情報を使うと言う事はほとんどないと思います。
通常はその画像を等倍で表示もしくは印刷するのか、拡大/縮小して表示もしくは印刷する
のかと言うだけの話になります。
で、記録した時に何DPI相当で記録したのかと言う情報やら縮尺がフォーマットに記録されて
いるとしてそれを利用したいならそれようのライブラリで取り出すか、
自分でファイルフォーマットに従って読み出すかの何れかでしょうね。
少なくとも汎用にそこまで期待するのは無理でしょう。
>>2、無い場合はどうするのか。
>使うのはJPEGとTIFですが、あるはずですね。
すいません。言葉が足りなかったようです。
ファイルにDPIが保存されていない場合、という意味です。
JPEGあたりは付加情報のフォーマットが複数あった筈ですし、読み取り方によっ
ては保存されていても読み込めない場合もありえます。
DPI自体、ラスタ系画像ファイル全てに共通する項目では無いので、汎用ラスタ
画像処理クラスがそのような機能を完全にサポートさせているとは思えません。
現にWindowsBMPにも1ピクセルの実際の大きさの項目はありますが、こちらはイ
ンチではなく「pixels per meter」となっています。
汎用の画像クラスがこれらの違いを吸収してDPIのインターフェイスを残すとは思
えません。簡単に削除して済んでしまうと思います。
そもそも、汎用画像クラスという存在自体が厳密に画像を扱うための規格とは
遠いところにある筈です。
込み入った情報を扱う場合は、せめて付加情報だけでも自前ないし専用のライ
ブラリで読み込むほうがいいと思います。
現存するデータが全て同じフォーマット/付加情報規格ならば、そのデータ作成
の際に使ったライブラリを応用するほうが良いと思います。
そうでなくとも、どのような形式で付加情報を埋め込んでいるかは調べるべきで
す。
あとは、ライブラリが無ければその部分だけでも自分で実装する必要があります
が…
ファイル形式自体が公開された仕様である以上、ライブラリごとの実装の違いも
考えられます。(言い方変ですが言いたい事は判ると思いますので勘弁して下さ
い)
tetrapodさん、PATIOさん、ぬさん
長文な説明ありがとう。
自分の知識が不足ですが、
imgOriginal.GetWidth();
imgOriginal.GetHeight();
のようなimgOriginalクラスに
GetDPI()というメンバーがあると思っています。
PATIOさんとぬさんの説明してからわかりました。
問題解決:
1.専用のライブラリを使うか(使うのは簡単ですが、費用が上がる)
2.自分で作る(時間が必要です、体力の問題もあります)
3.フリなライブラリがあるか(その情報があれば、ありがたいのです)
PATIOさん、ぬさんの丁寧な説明ありがとう。
どうもありがとうございました。
CImageはDIBSectionを扱うクラスですが
ファイルから画像を読み込む場合は内部で
GDI+オブジェクトからDIBSectionへの変換を行います。
変換過程で元の画像固有の情報は失われてしまうので
CImageで解像度を扱う手段はなさそうです。
GDI+オブジェクトの方はEXIF情報などにもアクセス
できるので解像度の取得も可能そうですが、Imageクラスに
GetHorizontalResolution()
GetVerticalResolution()
というメソッドもあります。
これがお望みの動作をするかどうかはわかりません。
subaru さん、
貴重なアドバイスありがとう。
GDI+を使うのことですね、
早速、GDI+を実装してします。
ところが設定の問題がありました。
インクルードパスの設定とgdiplus.lib の指定ということです。
Visual C++ 6.0場合の設定がわかっています(ホームページにあるから)。
.Net 2002場合はそういう設定がどこにあるかわかりません。
一応、プロパティに「リンカ」が見つかりました。
次にどうしたらいいかわかりません。
少し質問の内容が変わりました、すみませんでした。
よろしくお願いします。