【问题标题】:Unable to print my bitmap on landscape with WPF无法使用 WPF 在横向上打印我的位图
【发布时间】:2014-08-28 10:28:31
【问题描述】:

我正在使用 bing maps sdk 编写一个小的 wpf 应用程序。

我正在从我的地图生成位图,我希望能够在 A4 纸上打印这张地图。

我尝试了几种方法,但我的照片总是纵向打印。

这是我使用的代码:

MemoryStream ms = new MemoryStream();  
myImage.Save(ms,myImage.RawFormat);
ms.Seek(0, SeekOrigin.Begin);  
BitmapImage bi = new BitmapImage();  

bi.BeginInit();
bi.CacheOption = BitmapCacheOption.OnLoad;
bi.StreamSource = ms;  
bi.EndInit();

var vis = new DrawingVisual();
var dc = vis.RenderOpen();
dc.DrawImage(bi, new Rect { Width = bi.Width, Height = bi.Height });
RotateTransform rotateTransform = new RotateTransform(90);
dc.PushTransform(rotateTransform);
dc.Close();
var pdialog = new PrintDialog();

pdialog.PrintTicket.PageOrientation = PageOrientation.Landscape;
if (pdialog.ShowDialog() == true)
{
    pdialog.PrintTicket.PageOrientation = PageOrientation.Landscape;
    pdialog.PrintVisual(vis, "My Image");
}

注意:myImage 是我的位图文件。 注意:我添加了 90° 变换,但没有效果。

有人有什么想法吗?

非常感谢:)

【问题讨论】:

  • 测试了您的代码,它按预期工作,没有 RotateTransform(无论如何都无效)并且没有设置两次方向。另请注意,建议在 using statement 中创建 IDisposable 对象,例如 using (var dc = vis.RenderOpen()) { ... }。然后您不必明确关闭/处置它们。
  • 所以,我可能是用 Microsoft XPS 打印机虚拟打印的...我会尝试使用 pdf 打印机。
  • @WalterFabioSimoni 关于解决方案的任何消息?

标签: c# wpf image printing bitmap


【解决方案1】:

我最近在Printing 命名空间上花费了大量时间,在像 Clemens 那样复制代码之后,我得到了预期的结果。我也同意您应该按照 Clemens 的建议使用 using 声明。

此外,我在测试自己的代码时遇到了打印到 XPS 打印机和普通打印机之间的奇怪活动。试试这样的:

MemoryStream ms = new MemoryStream();  
myImage.Save(ms,myImage.RawFormat);
ms.Seek(0, SeekOrigin.Begin);  
BitmapImage bi = new BitmapImage();  

bi.BeginInit();
bi.CacheOption = BitmapCacheOption.OnLoad;
bi.St

reamSource = ms;  
bi.EndInit();

using(var vis = new DrawingVisual())
{
    var dc = vis.RenderOpen();
    dc.DrawImage(bi, new Rect { Width = bi.Width, Height = bi.Height });
    dc.Close();

    var pdialog = new PrintDialog();
    if (pdialog.ShowDialog() == true)
    {
        pdialog.PrintTicket.PageOrientation = PageOrientation.Landscape;
        System.Printing.ValidationResult result = pdialog.PrintQueue.MergeAndValidatePrintTicket(pdialog.PrintQueue.UserPrintTicket, pdialog.PrintTicket);
        pdialog.PrintQueue.CurrentJobSettings.CurrentPrintTicket = result.ValidatedPrintTicket;
        pdialog.PrintQueue.Commit();

        if(pdialog.PrintQueue.IsXpsDevice)
        {
            var writer = PrintQueue.CreateXpsDocumentWriter(pdialog.PrintQueue);
            writer.Write(vis, pdialog.CurrentJobSettings.CurrentPrintTicket);
        }
        else
        {
            pdialog.PrintVisual(vis, "My Image");
        }
    }
}

我意识到可能会有一些冗余,但这是我遵循的类似方法,我的代码应该用于让果汁流动,如果它本身不是解决方案,希望它会引导您找到解决方案。另一个虽然,尝试打印到一个真正的打印机也测试两个打印源产生相同的输出。我经常发现物理打印机给我的输出与虚拟打印机不同。

另外,我找到了this,虽然我不确定它是否有用。

如果您有任何问题,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多