ネタもと:件名:ドット単位で印刷-プリンタの解像度に合わせて
売り言葉に買い言葉で返したのは、「送信」ボタンを押した瞬間に後悔した。
しかしね。それでも、やっぱり、腹立ったのよ。
某所で、「チラシの裏にでも」ってのを見て、なんじゃらホイ?と見てみたわけですが。でも、なんか、面白そうじゃないですか。
んで、まず、最初。プリンタの解像度に合わせて、ドット単位で、線をGraphicsに描画して、印刷したいと思っております。
と、あるわけですが、ここで、「ドット単位って、プリンタ側の?グラフィック オブジェクトの?」と、疑問が発生するわけです。そして、GraphicsUnit.Document
を見て、これを MSDN で調べて、描画している単位を間違っているんじゃないか?と、思ったわけです。
まぁ、まず、「ドット」が、プリンタ側のものなのか、グラフィック オブジェクト側のものなのか、それを確認したいかな、という思いから、ここで言われている「ドット」って、なんですか?
と、聞いてみました。で、答えがピクセルです。
だけですか。。。
まぁ、こちらの意図は伝わらなかっただろうな、と思ったので、だから、なんの?まず、あなたが思っているであろう、1ドットがインク1滴から構成されているのか、確認が必要ではないですか?
と、続けました。
ここで、私は「インク1滴による1ドットは、プリンタの最小描画単位ではない」と、考えています。ここで「最小描画単位」は、フル カラーを表現するために必要なデバイス(紙)上の大きさ、を意味します。なぜなら、インクは4色有り、3原色の組合せで色は表現されるからです。
CRT (カソード レイ チューブ)の場合、1描画単位は、3つの光点から出来ています。つまり、Red/Green/Blue です。白を表示しようとすると、必ず3光点が光らなければなりません。したがって、グラフィック オブジェクト上の白1ドットは、CRT では3ドットで構成されます。PC-6001 等を触ったことがある方なら、SCREEN 4 でカラーを表示する方法を思い出していただければよいかと。
古いカラー インクジェット プリンタも同じです。最近のものも、粒子は細かくなっただろうけど、同じように、複数のインクから構成されているだろうから、「1ドット」の定義が必要だろう。そういう思いがあったわけです。
さて、ここで、対象のプリンタが、レーザーや白黒、熱転写(感熱紙)、インパクト、昇華型、プロッタ(まぁ、これはないか)である可能性を、わざと、考えていません。はい、わざとです。だって、そんなこと、質問文に書いてへんやん。
しかし、その返答は、ドットや、ピクセルが、プリンタの解像度の最小単位を、指していることは、わかっていての逆質問なのですね?
ということなので、私が疑問に思っていることを、まったく疑わず、「グラフィック オブジェクトの1ドットはプリンタの1描画点である」と、考えられていたようです。
はい。思いこみの1点目。
で、次に、出来ました報告があって、そこには、こう書かれています。e.Graphics.PageUnit = GraphicsUnit.Millimeter;
おい。単位はミリメートルかよ。
ツッコミ点はまだあります。
IntPtr hDC = g.GetHdc();
MoveToEx(hDC, 100, 500, IntPtr.Zero);
LineTo(hDC, 100, 1000);
まて。これで、GDI+ と、gdi32 の共存
ですって?つか、要は、プリンタのデバイスコンテキストを捕まえて、そこに直接描画。すれば、いいって事なんですかね?
ってのが、これで出来たって?
白状すると、PageUnit の設定については、数時間悩みました。
こんなグラフを描きました。


分散を描けるグラフコンポーネントはあっても、そこに閾値を引くことが出来るコンポーネントは、見つけることが出来なかった。しょうがない、作ろう、ってなって。
いや、焦ったよ。最初、同じように GraphicsUnit.Millimeter を指定していて、単位5の太さの線と10の太さの線を引いたら…5ドットと10ドットを期待していたのに、ディスプレイ上で5ミリメートルと10ミリメートルですよ!!
数回 MSDN のその辺りの記述を読み直し、やっとこれが「描画するときの単位」を指定するものであり、それ以降の数値は、この単位を基準に描画されるということがわかりました。
なんでこんなことするんだ?
そっかぁ。紙に印刷するなら、単位指定できた方が、「このプリンタの解像度はいくらだから、何ドットで描かないと細くて見えない」なんてことを考えなくて済むんだ!!そういえば、このグラフも、ウェブで表示して、印刷もするんだから、両方を同じルーチンで、PageUnit だけ換えれば、「どっちだから何ドット」って計算をしなくてもいいんだ!!すっげ~!楽ちん!!
なんてことがあったので、「おいおい、単に PageUnit の指定を間違えているだけだろう?」ってのが、2点目。
あと、GDI に渡すグラフィック オブジェクトを、GDI+ から取っているんですよね。それで、どうしてプリンタのデバイスコンテキストを捕まえ
たことになるの?ってのが3点目。
これ書きながら気がついた。当時も気になっていたけど、今、確認した。GID で描くとき、Pen の指定をしてないやん!!デフォルトを使用ですか。たまたまデフォルトが、1ビット幅の黒だったのね。
これだけの疑問点を内包しながら、頭悪いんですか?
とかいわれた日にゃ、そのまま返したくなりますよ。
いや、その後の怒濤のポストは、私の方が冷めた(^-^;
なので、携帯からコソコソ送ったんだけど。。。PageUnit=Pixel では、画像の解像度にしかならないでしょ?
ってかorz
この時点で、送られてきているグラフィック オブジェクトが、何を基に作られたオブジェクトなのか、理解していないことがわかった。そう。プリンタから送られてきた情報を基に作られた画像なんです。「ここに描き込んだら、デバイスに送信しますよ」って、オブジェクトなんです。
つかね。
怒濤のカキコの中で、考える余裕なんてなかったんじゃない??これは、ある意味可哀想だよ。
まぁ、13ページのをもっと早く送れていれば、3~12ページはなかったかもしれないね。
みんなが怒るのももっともだよ。だけど、勝手な思いこみで、本当の解決を得る機会を失うのは本人です。もう、放っておいて上げることにしませんか?
GDI と GDI+ でプリンタ ドライバから上がってくる数値が違うのか?という問いに「そう思う」と答えた後、うちとしては、お付き合いのある数社のプリンタ屋さんと、技術的な話をし始めました。
とあります。
「あちゃ~。。。やっちゃいましたね」というのが、感想。
つまり、「これこれの実験をしたところ、こういう結果を得た。これはドライバの作りが悪いと思う。」って、やっちゃったんでしょうね。まぁ、ね。日本のドライバ メーカーで、Windows Hardware Quality Labs 通しているメーカーって、ほとんどないから・・・あれ?これ、ハードウェア?ドライバは?ドライバは、署名するだけでいいのかな?あ、ドライバとハードウェア込みね。はい。WHQL 通してないから、ドライバ屋さんも最初は「え?そうなんですか?」って、聞くだろうね。
でもねぇ。GDI+ って、GDI のラッパーなんですよ。GDI で返ってくる値と GDI+ で返ってくる値が違うってことは、Microsoft に責任がある、つまりフレームワークのバグってことですよ。そこを、プリンタ屋さんと話を…って。絶対叩かれるぞ、と思って、ちょっと可哀想になりました。で。案の定、叩かれたみたいで。。。
でもね。すごいですよね。その後、ちゃんと謝罪と、検証結果の報告をしてくださっているんですよ。すごい、勇気の要ることですよ。絶対、見習わなきゃいけないところですね。
投稿日時 : 2006年12月29日 19:29