RenderTargetBitmap 渲染尺寸错误的图像

2024-03-03

我的任务是向用户显示 XPS 文档每一页的缩略图。我需要所有图像都很小,所以我用dpi设置为 72.0(我在 google 上搜索到 dpi 72.0 的 A4 纸的尺寸为 635x896)。基本上,我执行以下操作:

        List<BitmapImage> thumbnails = new List<BitmapImage>();
        documentPaginator.ComputePageCount();
        int pageCount = documentPaginator.PageCount;
        for (int i = 0; i < pageCount; i++)
        {
            DocumentPage documentPage = documentPaginator.GetPage(i);
            bool isLandscape = documentPage.Size.Width > documentPage.Size.Height;
            Visual pageVisual = documentPage.Visual;
            //I want all the documents to be less or equals to A4
            //private const double A4_SHEET_WIDTH = 635;
            //private const double A4_SHEET_HEIGHT = 896;
            //A4 sheet size in px, considering 72 dpi
            RenderTargetBitmap targetBitmap = new RenderTargetBitmap(
            (int)(System.Math.Min(documentPage.Size.Width, A4_SHEET_WIDTH)),
            (int)(System.Math.Min(documentPage.Size.Height, A4_SHEET_HEIGHT)),
            72.0, 72.0,
            PixelFormats.Pbgra32);
            targetBitmap.Render(pageVisual);
            BitmapFrame frame = BitmapFrame.Create(targetBitmap);
            PngBitmapEncoder encoder = new PngBitmapEncoder();
            encoder.Frames.Add(frame);
            BitmapImage image = new BitmapImage();
            using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
            {
                encoder.Save(ms);
                image.BeginInit();
                image.CacheOption = BitmapCacheOption.OnLoad;
                image.StreamSource = ms;
                if (isLandscape)
                {
                    image.Rotation = Rotation.Rotate270;
                }
                image.EndInit();
            }
            thumbnails.Add(image);
        }

但是当我渲染文档页面(A4)时,它的大小实际上是846x1194而不是我所期望的。我试图降低 dpi (48.0),但图像的尺寸变得更大(我想,我只是不太明白 dpi 是什么以及它如何影响文档)。我试着做dpi=96.0,而且尺寸变小了。我从该类的实例集合中设置了一张图像BitmapImage由上面的代码生成作为源Image控件(我正在创建一个 WPF 应用程序),如果 dpi 设置为 96.0,我的程序如下所示:

Thumbnail displayed incorrectly
As you can see, part of the page is not shown at all, it does not fit inside the Image control, even though the size of the control is set to 635x896 that's why according to the code above, the image must be displayed correctly and all the text must fit.
What result do I expect in a nutshell: I am trying to create thumbnails of the pages of a document, but I want them to be smaller, relative to some number (I am sorry, I am not quite sure how do I say such stuff in English, basically if the document's page width is 1200 px I want it to be 1200/n, where n is the "some number" that I mentioned earlier), but if the shrinked image's size is still bigger than 635x896 I want the size to be 635x896.
Thanks in advance. And also I am sorry for my bad English.


首先,DPI的意思是Dots Per Inch,即每英寸像素。如果将 A4 页面(尺寸为 21 x 29.7 厘米)渲染为 72 DPI 的位图,您最终会得到以下尺寸的位图:

  • 宽度 = 21 厘米/(2.54 厘米/英寸)* 72 像素/英寸 = 595 像素
  • 高度 = 29.7 厘米/(2.54 厘米/英寸)* 72 像素/英寸 = 842 像素

除此之外,您不应该太关心 DPI,但有一个例外:WPF 渲染是在 96 DPI 下完成的。这意味着 A4 大小的文档页面将呈现为 794 x 1123 位图。提醒一句:

  • 宽度 = 21 厘米/(2.54 厘米/英寸)* 96 像素/英寸 = 794 像素
  • 高度 = 29.7 厘米/(2.54 厘米/英寸)* 96 像素/英寸 = 1123 像素

因此,当 RenderTargetBitmap 包含正好是 A4 的页面时,794 x 1123 应该是 RenderTargetBitmap 的大小。如果页面尺寸小于 A4,则位图应较小。另一方面,如果页面大于 A4,则应该是缩小比例到 794 x 1123。这就是窍门。您可以将视觉效果放入容器视觉 http://msdn.microsoft.com/en-us/library/system.windows.media.containervisual.aspx with a 尺度变换 http://msdn.microsoft.com/en-us/library/system.windows.media.scaletransform.aspx如下所示。

for (int i = 0; i < paginator.PageCount; i++)
{
    DocumentPage page = paginator.GetPage(i);
    double width = page.Size.Width;
    double height = page.Size.Height;
    double maxWidth = Math.Round(21.0 / 2.54 * 96.0); // A4 width in pixels at 96 dpi
    double maxHeight = Math.Round(29.7 / 2.54 * 96.0); // A4 height in pixels at 96 dpi
    double scale = 1.0;
    scale = Math.Min(scale, maxWidth / width);
    scale = Math.Min(scale, maxHeight / height);

    ContainerVisual containerVisual = new ContainerVisual();
    containerVisual.Transform = new ScaleTransform(scale, scale);
    containerVisual.Children.Add(page.Visual);

    RenderTargetBitmap bitmap = new RenderTargetBitmap(
        (int)(width * scale), (int)(height * scale), 96, 96, PixelFormats.Default);

    bitmap.Render(containerVisual);

    ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RenderTargetBitmap 渲染尺寸错误的图像 的相关文章

  • 此上下文中仅支持实体类型、枚举类型或基本类型

    我目前正在开发一个搜索页面 我只需要返回主题的主题详细信息列表 其中包含存储在 int ST 中的所有主题标签 id 目前 ST null true ST Contains b ThemeTagID 行似乎给了我一个错误 附加信息 无法创建
  • 为什么 C++ Concepts TS 中同时存在变量和函数概念?

    我一直在看 C 1zN4377 http www open std org jtc1 sc22 wg21 docs papers 2015 n4377 pdfGCC 6 中正在实现的概念 TS 草案 我不明白拥有两种不同概念的目的 变量概念
  • 如何从头开始重复C程序并清理屏幕和第一个输入值?

    我是编程新手 我写了一个简单的程序 我想一次又一次地重复该程序 并且只有当用户想要退出时它才能退出 这是我的程序 include
  • WPF 简单绑定到 INotifyPropertyChanged 对象

    我创建了最简单的绑定 绑定到后面代码中的对象的文本框 但事件 文本框仍为空 窗口的 DataContext 已设置 并且绑定路径已存在 你能说出什么问题了吗 XAML
  • 字符串中unicode字符的正则表达式

    我正在使用 C 进行一些 OCR 工作 并提取了我需要使用的文本 现在我需要使用正则表达式解析一行 string checkNum string routingNum string accountNum Regex regEx new Re
  • 如何获得字符串的所有字谜

    我试图找到一个字符串的所有可能的字谜并仅使用递归将它们存储在数组中 我被困住了 这就是我所拥有的一切 int main const int MAX 10 string a ABCD string arr 10 permute arr a 0
  • 如何将整个流读入 std::string ?

    我正在尝试将整个流 多行 读入字符串中 我正在使用这段代码 它有效 但它冒犯了我的风格感 当然有更简单的方法吗 也许使用字符串流 void Obj loadFromStream std istream stream std string s
  • 在大型数据绑定 ObservableCollection 中添加/删除许多项目,而无需冻结 GUI

    我和我的团队正在开发一个 WPF 应用程序 该应用程序显示多个并发 XamDataChart 控件 由 Infragistics 提供 每个图表都绑定到不同的 ObservableCollection 最多可包含 200 万个点 对于每个图
  • 树结构的序列化/反序列化

    我试图找出保存 序列化 并稍后打开 反序列化 树结构的最佳方法 我的结构由具有不同属性的各种对象类型组成 但每个对象类型都继承自基本抽象 Node 类 每个节点都有唯一的 ID GUID 并且有一个 AddSuperNode Node nd
  • 使用来自不同线程的实时数据更新 QTableView 的最佳策略

    我的应用程序现在启动几个线程 如 5 10 个 来从不同源收集数据 它们与主 GUI 线程分离 因此我在 GUI 中感觉不到任何缓慢 并且我可以在后台线程工作时继续工作 一切都很棒 但现在我希望能够在我的主 GUI 中的 QTableVie
  • 最佳实践:从属性中抛出异常

    什么时候适合从属性 getter 或 setter 中抛出异常 什么时候不合适呢 为什么 关于这个主题的外部文档的链接会很有帮助 谷歌搜索结果出奇的少 Microsoft 在以下位置提供了有关如何设计属性的建议 http msdn micr
  • STL(标准模板库)中使用的设计模式

    我正在学习STL和设计模式 我想知道是否有任何文档或链接可以解释如何在 STL 中实现设计模式 我做了谷歌但无法获得太多数据 我希望你的意思是 哪些设计模式可以在STL中识别 STL 堆栈是一个容器适配器 适配器是一种设计模式 迭代器也是一
  • 为什么 `boost::any` 比 `void*` 更好?

    有什么先天优势boost any and boost any cast提供超过使用void and dynamic cast 优点是boost any比类型安全得多void E g int i 5 void p i static cast
  • 提取 zip 文件时 Parallel.ForEach 抛出异常

    我正在阅读 zip 文件的内容并尝试提取它们 var allZipEntries ZipFile Open zipFileFullPath ZipArchiveMode Read Entries 现在 如果我提取使用 Foreach 循环
  • 同时重新排序和旋转图像的高效方法

    为了快速加载 jpeg 我为turbojpeg 实现了一个 mex wrapper 以有效地将 大 jpeg 读入 MATLAB 对于 4000x3000px 的图像 实际解码只需要大约 120 毫秒 而不是 5 毫秒 然而 像素顺序是 R
  • 使用 JSON.NET 反序列化一些 JSON

    我对 JSON 非常陌生 我需要解析 API 提供的一些内容 谷歌快速搜索出现了JSON NET http james newtonking com pages json net aspx 所以我现在尝试使用它将此 JSON 解析为列表对象
  • 如何在 MVC 5 中设置自定义 ClaimsPrincipal?

    我创建了一个自定义主体类 public class FacebookPrincipal ClaimsPrincipal public JObject Data get set 我想用它 当用户登录时 我尝试设置 var fbP new Fa
  • WCF - IsOneway 的行为不像 Oneway 操作

    我已在服务的某些方法上定义了 OneWay 属性 但它们的行为并不像 Oneway 调用 我的客户等待呼叫完成并从服务返回 我假设单向操作是非阻塞操作 并且客户端不关心被调用函数会发生什么 它只是调用并忘记它 这是对的吗 问题 调用 Ope
  • 类型 '' 未映射

    我已经尝试修复这个错误有一段时间了 每当我的应用程序尝试创建数据上下文的实例时 我都会收到此错误 下面是代码 using System using System Collections Generic using System Linq u
  • win32 内容已更改,但除非移动窗口,否则不会显示更新

    我的 win32 GUI 内容每秒都会更改 但除非手动移动窗口 否则不会显示更新 我尝试每秒弹出一个消息框来触发窗口刷新 它成功了 因此 这证明我的内容确实发生了变化 但窗口没有更新 我希望刷新窗口而不是每次都弹出消息框 有没有这样的窗口功

随机推荐

  • 数字倒着显示?

    当我看到用户的投诉时我不相信 在绑定的 WPF 文本框中键入 123 将显示 321 目前已修复 但我想知道这是否可以归类为 WPF bug 当文本框绑定到实体框架双字段且 UpdateSourceTrigger 绑定模式设置为 Prope
  • “启用”类比较[重复]

    这个问题在这里已经有答案了 我需要有关我的 CSC 硬件的帮助 它位于类 对象上 是一个定义圆的简单类 名称为 class Circle object 硬件的确切文本 我完成了该硬件的前两部分 因此第三部分是对初始问题的扩展 通过使用 gt
  • 使结构比赋予该结构的方法的参数更长寿

    我正在寻找一种方法来确保结构的寿命比赋予该结构的方法的参数的寿命长 即使结构在离开方法后不保存对该数据的引用 这是用于馈送到 FFI 的包装原始指针 我想保证实现 FFI 的结构比Option lt a Any gt 我用来将 Rust 对
  • 使用 Core Graphics 制作饼图

    到目前为止 我已经画好了一个圆圈 仅此而已 我正在尝试制作一个饼图来表示满意和不满意的客户数量并展示它 我对 CG 非常陌生 想知道有人可以编写足够的代码来给我一个想法或指导我 我是否应该让底部的圆圈代表满意的客户数量 然后在其顶部添加另一
  • 如何使用 Android SDK 在 Facebook 墙上简单地分享内容?

    我找不到很多 FB Android SDK 的示例 并且示例不够简单 其中一些已弃用 我的简单目标是使用我的 Android 应用程序在 FB 上分享一些内容 当我开发 iOS 应用程序时 它很简单 AppDelegate appDeleg
  • 在 Windows 上使用 shp2pgsql.exe 将 shapefile 提取到 PostgreSQL/PostGIS 数据库的 Python 脚本

    我有一个托管在 Windows 2008 Server RT 虚拟机上的 PostgreSQL 数据库 是的 我知道它应该托管在 Linux 虚拟机上 但这是我的组织规定的 唉 我们的 GIS 人员将大量 shapefile 转储到存储库中
  • nvcc、gcc、clang 和 msvc 是否“尊重”结构中的 __restrict__ 关键字?

    假设我有 struct s int restrict p1 double v void foo int restrict p2 struct s my s 下面列出的 C 编译器是否遵循 restrict 在这种情况下关键字 并假设内存访问
  • 将 DataGridCell ToolTip 属性绑定到 DataGridCell 的值

    I have DataGrid和其中之一DataGrid列看起来像这样
  • 如何在 Chartjs 中添加图像作为背景?

    我在可编程设备上使用 Chart js lib 我需要添加图像作为图表的背景 如果不可能 我如何将背景颜色更改为黑色 我无法使用 Jquery 因为平台不支持它 谢谢 谢谢你 我没想到CSS 我也以类似的方式添加了图像 canvas bac
  • 如何在执行之前获取processbuilder命令

    我想知道在它发生之前将执行的命令 String cmd curl X POST https api renam cl medicion insert access token Yoq3UGQqDKP4D1L3Y6xIYp Lb6fyvavp
  • 在使用 Javascript 上传之前检查图像的宽度和高度

    我有一个 JPS 其表单中用户可以放置图像 div class photo div Photo max 240x240 and 100 kb div div
  • 在 PHP 中保护登录 cookie 数据的最佳方法是什么?

    我正在用 PHP 创建一个登录系统 我想知道如何最好地保护 cookie 中的用户信息字符串 我正在考虑用密钥以某种方式加密字符串 这是最好的方法吗 我对此有点陌生 提前致谢 不要在 cookie 中存储敏感信息 存储会话 ID 哈希以将登
  • firebase.intializeApp 不是一个函数

    所以我陷入了这个错误 我使用 telegram bot api 制作了一个 telegram 机器人 现在尝试设置一个 firebae DB 来保存组成员的分数 因此重新启动机器人后分数不会重置 有人可以告诉我问题是什么吗 我在这里读到了很
  • 如何在 Sublime Text 2 编辑器中将一行传递到控制台

    我使用 RStudio 来处理 R 编程语言并找到ctrl enter将一行发送到控制台的快捷方式对于解决我的工作问题非常有用 现在我正在使用 sublimetext2 我想在 RStudio 中做同样的事情 向控制台发送一行 有没有办法将
  • 定位偏移 div / 图像

    我想达到这个结果 参见此示例图片 首先 我尝试使用 CSS 创建部分边框 使用div after 问题 我有几个不同格式的图像 但它无法正常工作 所以 我尝试过使用背景 divposition relative和一个图像position a
  • docker-compose 不使用 Flask 设置环境变量

    运行 Flask 容器 当我尝试读取环境变量时 它们不是由 docker compose 设置的 我正在使用 docker compose 文件版本 2 compose file services test build test image
  • 像表格一样显示 DL [重复]

    这个问题在这里已经有答案了 如何设置定义列表项的样式以使每个定义都在一行中 HTML dl dt word dt dd meaning dd dt word dt dd meaning dd dt word dt dd meaning dd
  • Jupyter Lab未使用虚拟环境

    我创建了一个虚拟环境并安装了ipython all and jupyter与点 当我跑步时jupyter lab 打开笔记本 并尝试导入我在虚拟环境中安装的包 我收到 ModuleNotFoundError Running ipython在
  • 如何在 jquery 中切换 attr()

    我有一个简单的添加属性函数 list toggle click function list sort attr colspan 6 我的问题是 我怎样才能把它变成一个切换 所以colspan 6 下次单击时从元素中删除吗 如果你感觉很奇特
  • RenderTargetBitmap 渲染尺寸错误的图像

    我的任务是向用户显示 XPS 文档每一页的缩略图 我需要所有图像都很小 所以我用dpi设置为 72 0 我在 google 上搜索到 dpi 72 0 的 A4 纸的尺寸为 635x896 基本上 我执行以下操作 List