- PR -

C#でPNGファイルを生データのまま印刷するには

投稿者投稿内容
深山
ベテラン
会議室デビュー日: 2006/05/09
投稿数: 66
お住まい・勤務地: 都内某所
投稿日時: 2006-05-09 14:05
初めて投稿させていただきます。

下記に関してご存知の方がいらっしゃいましたらご教授お願いします。

PNG形式の画像を印刷したいのですが、下記のソースではプリンタのジョブを見ていると転送されるデータ量を見ていると、BMPに変換したデータを転送しているように見えます。

private void prtDoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
  // イメージ取得
  Image img = Image.FromFile(@"hoge.png");

  // イメージ描画
  e.Graphics.DrawImage(img, 0, 0, img.Size.Width, img.Size.Height);

  // 破棄
  img.Dispose();

  // 印刷終了
  e.HasMorePages = false;
}

仕様では、1つのジョブで100枚以上印刷する場合もあり、印刷をするのに時間がかかってしまい困っています。

転送データの増加の原因はImageオブジェクトがファイルを読込んだ時点で、BMP変換しているためだと思うのですが、もしかしたら見当違いかも知れません。

生データ(PNGデータ)のままプリンタにデータを転送することは出来ないのでしょうか?

[環境]VS2003/WindowsXP(Pro)
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-09 14:18
引用:

深山さんの書き込み (2006-05-09 14:05) より:

生データ(PNGデータ)のままプリンタにデータを転送することは出来ないのでしょうか?



きっと、PNGフォーマットのデータを受け取ったプリンターが、イメージを展開でき
れば可能なんでしょうね。
実際、最近のプリンターって、そこまでできるんでしょうか?

[ メッセージ編集済み 編集者: R・田中一郎 編集日時 2006-05-09 14:19 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-05-09 14:22
引用:

きっと、PNGフォーマットのデータを受け取ったプリンターが、イメージを展開でき
れば可能なんでしょうね。
実際、最近のプリンターって、そこまでできるんでしょうか?


でしょうね。
ん〜きっと出来ないでしょうね。デバイスに依存しないためのデバイスコンテキストなのですから。
_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-09 14:24
引用:

深山さんの書き込み (2006-05-09 14:05) より:

下記のソースではプリンタのジョブを見ていると転送されるデータ量を見ていると、BMPに変換したデータを転送しているように見えます。


プリンタ側の都合を考えると、どのファイル形式だろうと同じだと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
なせ
常連さん
会議室デビュー日: 2006/01/06
投稿数: 41
お住まい・勤務地: おおさか
投稿日時: 2006-05-09 14:27
引用:

深山さんの書き込み (2006-05-09 14:05) より:
転送データの増加の原因はImageオブジェクトがファイルを読込んだ時点で、BMP変換しているためだと思うのですが、もしかしたら見当違いかも知れません。

生データ(PNGデータ)のままプリンタにデータを転送することは出来ないのでしょうか?



生データのまま送っても画像としては表示されないでしょうねぇ。。
PNGは画像をファイルとして保管するときのフォーマットであって
プリンタで画像を出力する際のフォーマットではありませんからね
取り扱えるのは生の画像のデータのみかと思います。

#そういうプリンタへの圧縮転送の方式とかあったら便利なのにねぇ
とっちゃん
大ベテラン
会議室デビュー日: 2005/07/19
投稿数: 203
投稿日時: 2006-05-09 15:03
で、出遅れた(^^;

私の知る限りでは「PNGファイルフォーマット」を「画像イメージ」として直接扱える「ハードウェアデバイス」は存在していません(プリンタ以外も含めてね)。

まぁ、ドライバレベルまで入れてデバイスといってもいいのなら、対応してるのもあるでしょうけど...(^^;
残念ながらプリンタで PNG画像形式(フォーマットではないので注意!)を取り扱えるものって言うのは今のところ聞いてないですねぇ...

で本題ですが、大量の印刷を行なうことを想定しているのであれば、まずは%TEMP%の存在するドライブの空き容量を大きくして、デフラグしてみてください。
これだけで大幅に機能改善する場合があります。

巨大な場合(たとえば、A1とかの大判)はこれでは解決できない場合もありますが...

あと、ハード系の質問の場合は、該当するハードウェアも込みではじめて環境となります。特にプリンタは機種(メーカーが一緒かは関係なし)によっても、全く挙動が異なる場合があります。
また、ドライバのバージョンや、ハードウェアとしての出荷時期などによっても大きく仕組みが変わっている場合があります。

そのため、同一メーカーの同一機種でもドライバによってなんていうのもありますし、新旧となると殆ど比較の意味すらないというくらい違ってる場合もあります。

最近では、最廉価機種が底上げされているため同一系列なら機種による違いは少なくなりましたが、それでも解像度やインクの数などなどさまざまな影響箇所があります。

・PNG画像形式の取り扱い問題について
GDI(GDI+ではない)の扱う透過の概念の問題により、PNG画像として意図したとおりに表現されない場合があります。
これは、GDI の仕様からくる制約事項となるため、GDI+ では改善される場合がありますが、GDI+ は、画面出力以外の実装がないため、印刷の場合は GDI コマンドに変換されることになり、結果としてはうまくいきません。

Vistaでは、WPF(XPSってやつですね)を用いることにより GDI/GDI+ とは違う次元のデータを渡せるようになるため、状況が変わってくるかもしれません。



殆ど情報が流れていないので、どうなってるんだかさっぱりわかりません(^^;

_________________
// とっちゃん(高萩 俊行)@わんくま同盟
// とっちゃん’Blog
// MS-MVP for Developer Tools - Visual C++
// WindowsInstallerの話題はhttp://www.freeml.com/msiまで
深山
ベテラン
会議室デビュー日: 2006/05/09
投稿数: 66
お住まい・勤務地: 都内某所
投稿日時: 2006-05-09 16:18
R・田中一郎さん・囚人さん・じゃんぬねっとさん・なせさん・とっちゃんさん
みなさん返信ありがとうございます。

引用:
R・田中一郎さんの書き込み (2006-05-09 14:18)

きっと、PNGフォーマットのデータを受け取ったプリンターが、イメージを展開できれば可能なんでしょうね。
実際、最近のプリンターって、そこまでできるんでしょうか?


そうですね。自分も出来ないなと思います。


引用:
なせさんの書き込み (2006-05-09 14:27)

#そういうプリンタへの圧縮転送の方式とかあったら便利なのにねぇ


本当にそう思います。圧縮転送の方式がISOなどで規格を作って欲しいですね。

引用:
とっちゃんさんの書き込み (2006-05-09 15:03)

で本題ですが、大量の印刷を行なうことを想定しているのであれば、まずは%TEMP%の存在するドライブの空き容量を大きくして、デフラグしてみてください。
これだけで大幅に機能改善する場合があります。


とっちゃんさん、改善方法まで挙げてもらえてありがとうございます。ドライブをデフラグするだけで改善できるとは知れませんでした。


本来なら、別スレッドを立てるべきだと思うのですが、このまま質問させてもらいます。
C#からAPIの話になってしまうのですが、

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpgdi/html/_win32_stretchdibits.asp

上記のURLの説明では、

「コピー元イメージとして JPEG と PNG(Portable Network Graphics)の各イメージを渡せるよう拡張されました」

という一文を読んだ時は、APIを駆使すれば出来るのでは!?と淡い期待をしたのですが、この場合も、

引用:
囚人さんの書き込み (2006-05-09 14:22)

ん〜きっと出来ないでしょうね。デバイスに依存しないためのデバイスコンテキストなのですから。


との、ご指摘の観点から考えると生の画像のデータが転送されるということですよね?
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-05-09 16:39
引用:

「コピー元イメージとして JPEG と PNG(Portable Network Graphics)の各イメージを渡せるよう拡張されました」

という一文を読んだ時は、APIを駆使すれば出来るのでは!?と淡い期待をしたのですが、この場合も、

引用:

囚人さんの書き込み (2006-05-09 14:22)

ん〜きっと出来ないでしょうね。デバイスに依存しないためのデバイスコンテキストなのですから。



との、ご指摘の観点から考えると生の画像のデータが転送されるということですよね?


「生の画像」というのを何を指して仰っているかが分かりませんが、多分そういう事です。
JPEG や PNG はあくまで「画像を圧縮したもの」であり「画像」ではりません。「画像」として扱うには展開しないといけません。

#
最近のプリンタはデジカメのカードを直に指して印刷できるから、ごにょごにょすればあるいは!?
そうなると、デバイスコンテキストなんか使えないから、FTP みたいに、プリンタにファイルをアップロード…とか^^;。

_________________
囚人@わんくま同盟
囚人のジレンマな日々

[ メッセージ編集済み 編集者: 囚人 編集日時 2006-05-09 16:43 ]

スキルアップ/キャリアアップ(JOB@IT)