问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

WPF怎样使用RenderTargetBitmap

发布网友 发布时间:2022-04-22 10:30

我来回答

1个回答

热心网友 时间:2023-10-10 19:12

  RenderTargetBitmap把视觉树中的一部分光栅化以位图的形式保存,你可以利用下面的这个类以位图的形式呈现视觉元素,当然得考虑系统DPI设置及视觉元素的转换。(感谢Adam Smith在反转换这方面的建议)
public class VisualUtility
{
public static BitmapSource CreateBitmapFromVisual(Double width,
Double height,
Visual visualToRender,
Boolean undoTransformation)
{
if (visualToRender == null)
{
return null;
}
// The PixelsPerInch()方法用于读取屏幕上DPI的设置
//如果你想以特定的分辨率创建一个位图,你可以直接把某一dpiX或dpiY传参给RenderTargetBitmap构造器。
RenderTargetBitmap bmp = new RenderTargetBitmap((Int32)Math.Ceiling(width),
(Int32)Math.Ceiling(height),
(Double)DeviceHelper.PixelsPerInch(Orientation.Horizontal),
(Double)DeviceHelper.PixelsPerInch(Orientation.Vertical),
PixelFormats.Pbgra32);
//如果我们想反转换,我们可以使用VisualBrush
if (undoTransformation)
{
DrawingVisual dv = new DrawingVisual();
using (DrawingContext dc = dv.RenderOpen())
{
VisualBrush vb = new VisualBrush(visualToRender);
dc.DrawRectangle(vb, null, new Rect(new Point(), new Size(width, height)));
}
bmp.Render(dv);
}
else
{
bmp.Render(visualToRender);
}
return bmp;
}
}

internal class DeviceHelper
{
public static Int32 PixelsPerInch(Orientation orientation)
{
Int32 capIndex = (orientation == Orientation.Horizontal) ? 0x58 : 90;
using (DCSafeHandle handle = UnsafeNativeMethods.CreateDC("DISPLAY"))
{
return (handle.IsInvalid ? 0x60 : UnsafeNativeMethods.GetDeviceCaps(handle, capIndex));
}
}
}

internal sealed class DCSafeHandle : SafeHandleZeroOrMinusOneIsInvalid
{
private DCSafeHandle() : base(true) { }
protected override Boolean ReleaseHandle()
{
return UnsafeNativeMethods.DeleteDC(base.handle);
}
}

[SuppressUnmanagedCodeSecurity]
internal static class UnsafeNativeMethods
{
[DllImport("gdi32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern Boolean DeleteDC(IntPtr hDC);
[DllImport("gdi32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern Int32 GetDeviceCaps(DCSafeHandle hDC, Int32 nIndex);
[DllImport("gdi32.dll", EntryPoint = "CreateDC", CharSet = CharSet.Auto)]
public static extern DCSafeHandle IntCreateDC(String lpszDriver,
String lpszDeviceName, String lpszOutput, IntPtr devMode);
public static DCSafeHandle CreateDC(String lpszDriver)
{
return UnsafeNativeMethods.IntCreateDC(lpszDriver, null, null, IntPtr.Zero);
}
}
  之所以你需要反转换是因为如果你需要光栅化成RenderTargetBitmap的视觉目标元素已经是转换过的话(比如旋转,比例缩放,或是平移之类),这些效果会对最终产生位图有影响,这可能不是你想要的结果。“反转换”参数不仅使你能够实现反转换,而且可以得到原始的未经过转换的视觉元素呈现。
  在利用RenderTargetBitmap时的一些*你也应该清楚:首先,RenderTargetBitmap不会利用硬件加速,位图是完全在内存中产生的,并且整个过程也是在UI线程中实现的。其次,字体的显示会显示锯齿效果,而不是清晰的呈现线条样的效果。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
自离后能补办离职证明吗? 我是家里自离的,可以补办辞职手续吗 急救!!!狗狗受凉吃什么就吐什么,该吃什么药 狗狗受凉呕吐吃什么药好得快 公告栏标题里的字如何设定字体及大小 公告栏怎移动啊 我的公告栏 如何设置 怎么让QQ拍拍公告栏文字不滚动 在滚动的公告栏中鼠标放上去时就停止,这种效果怎么做?谢谢了 王者荣耀铂金1和黄金3双排排到的是什么段位的 在qq上转账我怎么查余额 C# winform 用textbox显示文本 如何把光标定位到指定的位置 怎样查看QQ账户余额? 手机QQ怎么查账户余额? wpf里怎么使用bitmap 谁有WPF2010和Access 2010做的公交查询软件,要有地图显示的,我把我的分全给他了。 wpf用mapx开发怎么给其他人使用 WPF Bing Maps Control能不能连别的地图 WPF中墨卡托投影得到的瓦片地图如何给三维模型贴材质 WPF图表控件Chart FX使用方法系列:如何绘制地图轮廓 怎么在wpf中调用百度地图api 有营业执照就下的网贷 求问热水器怎么开 “如何”“怎样”“怎么样”的区别是什么? 我不知怎么打开热水器 在WORD中如何快速打出001至999位数字 这种热水器,怎么打开热水? 3分钟安装好一张双层床真的吗? 怎样在二层床上放蚊帐? 用股票形容人的段子有哪些? 怎么在qq上查询银行卡余额查询 WPF中datagrid的DataGridTextColumn显示多行 怎样在qq钱包上看到自己有多少钱 prism3D怎么把我做好的素材导出并放在其他地图里 wpf Bitmap显示在listView。 QQ零用钱怎么查 wpf中怎么获取image上的图并转化为bitmap 在QQ上怎么查询QQ币 C# wpf为什么不能调用bitmap wpf如何将BitmapSource转为bitmap? 用QQ怎么看银行卡里还有多少钱 C# wpf BitmapImage从本地资源获得未知像素大小的图片,如何将其对象设为指定大小 用qq怎么看银行卡余额 小米10s充电动画在哪设置 C# WPF的Image控件中使用WriteableBitmap的WritePixels方法作为源后 图像上下颠倒如何正过来 怎样查询自己QQ里一共充值了多少钱? WPF:关于BitmapDecoder.Create的问题 QQ在哪里才能查到值多少钱? 小米10s更新系统13.3后充电动画不见了 怎么样在QQ上查看有多少Q币?