- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的任务是向用户显示其 XPS 文档每一页的缩略图。我需要所有的图像都很小,所以我将 dpi 设置为 72.0 来渲染它们(我用谷歌搜索了 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 我的程序如下所示:
如您所见,页面的一部分根本没有显示,它不适合 Image
控件,即使控件的大小设置为 635x896为什么按照上面的代码,图片必须正确显示,所有文字必须适合。
简而言之,我期望得到什么结果:我正在尝试创建文档页面的缩略图,但我希望它们相对于某个数字更小(对不起,我不太确定我怎么说这些东西在英语中,基本上如果文档的页面宽度是 1200 像素,我希望它是 1200/n
,其中 n 是我之前提到的“一些数字”),但是如果缩小图像的尺寸仍然大于 635x896 我希望尺寸为 635x896。
提前致谢。另外,我很抱歉我的英语不好。
最佳答案
首先,DPI 表示每英寸点数,或每英寸像素。在将 21 x 29.7 厘米的 A4 页面渲染为 72 DPI 的位图的情况下,您最终会得到以下大小的位图:
除此之外,您不应该太在意 DPI,但有一个异常(exception):WPF 渲染是在 96 DPI 下完成的。这意味着您的文档的 A4 大小的页面将呈现为 794 x 1123 位图。提醒一下:
因此,当 RenderTargetBitmap 包含一个恰好为 A4 的页面时,它应该是 794 x 1123 的大小。如果页面尺寸小于 A4,位图应该更小。另一方面,如果页面大于 A4,则应缩小 到 794 x 1123。这就是诀窍。您可以将视觉对象放入 ContainerVisual 中,而不是直接将页面视觉对象呈现到 RenderTargetBitmap 中。用ScaleTransform如下所示。
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);
...
}
关于c# - RenderTargetBitmap 呈现错误大小的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13144615/
我有一个带有小图标的 TreeView 显示在数据模板中。我正在尝试使用 RenderTargetBitmap 将 Treeview 保存为 PNG。 图像在小数据集上正确保存。但是,如果数据集变得太
.net 3.5 sp1 中是否有 RenderTargetBitmap 硬件加速模拟? 最佳答案 MSDN论坛上的回答是there is no hardware accelerated altern
我有以下代码: LinearGradientBrush linGrBrush = new LinearGradientBrush(); linGrBrush.Start
您好,我正在使用 PngBitmapEncoder 从 Canvas 在内存中创建图像。 public void CaptureGraphic() { Canvas canvas = new
每当我渲染 Canvas 并清除其子项并将渲染的位图设置为 Canvas 的背景时,RenderTargetBitmap 就会向右下角滑动。 只有 10 个信誉才能插入图片 :(。 WPF:
我正在尝试使用 RenderTargetBitmap 渲染图像每次我从 RenderTargetBitmap 创建一个实例来渲染图像时,内存都会增加,并且完成后内存永远不会释放这是代码: Render
目标 使用 RenderTargetBitmap 截取一个控件(或一组控件)的屏幕截图。 来源: 预期结果: 方法一 这个基本上使用 UIElement 作为 RenderTa
我尝试使用 RenderTargetBitmap 方法生成 300 dpi 图像。 当我尝试使用 RenderTargetBitmap renderTargetBitmap = new RenderT
我的任务是向用户显示其 XPS 文档每一页的缩略图。我需要所有的图像都很小,所以我将 dpi 设置为 72.0 来渲染它们(我用谷歌搜索了 dpi 72.0 的 A4 纸的尺寸是 635x896)。基
我试图创建一些图表图像,但从未在屏幕上显示这些图表。我已经在这方面工作了很长一段时间并尝试了很多不同的事情,但似乎没有任何效果。如果我首先在窗口中显示图表,则代码可以完美运行,但如果我不在窗口中显示它
我正在尝试使用 RenderTargetBitmap 将具有透明背景的 Visual 对象保存到位图... public static RenderTargetBitmap RenderToBitma
我正在尝试从网络摄像头裁剪图像并显示在摄像头预览旁边。 裁剪图像应考虑 3 个方面。 裁剪后的图像输出格式应为VideoFrame 上面的输出 VideoFrame 需要显示(在 XAML 上) 目标
我有一个简单的 WPF 应用程序,我在其中显示一个非常大的图像 (9000x2875),在它上面显示许多小图像 (64x64)。 为此,我有一个带有一个 Image 的 Canvas,然后我以编程方式
我需要创建一个小而简单的 TIFF 图像,它只是白底黑字,作为我们在多个产品中使用的支持库的一部分。 (想想一张简单的收据或存单之类的东西)。我宁愿不必使用任何第三方库,以避免要求我们向使用该库的所有
如何将 RenderTargetBitmap 对象放入 SoftwareBitmap 中?可以获取 RenderTargetBitmap 作为图像源,另一方面我可以使用 SoftwareBitmap
我在后台线程中应用模糊以提高性能。此函数返回一个 RenderTargetBitmap。完成后,我将通过 Dispatcher 调用图像更新并将其作为内容添加到页面中。这是像下面这样完成的:
我正在开发 Windows Phone 8.1 应用程序,我希望将一些 xaml 渲染到图像文件。 来自 this page on the RenderTargetBitmap class ,看来我的
我正在尝试使用 C# 在 UWP 应用程序中捕获 XAML 网格的视频。 我的方法。 1.使用RenderTargetBitmap使用renderTargetBitmap.RenderAsync进行截
我不明白为什么 RenderTargetBitmap 上的 DPI 参数会像它们看起来那样使用。我经常看到通过基于 DPI 调整图像大小来处理非标准 DPI 设置的代码,如下所示: new Rende
我对 WPF 代码中的内存泄漏感到有些困惑。我正在将一些 3D 几何图形渲染到几个 RenderTargetBitmap,然后将其中的每一个渲染到一个大的主 RenderTargetBitmap。但是
我是一名优秀的程序员,十分优秀!