首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RenderTargetBitmap低图像质量问题

RenderTargetBitmap低图像质量问题
EN

Stack Overflow用户
提问于 2018-01-23 07:18:58
回答 1查看 2.5K关注 0票数 2

我尝试使用方法生成300 dpi图像。

当我尝试使用RenderTargetBitmap renderTargetBitmap =新RenderTargetBitmap(315, 195, 300, 300, PixelFormats.Pbgra32);

图像变得非常大。

怎么修呢?

代码语言:javascript
复制
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(315, 195, 96, 96, PixelFormats.Pbgra32);
renderTargetBitmap.Render(gridCard);
PngBitmapEncoder pngImage = new PngBitmapEncoder();
pngImage.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
using (Stream fileStream = File.Create(path))
{
    pngImage.Save(fileStream);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-23 08:35:30

我需要缩放位图的大小,以所需的DPI (即300)除以默认DPI (即96)。

代码语言:javascript
复制
double w = 315;
double h = 195;
double dpi = 300;
double scale = dpi / 96;

RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(
    (int)(w * scale), (int)(h * scale), dpi, dpi, PixelFormats.Pbgra32);

更新#1完全解决方案(将WPF控件打印为专用打印机MAGiCARD Enduro 3e的proxi卡)

代码语言:javascript
复制
private void BtnPrint_Click(object sender, RoutedEventArgs e)
{
   try
   {
       var size = GetElementPixelSize(gridCard);
       double w = size.Width;
       double h = size.Height;
       double dpiScale = 300.0 / 99.9;
       double dpiX = 300.0;
       double dpiY = 300.0;
       RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(Convert.ToInt32((w) * dpiScale), Convert.ToInt32((h) * dpiScale), dpiX, dpiY, PixelFormats.Pbgra32);

       renderTargetBitmap.Render(gridCard);

       PngBitmapEncoder pngImage = new PngBitmapEncoder();
       pngImage.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
       var biRotated = new BitmapImage();
       using (Stream fileStream = new MemoryStream()) 
       {
            pngImage.Save(fileStream);
            fileStream.Seek(0, SeekOrigin.Begin);

            biRotated.BeginInit();
            biRotated.CacheOption = BitmapCacheOption.OnLoad;
            biRotated.StreamSource = fileStream;
            // biRotated.Rotation = Rotation.Rotate90; // if you need it
            biRotated.EndInit();
       }

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

       var pdialog = new System.Windows.Controls.PrintDialog();
       if (pdialog.ShowDialog() == true)
       {
           pdialog.PrintVisual(vis, "Proxy-card");
          }
   }
   catch (Exception ex)
   {
       System.Windows.MessageBox.Show("Print error " + ex.Message);
   }
}

// https://stackoverflow.com/questions/3286175/how-do-i-convert-a-wpf-size-to-physical-pixels
public Size GetElementPixelSize(UIElement element)
{
    Matrix transformToDevice;
    var source = PresentationSource.FromVisual(element);
    if (source != null)
      transformToDevice = source.CompositionTarget.TransformToDevice;
    else
    {
      // IntPtr hWnd = source.Handle;
      using (var source1 = new HwndSource(new HwndSourceParameters()))
      {
          transformToDevice = source1.CompositionTarget.TransformToDevice;
      }
    }
    if (element.DesiredSize == new Size())
                element.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));

     return (Size)transformToDevice.Transform((Vector)element.DesiredSize);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48396161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档