PrintDocument Spooling to Printer是一种很大的方式

时间:2009-07-22 18:13:20

标签: .net printing system.drawing

当我尝试将图像打印到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());

            }

2 个答案:

答案 0 :(得分:1)

打印图像大于图像文件有两个原因:

图像文件很可能是压缩的。如果它是JPEG图像,它通常被压缩到它的大小的大约1/10 - 1/20。当您加载图像时,它会被解压缩到10 MB左右。

将图像发送到打印机时,您正在调整图像大小。打印机的分辨率通常很高。如果图像的分辨率大约为300 PPI,并且打印机的分辨率大约为1000 PPI,则图像的大小将调整为原始大小的十倍。

答案 1 :(得分:0)

我对.Net不太了解,但我相信System.Drawing函数是建立在GDI +之上的。 GDI +在CPU上进行大量渲染,并将位图传输到目标设备。在现代系统上,当瞄准图形显示时,这很好。不幸的是,它没有太多机会利用设备的功能(或其驱动程序的功能)。

例如,许多打印机直接支持JPEG和PNG。使用GDI而不是GDI +时,您可以确定打印机是否具有此类支持,并传输原始JPEG并让打印机进行解压缩和调整大小。它仍然是一些工作,你仍然需要那些没有这种支持的打印机的慢速方法。