RenderTargetBitmap размыто - PullRequest
3 голосов
/ 02 июля 2011

Привет, я создаю изображение в памяти из Canvas, используя PngBitmapEncoder.

public void CaptureGraphic()
{
    Canvas canvas = new Canvas();
    canvas.SnapsToDevicePixels = true;
    canvas.Height = IMAGEHEIGHT;
    canvas.Width = IMAGEWIDTH;
    Draw(canvas);
    canvas.Arrange(new Rect(0, 0, IMAGEWIDTH, IMAGEHEIGHT));
    member.MemberImage = GetPngFromUIElement(canvas);
}

public static System.Drawing.Image GetPngFromUIElement(Canvas source)
{
    int width = (int)source.ActualWidth;
    int height = (int)source.ActualHeight;

    if (width == 0)
        width = (int)source.Width;
    if (height == 0)
        height = (int)source.Height;


    RenderTargetBitmap bitmap = new RenderTargetBitmap(width, height, 96d, 96d, PixelFormats.Pbgra32);
    bitmap.Render(source);

    PngBitmapEncoder enc = new PngBitmapEncoder();
    enc.Interlace = PngInterlaceOption.Off;
    enc.Frames.Add(BitmapFrame.Create(bitmap));

    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    enc.Save(ms);

    System.Drawing.Image image = System.Drawing.Image.FromStream(ms);

    ms.Flush();
    ms.Dispose();

    return image;
}

Затем я отправляю изображение на принтер, используя метод GDI + DrawImage ().Однако результат печати получается размытым.

Я пытался сопоставить исходный размер холста с напечатанным размером, чтобы избежать какого-либо масштабирования, так же я пытался сделать оригинал значительно больше, чтобы масштабированное изображение сохраняло качествооднако окончательное напечатанное изображение всегда размыто.

Может кто-нибудь предложить какие-либо предложения / альтернативы.У меня уже установлена ​​значительная подпрограмма печати GDI +, и переход к документам wpf пока недоступен.

Спасибо

Ответы [ 3 ]

0 голосов
/ 03 июля 2011

Думаю, я нашел ответ.

http://www.charlespetzold.com/blog/2007/12/High-Resolution-Printing-of-WPF-3D-Visuals.html

Мне просто нужно было увеличить размер изображения вместе с dpi и вуаля, что значительно увеличило размер файла!

0 голосов
/ 03 мая 2017

У меня была такая же проблема. Чтобы избежать размытого текста и линий, мне пришлось рисовать все со смещением 0,5 в направлении X и Y. Например, горизонтальная линия может быть

drawingContext.DrawLine(pen, new Point(10.5,10.5), new Point(100.5,10.5));

В моем случае я выполнял рендеринг на RenderTargetBitmap в другом потоке, чтобы улучшить производительность пользовательского интерфейса. Рендеринг растрового изображения затем фиксируется и рисуется в интерфейсе пользователя с помощью

drawingContext.DrawImage(bitmap, new Rect(0.5, 0, bitmap.Width, bitmap.Height));

Здесь мне потребовалось дополнительное смещение 0,5, но (как ни странно) только в направлении X, чтобы визуализированное изображение больше не выглядело размытым.

0 голосов
/ 03 июля 2011

Вы снимаете растровое изображение с разрешением 96 DPI. Вместо использования 96 в конструкторе RenderTargetBitmap попытайтесь соответствовать DPI вашего принтера. В качестве альтернативы вы можете выполнить математические вычисления и рассчитать разницу в ширине / высоте и соответственно изменить масштаб изображения в отчете (в результате изображение в отчете будет выглядеть меньше).

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