Как мне распечатать изображение с Uri? - PullRequest
0 голосов
/ 18 июня 2009

Я пытаюсь распечатать файл JPEG, на который я ссылаюсь, используя объект Uri, и у меня возникли некоторые трудности. Я обнаружил, что пока изображение печаталось, оно слегка обрезалось, переворачивалось и отражалось. Я предполагаю, что урожай был вызван неправильным заданием размера, но я не знаю, почему его переворачивают и поворачивают. Предполагая, что это была естественная странность, я попытался решить проблему, применив преобразование к объекту 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);
    }
}

Любая помощь будет принята с благодарностью - спасибо!

Ответы [ 2 ]

2 голосов
/ 23 июня 2009

Вот что у меня получилось:

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);
    }
}

Изображение немного размыто, но, безусловно, приемлемо. Я до сих пор не уверен, почему мое изображение нужно было перевернуть или отразить.

0 голосов
/ 18 июня 2009

Не могли бы вы сделать что-то вроде:

BitmapImage anImage = new BitmapImage(aUri);

Image image = new Image();
image.BeginInit();
image.Source = anImage;
image.EndInit();
image.Measure(PageSize);
image.InvalidateVisual();

Тогда просто напечатайте объект Image, так как он происходит от Visual ... Вам нужно вызвать InvalidateVisual, чтобы вызвать OnRender, если вы этого не сделаете, это приведет к пустому изображению ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...