使用PrintDocument打印图像.如何调整图像以适合纸张尺寸

Hap*_*ppy 29 c# printing printdocument

在C#中,我尝试使用PrintDocument类使用以下代码打印图像.图像宽度为1200像素,高度为1800像素.我正在尝试使用小型zeebra打印机在4*6纸张中打印此图像.但该程序只打印4*6的大图像.这意味着它没有根据纸张尺寸调整图像!

     PrintDocument pd = new PrintDocument();
     pd.PrintPage += (sender, args) =>
     {
           Image i = Image.FromFile("C://tesimage.PNG");
           Point p = new Point(100, 100);
           args.Graphics.DrawImage(i, 10, 10, i.Width, i.Height);
     };
     pd.Print();
Run Code Online (Sandbox Code Playgroud)

当我使用"窗口打印"打印相同的图像时(右键单击并选择打印,它会自动缩放到纸张大小并正确打印.这意味着所有内容都来自4*6纸张.)我如何在C#程序中执行相同的操作?

BBo*_*Boy 33

传递给DrawImage方法的参数应该是您希望纸张上的图像大小而不是图像本身的大小,DrawImage命令将为您处理缩放.可能最简单的方法是使用DrawImage命令的以下重写.

args.Graphics.DrawImage(i, args.MarginBounds);
Run Code Online (Sandbox Code Playgroud)

注意:如果图像的比例与矩形不同,则会使图像歪斜.对图像大小和纸张大小的一些简单数学运算将允许您创建一个适合纸张边界的新矩形,而不会使图像偏斜.

  • 这应该是答案!感谢您的解决方案,它按预期工作. (2认同)

psy*_*opz 24

不要践踏BBoy已经不错的答案,但我已经完成了保持宽高比的代码.我接受了他的建议,所以他应该得到部分功劳!

PrintDocument pd = new PrintDocument();
pd.DefaultPageSettings.PrinterSettings.PrinterName = "Printer Name";
pd.DefaultPageSettings.Landscape = true; //or false!
pd.PrintPage += (sender, args) =>
{
    Image i = Image.FromFile(@"C:\...\...\image.jpg");
    Rectangle m = args.MarginBounds;

    if ((double)i.Width / (double)i.Height > (double)m.Width / (double)m.Height) // image is wider
    {
        m.Height = (int)((double)i.Height / (double)i.Width * (double)m.Width);
    }
    else
    {
        m.Width = (int)((double)i.Width / (double)i.Height * (double)m.Height);
    }
    args.Graphics.DrawImage(i, m);
};
pd.Print();
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,但我用args.PageBounds替换了args.MarginBounds (5认同)

Ton*_*nyM 6

BBoy提供的解决方案运行良好.但在我的情况下,我不得不使用

e.Graphics.DrawImage(memoryImage, e.PageBounds);
Run Code Online (Sandbox Code Playgroud)

这将仅打印表单.当我使用MarginBounds时,即使表格小于显示器屏幕,它也会打印整个屏幕.PageBounds解决了这个问题.感谢BBoy!