MFC VC++ 6.0 XP
正方形を回す、グラフィックプログラムを作成中なのですが、
上司の男の方に聞くと、「昔は、ピクセルは、正方形ではなかった」というお話を聞き
ました。
ということは、100x100の正方形をCDC::MoveTo(),CDC::LineTo()で描画する
と、正方形にはならない?のでしょうか?
(正方形に見えるんですが・・微妙にちがうんですか?)
>ピクセルは正方形?
ピクセルをどのようにとらえるかということだと思います
(画素の物理的な(=出力時の)縦横比は(ピクセル)アスペクト比と呼ぶようです)
ただ、通常のディスプレイ装置であれば1:1として表示することが多いと思います
--私はプログラムを作成する上ではデバイスコンテキスト上では1:1になっている
--ものとして扱っています
画面の表示結果や、プリンターでの印刷結果やについて言うのであれば
出力装置のピクセルの縦横比について言っていることになります
(少し前まで主流のCRTディスプレイは縦横それぞれの表示領域が調整できて、
見掛け上の縦横比は幾らでも変えることができるものがありましたし、今主流の
液晶ディスプレイでも幅広のものは表示解像度(ドット数)によってはピクセルの
縦横比が変わるものが多いようですね(デジタル入力かアナログ入力かでも
違うし、設定にもよりますが))
画像をデジタル化して取り込む時には入力装置のピクセルの縦横比について
言っていることになります
しまさん、レスありがとうございます。
実際に描かれる場合は、ピクセルは長方形になるようですが、
描画する正方形(100pixelx100pixel)に、(なにか絵を正方形に描くとか・・
して)上下関係がある場合、90度回すと違う形になってしまいますね。
なにか対策は、ないのでしょうか?
だから「何に」描くのかで話は変わってくるわけだが・・・
4:3 ディスプレイに表示した場合と 16:9 ディスプレイに表示したのとでは
同じ図形を表示しても異なって見えて当然。
画面上の図形の縦横を定規で実測するような話であるわけ?
そうでないのなら、ディスプレイの大きさ等に依存することなく
ソフト上で「正方形」を描画したら、表示装置上でも正方形であると *みなす* だけ。
>実際に描かれる場合は、ピクセルは長方形になるようですが、
>描画する正方形(100pixelx100pixel)に、(なにか絵を正方形に描くとか・・
>して)上下関係がある場合、90度回すと違う形になってしまいますね。
>なにか対策は、ないのでしょうか?
90度回すとはどういう操作のことを指しているのでしょうか?
プリンターに出力したらどうなりますか?
DCのマッピングモードはどうなっていますか?
MM_TEXT, MM_ISOTROPIC, MM_ANISOTROPIC, 他
また、SetWindowExt や SetViewPortExt やらで見せ方を指定していますか?
どの実行環境でも同じ現象が起きますか?
あなたが見ているディスプレイの種類(CTR/LCD)と解像度はどうなっていますか?
こういった必要な情報なしに見え方がどうだとかいわれても手がかりがない以上
ごく当たり障りのないことしか言えませんし、まして初めの内容では
>>上司の男の方に聞くと、「昔は、ピクセルは、正方形ではなかった」という
>>お話を聞きました
>>ということは100x100の正方形をCDC::MoveTo(),CDC::LineTo()で描画する
>>と、正方形にはならない?のでしょうか?
>>(正方形に見えるんですが・・微妙にちがうんですか?)
と書いてあるからこそ単に画面での見えているピクセルの縦横比についての質問と
受取ってお答えしたわけです
表示装置の設定や利用環境で違うということを説明したつもりなのですが
分りにくかったでしょうか?
tetrapodさん、しまさん、レスありがとうございます。
>と書いてあるからこそ単に画面での見えているピクセルの縦横比についての質問と
>受取ってお答えしたわけです
>表示装置の設定や利用環境で違うということを説明したつもりなのですが
>分りにくかったでしょうか?
それは、詳しく説明していただいて、よくわかるのですが、
実際、なにがしかの物体を回転するようなグラフィクは、めずらしくないので、
そういうとき、アスペクト比が1:1でない場合、回転してしまうと形がかわってしま
いますので、どういうふうに対応しているのかな??と思いまして・・・
すいません、すぐ質問が分岐してしまいまして。
いま、マッピングモードは、デェフォルトのまま(MM_TEXT)になっています。
SetWindowExt、SetViewPortExtは使っていません。
こりゃ、まず本人の認識からぶっくら返す必要があるな
熱血さんが、過去にみてきた
>実際、なにがしかの物体を回転するようなグラフィクは、めずらしくないので、
>そういうとき、アスペクト比が1:1でない場合、回転してしまうと形がかわってしま
>いますので、どういうふうに対応しているのかな??と思いまして・・・
これらは、
本当に正しい物理的な数値で表現されていたという保障はあったのでしょうか?
たとえば、
熱血さんが過去にみた「正方形のグラフィック」は、
正方形であると定規で測ったりしてみたのですか?
だれかに「正方形の画像です」といわれてうのみにしただけじゃないしょうか?
>実際、なにがしかの物体を回転するようなグラフィクは、めずらしくないので、
>そういうとき、アスペクト比が1:1でない場合、回転してしまうと形がかわってしま
>いますので、どういうふうに対応しているのかな??と思いまして・・・
私は出力装置を使う側で対処すべき問題だと考えているのでなにもしませんがこれは
出力装置側の問題をアプリケーションで補正しなければならないという要求があって
しかも常に解決可能かという問題ですね
最近のディスプレイ装置は自分の表示能力をデバイスドライバーに教える能力が
ありますが、装置(製品)によって扱える(変更できる)表示能力が違います。
なので表示装置のピクセルのアスペクト比がアプリケーションで算出可能でない
とは言えないことになります。
ではどうすればディスプレイ装置のピクセルアスペクト比を求めることが出来るのか
という問題になるでしょう。
そして、そのピクセルアスペクト比が求まるとして、補正するにはどうすればいいか。
補正した結果が予想通りの表示結果になるかが問題になるでしょう。
以上の課題が100%解決可能であれば補正できると判断できそうです
ども、PATIOです。
そもそも、実際のディスプレイの縦横の解像度を得る事はGDIでは出来ません。
プリンタならば、ドライブがちゃんと返してくれるようですけれど、
ディスプレイの場合、どんなディスプレイを付けていたとしても
システムが返却するDPIは縦も横も96DPIです。
恐らくディスプレイ用のデバイスコンテキストは上記の解像度のつもりで
動作しているのでこの解像度と大きく違う場合は表示上のアスペクト比が
崩れる事はあると思います。
これは、ピクセルの形が云々と言うよりもディスプレイの解像度が
きちんと取得できないことに起因する問題です。
システムから取得できない以上は、ユーザーに設定してもらうか
ユーザーに簡単な操作をしてもらって実際の解像度を出すくらいしか無いと思います。
私はWindowsのディスプレイに関しては解像度が正確に得られないので
仕方ないと考えています。ユーザーにスペックシートの解像度を入力してもらえば
少しはマシになると思うのですけれど、そこまでしても得られる効果は大した事が
無いので手間の方がユーザーの負担になると考えています。
すいません、誤字があったので訂正。
誤)
プリンタならば、ドライブがちゃんと返してくれるようですけれど、
正)
プリンタならば、ドライバーソフトがちゃんと返してくれるようですけれど、
>そもそも、実際のディスプレイの縦横の解像度を得る事はGDIでは出来ません。
CDC::DPtoHIMETRIC の解説によると、物理インチのピクセル数を基準とした変換と
論理インチのピクセル数を基準とした変換が可能となっています。
http://msdn.microsoft.com/ja-jp/library/h6e91ee5(VS.80).aspx
このメソッドと HIMETRIC_PER_INCH(=2540) という値を使って計算すれば
一応実際のディスプレイの解像度を求めることは可能っぽいです。
#今回の質問と直接関係あるかどうかわかりませんが。
ディスプレイに何がしかのアクセスをして、アスペクト比を返すような機能があれば、
実現できるようですが、今のところ、その機能はありませんということで、それでも、
どうしてもやりたければ、aetosさんの紹介してくださったHPにディスプレイを限定し
た場合の方法が書いてありました。(結構たいへんみたいです)。
ryoさん> いつもありがとうございます。わたしの思い込みかもしれませんね。たまに
やるマージャンゲームを思い出すと、打ち手と左で打つ人の牌の捨て牌の形が微妙にか
わってしまうことになるようにおもうのですが・・・。いま、確認してみると牌が小さ
いので、よくわかりません。
しまさん>今回は、非常に詳しい説明ありがとうございました。
PATIOさん>いつもながら感謝、感謝です。
aetosさん> PATIOさん、同様いつもありがとうございます。
えーと、多分ですが、
物理インチのピクセル数と言われているのが私がいっている解像度です。
この値は実質のディスプレイの解像度とは別のところで決められてしまうので
ユーザーが意識して指定しない限りはOSから取得できる解像度と
実際のディスプレイの解像度は一致しないと思います。
画面のプロパティで設定タブの詳細設定ボタンを押した時に表示される
ダイアログで全般タブのDPI設定がそれになります。
ここで120DPIを設定すれば、CDC::GetDeviceCapsで取得できるDPIも
120になります。これはあくまでも設定しに基づく物なので
ディスプレイの実質の解像度は全く別物です。
上記の設定はカスタム設定もあるので任意の数値の変更できそうですが、
値としては一種類しか設定できないので縦と横の解像度は同じ値にしか
出来ないと思います。
実際の話、ディスプレイのサイズが17インチだろうが19インチだろうが
取得できる解像度の値(DPI)は同じですし、画面のピクセル数にしても
17インチと19インチで同じピクセル数(1280×1024)に設定可能ですし、
同じモニタでもピクセル数の変更は可能ですから、
この96DPIが実画面の解像度とは連動していないと言うのはすぐわかると思います。
アスペクト比だけの問題ならMM_ISOTROPICで何とかなるんじゃないかなと
言う気がします。MSDNの解説を読む限りでは。