C# 如何从Uri打印图像?

C# 如何从Uri打印图像?,c#,wpf,printing,C#,Wpf,Printing,我试图打印一个使用Uri对象引用的JPEG文件,但遇到了一些困难。我发现在打印图像时,图像被略微裁剪,并被翻转和镜像。我猜是由于尺寸设置不当造成的,但不知道为什么会翻转和旋转。假设这是一个自然的奇怪现象,我试图通过对drawingContext对象应用转换来解决这个问题,但这会导致打印一个空白页。这是我的密码: public void Print(List<Uri> ListToBePrinted) { XpsDocumentWriter writer = P

我试图打印一个使用Uri对象引用的JPEG文件,但遇到了一些困难。我发现在打印图像时,图像被略微裁剪,并被翻转和镜像。我猜是由于尺寸设置不当造成的,但不知道为什么会翻转和旋转。假设这是一个自然的奇怪现象,我试图通过对drawingContext对象应用转换来解决这个问题,但这会导致打印一个空白页。这是我的密码:

public void Print(List<Uri> ListToBePrinted)
{
    XpsDocumentWriter writer = 
       PrintQueue.CreateXpsDocumentWriter(this.SelectedPrinter.PrintQueue);

    PrintCapabilities printerCapabilities = 
       this.SelectedPrinter.PrintQueue.GetPrintCapabilities();

    Size PageSize = 
       new Size(printerCapabilities.PageImageableArea.ExtentWidth,
                printerCapabilities.PageImageableArea.ExtentHeight);

    foreach (Uri aUri in ListToBePrinted)
    {
        BitmapImage anImage = new BitmapImage(aUri);

        //create new visual which would be initialized by image
        DrawingVisual drawingVisual = new DrawingVisual();

        //create a drawing context so that image can be rendered to print
        DrawingContext drawingContext = drawingVisual.RenderOpen();

        // Flips along X and Y axis (flips and mirrors)
        drawingContext.PushTransform(new ScaleTransform(-1, -1));

        drawingContext.DrawImage(anImage, new Rect(PageSize));

        drawingContext.Close();

        writer.Write(drawingVisual);
    }
}
公共作废打印(列表打印)
{
XpsDocumentWriter编写器=
PrintQueue.CreateXpsDocumentWriter(this.SelectedPrinter.PrintQueue);
打印能力打印能力=
这是.SelectedPrinter.PrintQueue.GetPrintCapabilities();
大小页面大小=
新尺寸(printerCapabilities.PageImageableArea.ExtendtWith,
printerCapabilities.PageImageableArea.ExtentheLight);
foreach(列表中的Uri aUri)
{
BitmapImage anImage=新的BitmapImage(aUri);
//创建将由图像初始化的新视觉对象
DrawingVisual DrawingVisual=新建DrawingVisual();
//创建图形上下文,以便可以渲染图像以进行打印
DrawingContext DrawingContext=drawingVisual.RenderOpen();
//沿X轴和Y轴翻转(翻转和镜像)
PushTransform(新的ScaleTransform(-1,-1));
drawingContext.DrawImage(动画,新矩形(页面大小));
drawingContext.Close();
writer.Write(drawingVisual);
}
}

任何帮助都将不胜感激-谢谢

你能做些类似于:

BitmapImage anImage = new BitmapImage(aUri);

Image image = new Image();
image.BeginInit();
image.Source = anImage;
image.EndInit();
image.Measure(PageSize);
image.InvalidateVisual();
然后只打印图像对象,因为它来自视觉。。。
您需要调用InvalidateVisual,以便调用OnRender,如果不这样做,将导致一个空白图像…

以下是我的结论:

public void Print(List<Uri> ListToBePrinted)
{
    XpsDocumentWriter writer =
        PrintQueue.CreateXpsDocumentWriter(this.SelectedPrinter.PrintQueue);

    PrintCapabilities printerCapabilities =
        this.SelectedPrinter.PrintQueue.GetPrintCapabilities();

    Size PrintableImageSize =
        new Size(printerCapabilities.PageImageableArea.ExtentWidth,
                 printerCapabilities.PageImageableArea.ExtentHeight);

    foreach (Uri aUri in ListToBePrinted)
    {
        DrawingVisual drawVisual = new DrawingVisual();

        ImageBrush imageBrush = new ImageBrush();
        imageBrush.ImageSource = new BitmapImage(aUri);
        imageBrush.Stretch = Stretch.Fill;
        imageBrush.TileMode = TileMode.None;
        imageBrush.AlignmentX = AlignmentX.Center;
        imageBrush.AlignmentY = AlignmentY.Center;

        using (DrawingContext drawingContext = drawVisual.RenderOpen())
        {
            // Flips along X and Y axis (flips and mirrors)
            drawingContext.PushTransform(new ScaleTransform(-1, 1, PrintableImageSize.Width / 2, PrintableImageSize.Height / 2));
            drawingContext.PushTransform(new RotateTransform(180, PrintableImageSize.Width / 2, PrintableImageSize.Height / 2)); // Rotates 180 degree

            drawingContext.DrawRectangle(imageBrush, null, new Rect(25, -25, PrintableImageSize.Width, PrintableImageSize.Height));
        }

        writer.Write(drawVisual);
    }
}
公共作废打印(列表打印)
{
XpsDocumentWriter=
PrintQueue.CreateXpsDocumentWriter(this.SelectedPrinter.PrintQueue);
打印能力打印能力=
这是.SelectedPrinter.PrintQueue.GetPrintCapabilities();
大小可打印图像大小=
新尺寸(printerCapabilities.PageImageableArea.ExtendtWith,
printerCapabilities.PageImageableArea.ExtentheLight);
foreach(列表中的Uri aUri)
{
DrawingVisual drawVisual=新建DrawingVisual();
ImageBrush ImageBrush=新的ImageBrush();
imageBrush.ImageSource=新位图图像(aUri);
imageBrush.Stretch=Stretch.Fill;
imageBrush.TileMode=TileMode.None;
imageBrush.AlignmentX=AlignmentX.Center;
imageBrush.AlignmentY=AlignmentY.Center;
使用(DrawingContext DrawingContext=drawVisual.renderropen())
{
//沿X轴和Y轴翻转(翻转和镜像)
PushTransform(新的ScaleTransform(-1,1,PrintableImageSize.Width/2,PrintableImageSize.Height/2));
drawingContext.PushTransform(新的RotateTransform(180,PrintableImageSize.Width/2,PrintableImageSize.Height/2));//旋转180度
drawingContext.DrawRectangle(imageBrush,null,new Rect(25,-25,PrintableImageSize.Width,PrintableImageSize.Height));
}
writer.Write(drawVisual);
}
}

图像有点模糊,但肯定可以接受。我仍然不确定为什么需要翻转或镜像我的图像。

我试图实现这一点,但导致了一个空白图像(有或没有image.InvalidateVisual())。