0

700kb ファイルのイメージをプリンターに印刷しようとすると、120MB のデータがプリンターに送信されます。これは、プリンターが 120MB をスプールしていることからわかります。なぜこれが起こったのでしょうか?

PrintDocument.PrintPage のコードは次のとおりです。

private void PrintPage(object sender, PrintPageEventArgs ev)
{
                sw.WriteLine("start,PrintPage," + DateTime.Now.ToLongTimeString());

                if (_running && _currentPage != null)
                {
                    RectangleF PrintArea = ev.Graphics.VisibleClipBounds;
                    RectangleF NewImageSize = new RectangleF();
                    Double SF = Convert.ToDouble(PrintArea.Width) / Convert.ToDouble(_currentPage.Width);
                    NewImageSize.Width = Convert.ToInt32(_currentPage.Width * SF);
                    NewImageSize.Height = Convert.ToInt32(_currentPage.Height * SF);

                    //You can influence the quality of the resized image 
                    ev.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                    ev.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Default;
                    ev.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Default;
                    //Draw the image to the printer 
                    ev.Graphics.DrawImage(_currentPage, NewImageSize);
                    _currentPage.Dispose();
                    _currentPage = null;

                    //Trace.WriteLine(string.Format("IsFinished {0}, Count {1}", (_queue.IsFinished ? "True" : "False"), _queue.Count));
                    ev.HasMorePages = (!((_queue.IsFinished) && (_queue.Count == 0)));                    
                }
                sw.WriteLine("end,PrintPage," + DateTime.Now.ToLongTimeString());

            }
4

2 に答える 2

1

印刷された画像が画像ファイルよりも大きくなる理由は 2 つあります。

画像ファイルは圧縮されている可能性があります。JPEG 画像の場合、通常は 1/10 ~ 1/20 程度に圧縮されます。画像をロードすると、約 10 MB に圧縮解除されます。

画像をプリンターに送信するときに、画像のサイズを変更しています。多くの場合、プリンターの解像度は非常に高くなっています。画像の解像度が 300 PPI 程度で、プリンターの解像度が 1000 PPI 程度の場合、画像は元のサイズの約 10 倍にサイズ変更されます。

于 2009-07-22T18:48:03.987 に答える
0

.Net についてはよくわかりませんが、System.Drawing 関数は GDI+ の上に構築されていると思います。GDI+ は、レンダリングの多くを CPU で行い、ビットマップをターゲット デバイスに転送します。最新のシステムでは、グラフィック ディスプレイを対象とする場合、これで問題ありません。残念ながら、デバイスの機能 (またはそのドライバーの機能) を利用する機会はあまりありません。

たとえば、多くのプリンタは JPEG と PNG を直接サポートしています。GDI+ ではなく GDI を使用する場合、プリンタがそのようなサポートを持っているかどうかを判断し、元の JPEG を転送して、プリンタに圧縮解除とサイズ変更を行わせることができます。それはまだいくつかの作業であり、そのようなサポートを持たないプリンターには低速の方法が必要です。

于 2009-08-03T00:17:41.087 に答える