何となく Blog by Jitta
Microsoft .NET 考

目次

Blog 利用状況
  • 投稿数 - 591
  • 記事 - 18
  • コメント - 2182
  • トラックバック - 183
ニュース
  • 検索エンジンで来られた方へ:
    お望みの情報は見つかりましたか? よろしければ、コメント欄にどのような情報を探していたのか、ご記入ください。
It's ME!
  • はなおか じった
  • 世界遺産の近くに住んでます。
  • Microsoft MVP for Visual Developer ASP/ASP.NET 10, 2004 - 9, 2009
サイト内検索
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

ネタもと:件名:ドット単位で印刷-プリンタの解像度に合わせて

売り言葉に買い言葉で返したのは、「送信」ボタンを押した瞬間に後悔した。

しかしね。それでも、やっぱり、腹立ったのよ。

某所で、「チラシの裏にでも」ってのを見て、なんじゃらホイ?と見てみたわけですが。でも、なんか、面白そうじゃないですか。

んで、まず、最初。プリンタの解像度に合わせて、ドット単位で、線を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
コメント
  • # re: 今だから書いておく
    Oganc
    Posted @ 2006/12/29 22:21
    Ognacです。
    件の記事は,私の質問投稿で終わっています。ご存知でしたら教えて欲しいのですが、
    一連の流れから、
    ピクセルとDotと解像度は独立の単位系で,混合色を構成するときも,一滴の大きさを一定にすることで、解像度を一定にしている。
    と理解しました。
    ところが,417さんの投稿で

    >色の着色は、各色を網点に分解し
    >インクが重なっている所もあれば、重なっていない所もあります。
    少しずらして印刷可能ならば解像度の理解が違ってきます。
    網点という概念がでてきて,混乱したままです。
    ご存知でしたら情報の程,宜しくお願います。
  • # re: 今だから書いておく
    pmpm
    Posted @ 2006/12/30 5:54
    リンク先の荒れ具合を持ち直していく様は
    ある種の感動映画を見終わったかのような
    恍惚感を得られました素晴らしい
  • # re: 今だから書いておく
    Jitta
    Posted @ 2006/12/31 21:16
    Ognacさん、pmpmさん、コメントありがとうございます。

    キヤノンの回答が、こちらの意図からずれているように思うので、再問い合わせをしようと思っているのですが、おそらく、同じような質問になると思います。また、ここででも報告します。


    > ある種の感動映画を見終わったかのような恍惚感を得られました
    ですね。豹変ぶりが、「本当に同一人物?」という声もあるのですが、そんな野暮な疑問はもたないでいましょう。
  • # re: 今だから書いておく
    刈歩 菜良
    Posted @ 2007/01/04 16:37
    私もリンク先を一気に読破しちゃいました。
    「口は災いのもと」なんですね。
    意図するしないにかかわらずってとこが怖いです。
    とっても勉強になりました。
    私も気をつけよ。

    # 確かに、最後の収束ぶりは感動的です。
  • # re: 今だから書いておく
    Jitta
    Posted @ 2007/01/07 7:58
    刈歩 菜良さん、コメントありがとうございます。

    > 「口は災いのもと」なんですね。
    はい。「短気は損気」です。
  • # re: 今だから書いておく
    Jitta
    Posted @ 2007/01/07 8:01
    キヤノンへ、改めて、次のように送りました。
    >>>>>
     私の書き方が悪く、お尋ねしたいことと少々ずれておりました。お手間をかけますが、もう一度お答え願えませんでしょうか。


     今回、質問するに至った理由についてですが、@IT というサイトでの、質問が発端となっております。
    発端となった質問 (URL)

     本来の事項と違うことでスレッドの大半が費やされていますので、要点だけ説明いたします。

    元の質問:
     .NET Framework で、印刷時に1ドットの線が引きたい。どうすれば可能か。

    私の、キヤノン様への質問に至った理由:
     @IT での質問主は、インク1滴がコンピュータの1画素にあたると考えていらっしゃったようです。しかし、私は、CRT が RGB 3つの描画点で1ドットを構成しているように、インク1滴が印刷上の1ドットを構成しているわけではないと思いました。

     私が尋ねたいと思ったことは、たとえば、9600ドット×9600ドットで、フルカラーの絵を用意したとき、画面上の1ドットが印刷物の1描画点に相当する解像度で、1インチ四方の絵を描くことが出来るか、ということです。
     あるいは、フルカラーの色を表現するために、インク1滴で構成される点が、いくつ必要ですか。


     日をおいてしまい、誠に申し訳ございませんが、ご回答のほど、お願いいたします。
  • # re: 今だから書いておく
    backdoor
    Posted @ 2007/01/10 16:03
    亀レス失礼。途中で熱くなった馬鹿者です。

    >でもね。すごいですよね。その後、ちゃんと謝罪と、検証結果の報告をしてくださっているんですよ。

    そう言われれば見直さなくてはいけないかも知れませんが、個人的には「今更なにを・・・」と思います。

    別に根に持っている訳ではありませんが、冒頭の完全な独りよがりの記載内容を見るとnet上ではお付き合いしたくない香具師の一人ということに変わりはありませんね。

    このBLOG記事を拝見し、Jittaさんのスタンスに頭が下がりました。これからも頑張って下さい。
  • # re: 今だから書いておく
    Jitta
    Posted @ 2007/01/11 21:31
    キヤノンのサポートより、返答がありました。
    > インク1滴が印刷上の1ドットを構成しているわけではないと思いました。
    この理解で正しい、ということです。

     Ognacさんの質問は、どちらかというと、
    > フルカラーの色を表現するために、インク1滴で構成される点が、いくつ必要ですか。
    こっちになると思うのですが、これについては回答できる材料がない、ということでした。

     ですが、あちらで紹介されているページにもありましたが、横方向(ヘッドが動く方向)の解像度と、縦方向(用紙が動く方向)の解像度が違うものでは、横方向にはドットを重ねて印刷しているようです。キヤノンのページにも、そういうイメージ図がありました。
     で、ごく最近のものでは、縦も横も、同じ解像度なんですよね(^-^; どうなっているんだろう?


    > Jittaさんのスタンスに頭が下がりました。
    スタンスは、そのうち自己紹介ページにまとめるつもりです(今そんなページ無いよ)。
タイトル  
名前  
Url
コメント