ピクセルって正方形?

[戻る]
熱血 2009/08/15(土) 08:47:34
MFC VC++ 6.0 XP

正方形を回す、グラフィックプログラムを作成中なのですが、
上司の男の方に聞くと、「昔は、ピクセルは、正方形ではなかった」というお話を聞き
ました。
ということは、100x100の正方形をCDC::MoveTo(),CDC::LineTo()で描画する
と、正方形にはならない?のでしょうか?
(正方形に見えるんですが・・微妙にちがうんですか?)

しま 2009/08/15(土) 10:59:13
>ピクセルは正方形?

ピクセルをどのようにとらえるかということだと思います
(画素の物理的な(=出力時の)縦横比は(ピクセル)アスペクト比と呼ぶようです)
ただ、通常のディスプレイ装置であれば1:1として表示することが多いと思います
--私はプログラムを作成する上ではデバイスコンテキスト上では1:1になっている
--ものとして扱っています

画面の表示結果や、プリンターでの印刷結果やについて言うのであれば
出力装置のピクセルの縦横比について言っていることになります
(少し前まで主流のCRTディスプレイは縦横それぞれの表示領域が調整できて、
見掛け上の縦横比は幾らでも変えることができるものがありましたし、今主流の
液晶ディスプレイでも幅広のものは表示解像度(ドット数)によってはピクセルの
縦横比が変わるものが多いようですね(デジタル入力かアナログ入力かでも
違うし、設定にもよりますが))

画像をデジタル化して取り込む時には入力装置のピクセルの縦横比について
言っていることになります

熱血 2009/08/16(日) 05:55:06
しまさん、レスありがとうございます。
実際に描かれる場合は、ピクセルは長方形になるようですが、
描画する正方形(100pixelx100pixel)に、(なにか絵を正方形に描くとか・・
して)上下関係がある場合、90度回すと違う形になってしまいますね。
なにか対策は、ないのでしょうか?

tetrapod 2009/08/16(日) 06:58:48
だから「何に」描くのかで話は変わってくるわけだが・・・
4:3 ディスプレイに表示した場合と 16:9 ディスプレイに表示したのとでは
同じ図形を表示しても異なって見えて当然。

画面上の図形の縦横を定規で実測するような話であるわけ?
そうでないのなら、ディスプレイの大きさ等に依存することなく
ソフト上で「正方形」を描画したら、表示装置上でも正方形であると *みなす* だけ。

しま 2009/08/16(日) 13:25:48
>実際に描かれる場合は、ピクセルは長方形になるようですが、
>描画する正方形(100pixelx100pixel)に、(なにか絵を正方形に描くとか・・
>して)上下関係がある場合、90度回すと違う形になってしまいますね。
>なにか対策は、ないのでしょうか?

90度回すとはどういう操作のことを指しているのでしょうか?
プリンターに出力したらどうなりますか?
DCのマッピングモードはどうなっていますか?
    MM_TEXT, MM_ISOTROPIC, MM_ANISOTROPIC, 他
また、SetWindowExt や SetViewPortExt やらで見せ方を指定していますか?
どの実行環境でも同じ現象が起きますか?
あなたが見ているディスプレイの種類(CTR/LCD)と解像度はどうなっていますか?

こういった必要な情報なしに見え方がどうだとかいわれても手がかりがない以上
ごく当たり障りのないことしか言えませんし、まして初めの内容では
>>上司の男の方に聞くと、「昔は、ピクセルは、正方形ではなかった」という
>>お話を聞きました
>>ということは100x100の正方形をCDC::MoveTo(),CDC::LineTo()で描画する
>>と、正方形にはならない?のでしょうか?
>>(正方形に見えるんですが・・微妙にちがうんですか?)
と書いてあるからこそ単に画面での見えているピクセルの縦横比についての質問と
受取ってお答えしたわけです
表示装置の設定や利用環境で違うということを説明したつもりなのですが
分りにくかったでしょうか?

熱血 2009/08/16(日) 18:39:48
tetrapodさん、しまさん、レスありがとうございます。

>と書いてあるからこそ単に画面での見えているピクセルの縦横比についての質問と
>受取ってお答えしたわけです
>表示装置の設定や利用環境で違うということを説明したつもりなのですが
>分りにくかったでしょうか?

それは、詳しく説明していただいて、よくわかるのですが、
実際、なにがしかの物体を回転するようなグラフィクは、めずらしくないので、
そういうとき、アスペクト比が1:1でない場合、回転してしまうと形がかわってしま
いますので、どういうふうに対応しているのかな??と思いまして・・・

すいません、すぐ質問が分岐してしまいまして。
いま、マッピングモードは、デェフォルトのまま(MM_TEXT)になっています。
SetWindowExt、SetViewPortExtは使っていません。

ryo 2009/08/16(日) 23:14:38
こりゃ、まず本人の認識からぶっくら返す必要があるな

熱血さんが、過去にみてきた

>実際、なにがしかの物体を回転するようなグラフィクは、めずらしくないので、
>そういうとき、アスペクト比が1:1でない場合、回転してしまうと形がかわってしま
>いますので、どういうふうに対応しているのかな??と思いまして・・・

これらは、
本当に正しい物理的な数値で表現されていたという保障はあったのでしょうか?
たとえば、
熱血さんが過去にみた「正方形のグラフィック」は、
正方形であると定規で測ったりしてみたのですか?

だれかに「正方形の画像です」といわれてうのみにしただけじゃないしょうか?

しま 2009/08/17(月) 08:56:36
>実際、なにがしかの物体を回転するようなグラフィクは、めずらしくないので、
>そういうとき、アスペクト比が1:1でない場合、回転してしまうと形がかわってしま
>いますので、どういうふうに対応しているのかな??と思いまして・・・

私は出力装置を使う側で対処すべき問題だと考えているのでなにもしませんがこれは
出力装置側の問題をアプリケーションで補正しなければならないという要求があって
しかも常に解決可能かという問題ですね

最近のディスプレイ装置は自分の表示能力をデバイスドライバーに教える能力が
ありますが、装置(製品)によって扱える(変更できる)表示能力が違います。
なので表示装置のピクセルのアスペクト比がアプリケーションで算出可能でない
とは言えないことになります。
ではどうすればディスプレイ装置のピクセルアスペクト比を求めることが出来るのか
という問題になるでしょう。
そして、そのピクセルアスペクト比が求まるとして、補正するにはどうすればいいか。
補正した結果が予想通りの表示結果になるかが問題になるでしょう。

以上の課題が100%解決可能であれば補正できると判断できそうです

PATIO 2009/08/17(月) 10:10:36
ども、PATIOです。

そもそも、実際のディスプレイの縦横の解像度を得る事はGDIでは出来ません。
プリンタならば、ドライブがちゃんと返してくれるようですけれど、
ディスプレイの場合、どんなディスプレイを付けていたとしても
システムが返却するDPIは縦も横も96DPIです。
恐らくディスプレイ用のデバイスコンテキストは上記の解像度のつもりで
動作しているのでこの解像度と大きく違う場合は表示上のアスペクト比が
崩れる事はあると思います。
これは、ピクセルの形が云々と言うよりもディスプレイの解像度が
きちんと取得できないことに起因する問題です。
システムから取得できない以上は、ユーザーに設定してもらうか
ユーザーに簡単な操作をしてもらって実際の解像度を出すくらいしか無いと思います。

私はWindowsのディスプレイに関しては解像度が正確に得られないので
仕方ないと考えています。ユーザーにスペックシートの解像度を入力してもらえば
少しはマシになると思うのですけれど、そこまでしても得られる効果は大した事が
無いので手間の方がユーザーの負担になると考えています。

aetos 2009/08/17(月) 10:15:48
参考になるかしら?
http://blogs.wankuma.com/shannon/archive/2007/04/25/73048.aspx

PATIO 2009/08/17(月) 10:26:31
すいません、誤字があったので訂正。

誤)
プリンタならば、ドライブがちゃんと返してくれるようですけれど、

正)
プリンタならば、ドライバーソフトがちゃんと返してくれるようですけれど、

subaru 2009/08/17(月) 11:14:35
>そもそも、実際のディスプレイの縦横の解像度を得る事はGDIでは出来ません。

CDC::DPtoHIMETRIC の解説によると、物理インチのピクセル数を基準とした変換と
論理インチのピクセル数を基準とした変換が可能となっています。
http://msdn.microsoft.com/ja-jp/library/h6e91ee5(VS.80).aspx

このメソッドと HIMETRIC_PER_INCH(=2540) という値を使って計算すれば
一応実際のディスプレイの解像度を求めることは可能っぽいです。

#今回の質問と直接関係あるかどうかわかりませんが。

熱血 2009/08/17(月) 11:20:32
ディスプレイに何がしかのアクセスをして、アスペクト比を返すような機能があれば、
実現できるようですが、今のところ、その機能はありませんということで、それでも、
どうしてもやりたければ、aetosさんの紹介してくださったHPにディスプレイを限定し
た場合の方法が書いてありました。(結構たいへんみたいです)。


ryoさん> いつもありがとうございます。わたしの思い込みかもしれませんね。たまに
やるマージャンゲームを思い出すと、打ち手と左で打つ人の牌の捨て牌の形が微妙にか
わってしまうことになるようにおもうのですが・・・。いま、確認してみると牌が小さ
いので、よくわかりません。

しまさん>今回は、非常に詳しい説明ありがとうございました。

PATIOさん>いつもながら感謝、感謝です。

aetosさん> PATIOさん、同様いつもありがとうございます。

PATIO 2009/08/17(月) 11:29:26
えーと、多分ですが、

物理インチのピクセル数と言われているのが私がいっている解像度です。
この値は実質のディスプレイの解像度とは別のところで決められてしまうので
ユーザーが意識して指定しない限りはOSから取得できる解像度と
実際のディスプレイの解像度は一致しないと思います。

画面のプロパティで設定タブの詳細設定ボタンを押した時に表示される
ダイアログで全般タブのDPI設定がそれになります。
ここで120DPIを設定すれば、CDC::GetDeviceCapsで取得できるDPIも
120になります。これはあくまでも設定しに基づく物なので
ディスプレイの実質の解像度は全く別物です。
上記の設定はカスタム設定もあるので任意の数値の変更できそうですが、
値としては一種類しか設定できないので縦と横の解像度は同じ値にしか
出来ないと思います。
実際の話、ディスプレイのサイズが17インチだろうが19インチだろうが
取得できる解像度の値(DPI)は同じですし、画面のピクセル数にしても
17インチと19インチで同じピクセル数(1280×1024)に設定可能ですし、
同じモニタでもピクセル数の変更は可能ですから、
この96DPIが実画面の解像度とは連動していないと言うのはすぐわかると思います。

PATIO 2009/08/17(月) 11:58:00
アスペクト比だけの問題ならMM_ISOTROPICで何とかなるんじゃないかなと
言う気がします。MSDNの解説を読む限りでは。

subaru 2009/08/17(月) 16:44:33
一応、CDC::DPtoHIMETRIC から物理解像度を得られるだろうと
思っていたコードはこんな感じです。
(画面のプロパティで設定される解像度とは違います)
#コンパイル通らなかったらごめん。

CDC dc;
dc.CreateDC(_T("DISPLAY"), NULL, NULL, NULL);

dc.SetMapMode(MM_HIMETRIC);
CSize size(100, 100);
dc.DPtoHIMETRIC(&size);
ATLTRACE2(_T("%d"), MulDiv(100, 2540, size.cx));

CDC::GetDeviceCapsで取得する方法や
MM_TEXTで計算した場合には画面のピクセル数の設定を変えても
常に96DPIが得られるけど、上記の方法なら異なるはずです。
実際にディスプレイサイズを測って比べたわけではないので
この値が正確なものかどうかはわかりませんが。。。

熱血 2009/08/17(月) 17:00:08
subaruさん、PATIOさん、レスありがとうございます。


aetosさんから紹介されたHPをみると、MSDNのマニュアルでは、できそうに書いて
いますが、実際には、なかなかむずかしくなりそうなことが書いてあります。
以下の記述が要点で・・・

> Windowsはこれを96DPIだと勝手に決め付ける。

> GetDeviceCapsにHORZSIZE、VERTSIZEを渡せば取得できそうに見えるが、これはデタラ
メな値しか返さないので使えない。

とかかれています。これは、ディスプレイにディスプレイ仕様を応答する機能がないん
ですが、MSDNには、できるように書かれているという、事実に会うお話だとおもい
ます。

aetos 2009/08/17(月) 17:07:51
もし試せる方がいたら、GetMonitorDisplayAreaSize っていう関数がどんな結果を返す
か検証してほしいです。

http://msdn.microsoft.com/en-us/library/dd692944.aspx

aetos 2009/08/17(月) 17:14:31
検索したらこんなの見つけました。
http://www.wankuma.com/seminar/20080126tokyo16/3.pdf

subaru 2009/08/17(月) 21:04:43
>もし試せる方がいたら、GetMonitorDisplayAreaSize っていう関数がどんな結果を返す
>か検証してほしいです。
>
>http://msdn.microsoft.com/en-us/library/dd692944.aspx

GetMonitorCapabilities で MC_CAPS_DISPLAY_AREA_SIZE が返らず断念。

>検索したらこんなの見つけました。
>http://www.wankuma.com/seminar/20080126tokyo16/3.pdf

私の示した計算方法はこのページに出てくる

1インチ= GetDeviceCaps(hdc, HORZRES) / (GetDeviceCaps(hdc, HORZSIZE) / 25.4)

と同じ結果になってしまうようでした。
どうやら HORZSIZE が正確でないのと同じ理由でダメみたいです。

ちなみに WPF ならもしかしてどんな環境でも正方形になるのか?とも思い、
2Dと3Dの表示でそれぞれ試してみましたが、ディスプレイモードの設定で
やはり縦横比は変わってしまうようでした。

仲澤@失業者 2009/08/18(火) 10:53:05
え〜と
なんか難しい話になってるようですが、気になるのはスレ主さんの

>描画する正方形(100pixelx100pixel)に、(なにか絵を正方形に描くとか・・
>して)上下関係がある場合、90度回すと違う形になってしまいますね。
>なにか対策は、ないのでしょうか?

の部分ですね。
ちゃんと浮動少数点で演算し、整数に代入時に四捨五入すれば
座標値はそんなことにはなりません。
MM_TEXTの状態で、かつ座標値が正しければ、
プログラマが他にやるべきことはあまりありません。

このあたりはどうでしょう。

PATIO 2009/08/18(火) 11:08:48
モニタ毎にドライバがあれば良いのでしょうけれど、
実際にはグラフィックボード毎にしかドライバが無いので
モニタの情報がOS側で取り込めないのですよね。
一応、モニタの種類を設定できるようにはなっているみたいなんですけどねぇ。

aetosさんが紹介してくれたURLの内容にもあるように
DPIの値を正確にする方向で考えてしまうとユーザーの手助けが必要になるでしょうね。
ある程度設定で逃げるしかないかもしれませんね。

aetos 2009/08/18(火) 12:11:51
本題に立ち返ると…

デフォルトの MM_TEXT モードでも、モニタの表示領域とデスクトップのピクセル数のア
スペクト比が異なれば、ピクセルは正方形でなくなるでしょうね。

あとは、そのような事態を想定してプログラムを組むのかどうか、つまり、モニタの大
きさやデスクトップの設定に依存せず、常に正方形に見えるように描く必要があるのか
否か、が争点ですか。
プログラムから API に渡す値として縦と横を同じにすれば、正方形が描かれているもの
としてよいかどうか。

aetos 2009/08/18(火) 12:16:19
> モニタの情報がOS側で取り込めないのですよね。

取り込むための規格と API はあります。
モニタが対応しているかどうかは別問題ですが。

tetrapod 2009/08/18(火) 12:31:06
そもそもの話として
雑談:
上司「昔は画面上での1ピクセルは、縦横サイズが違ったんだよねー」
(だってディスプレイって4:3で横長なんだもん)
部下「ふーん」
という単なる雑談だったのか

命令指示:
上司:「ヘイ糞ども、どんなディスプレイアダプタでもどんなディスプレイでも、
 画面上の線分を定規で実測して常に正方形になるようなソフトを作れ」
部下:「サー、イエッサー」
という命令だったのか

俺たち読者にはわからんのだよなー

前者なのだったら気にする必要はないし
後者なのだったら、それは「練習課題」にするにはヘヴィすぎるんぢゃないかなー
とか思う今日子の頃

まあ外野は好きなように盛り上がっていればそれでいいので気楽なもんですわ

仲澤@失業者 2009/08/18(火) 16:19:39
雑談の続き・・・

>上司「昔は画面上での1ピクセルは、縦横サイズが違ったんだよねー」

自分が知っている限りで、かつパソコンに限ると、
PC8001の擬似グラフィックモードがそうだったかも・・・
ぐらいしか思いつきません。

ベーシックマスターもFM-7/8もMZもMSXも全部1:1だったような
気のせいがします。
ミッキー比が変なマウスはあったんですけどね(vv;)。

熱血 2009/08/18(火) 20:36:42
[[解決]]
aetosさん、subaruさん、仲澤@失業者 さん、tetrapod さん、PATIO さん、レス
ありがとうございます。
いつもお世話になってる蒼々たる面々ですね。

> subaru さん、
検証ありがとうございました。

>仲澤@失業者さん、
グラフィックアニメーションで正方形の中に絵を描くと多少縦長になりますよね。
90度回すと多少横長になってしまって、絵の感じがかわってしまうと、同じ絵が回っ
てるような感じにならないのでは・・・とおもったのですが、実際には、それほど、縦
長、横長にならないので、気にしないのがいいのかもと、みなさんのお答えを聞いて思
っているところです。


> PATIO さん
いつもありがとうございます。まさに知りたいのはそこのところでした。
マニュアルを読んでると、できるかも知れないという気になってくるし・・・

> aetosさん
いつもありがとうございます。PATIOさんと同じような返事になってしまいます
が、いつも的確なレスありがとうございます。
まず、実現可能?ということが一番大事ですし、マニュアルを読んでると、ひょっとし
て、アスペクト比を意識しないでコーディングできるようになってる?のかなとも思え
てきます。だってピクセル単位でなく、mm単位で座標を設定できるみたいだし・・
貴重なレスありがとうございました。

> tetrapod さん 
いつもありがとうございます。
> 上司「昔は画面上での1ピクセルは、縦横サイズが違ったんだよねー」
のほうが近い感じです。そこから、それだったら、グラフィックアニメーションは、ど
うしてるの?って私が、たぐってしまいました。

ロマ 2009/08/18(火) 21:49:31
上司の方と交流すべしと思い、書き込みを控えていましたが、
解決しましたので、以下雑感。

>> 上司「昔は画面上での1ピクセルは、縦横サイズが違ったんだよねー」
>のほうが近い感じです。そこから、それだったら、グラフィックアニメーションは、ど
>うしてるの?って私が、たぐってしまいました。

私としては、MM_TEXTで補正なしに正方形を描くのはNGです。

ASPECTX CGA Petzoldで検索してみてください。
CGA(640 x 200),EGA(640 x 350)下で16bitWindowsと格闘したらしい上司は貴重です。

-----------------------------

論理インチのDPIは、LOGPIXELSX/LOGPIXELSYで得られるものです。
物理インチのDPIは、HORZSIZEとHORZRES/VERTSIZEとVERTRESで得られるものです。
どちらを使うかは、設計上の方針です。場合によっては混合しても良いです。

物理インチの計算にはDCかICを使うか、あるいはMulDivを使うべきです。
または、MM_HIMETRICなど Metric Mapping Modeから求めても良いです。

ISLe 2009/08/18(火) 22:44:19
> CGA(640 x 200),EGA(640 x 350)下で16bitWindowsと格闘したらしい上司は貴重です。

もっと(日本では)メジャーなところでは、
NECのPC-9801シリーズが640x400を4:3ディスプレイに表示してました。

επιστημη [E-Mail] [HomePage] 2009/08/19(水) 16:37:31
×「蒼々たる」
○「錚々たる」

熱血 2009/08/19(水) 20:01:20
ロマさん、ISLeさん、επιστημηさん、レスありがとうございます。

画面の縦、横の対比について書いていただいている方がおられるようなので、ちょっ
と、アスペクト比という言葉について、調べてみました。
この、質問を上から順番によんでいただいている方は、
わたしが、ピクセルアスペクト比をアスペクト比といっていることに気がついていただ
けるとおもいますが、スポット的に見ていられる方は、画面の縦横比率だと思われて仕
方ないですね。
わたしの表現があいまいでした。すいません、今後気をつけます。
επιστημηさんもすいません、漢字まちがえてました。

ウキペディアより・・・
>ピクセルアスペクト比はアスペクト比における影響によるピクセル比率の事である。
>アスペクト比が”画角全体サイズの比率”を指すのに対してピクセルアスペクト比は”
>構成される1ドット、または1画素に対する比率”を指す。

古いスレッドには追加発言できません。