- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找一种创建链接的方法,该链接将创建 Razor 组件的屏幕截图并通过 Blazor 服务器应用程序将其下载为 JPG、PNG 或 PDF。理想情况下,它将仅包含 Razor 组件和所有子组件,但没有父组件,并且图像将具有浏览器上显示的当前状态的精确外观。
唯一类似的事情是捕获 HTML Canvas ,但由于我对 Blazor 还很陌生,所以我不确定如何应用它,并且想知道是否有一种方法可以通过 C# 实现类似的事情。任何建议,将不胜感激。谢谢:)
最佳答案
我认为单独使用 C# 实现这一目标并不容易,因为解决该问题的最佳方法是将 HTML 数据转换为 Canvas 并将其导出为图像,这是一个艰难的过程,但有库在 JS 中可用。怎么做:
我将使用这个库,因为它似乎是最简单的:html2canvas
这是它的 JS 文件的链接:html2canvas.js
下载它并将它放在您的 wwwroot 文件夹中,然后通过在 body 标记的末尾添加以下代码将其包含在 _host.cshtml
中:
<script src="html2canvas.js"></script>
然后添加一个 JS 函数以从 C# 调用,这样我们就可以通过在 _host.cshtml
中之前的代码之后添加它来用 C# 编写偶数处理程序:
<script>
window.takeScreenshot = async function(id) {
var img = "";
await html2canvas(document.querySelector("#" + id)).then(canvas => img = canvas.toDataURL("image/png"));
var d = document.createElement("a");
d.href = img;
d.download = "image.png";
d.click();
return img;
}
</script>
这将自动从元素截屏并下载它,同时返回它的 URL。注意组件必须在带有id的div标签内,否则不能单独选中,例如good child in parent:
Parent.razor
<div id="child"></div>
<Child />
</div>
要使用此功能,请使用 JsInterop类(class)。简单地说,通过在文件顶部添加以下内容,将它注入(inject)(基本上包含)到您需要此功能的 Razor 组件中:
@inject IJSRuntime JS
接下来,一个做所有事情的函数:
@inject IJSRuntime JS
@code {
public async System.Threading.Tasks.Task<string> TakeImage(string id)
{
return await JS.InvokeAsync<string>("takeScreenshot", id);
}
}
此函数将返回从 id 参数指定的元素中获取的图像的数据 URL。使用按钮拍摄图像的示例用法:
@page "/screenshot"
@inject IJSRuntime JS
@code {
string image_url = "";
string child_id = "child";
public async System.Threading.Tasks.Task<string> TakeImage(string id)
{
return await JS.InvokeAsync<string>("takeScreenshot", id);
}
public async System.Threading.Tasks.Task ButtonHandler()
{
image_url = await TakeImage(child_id);
}
}
<button @onclick="ButtonHandler">Take image</button>
<h3>Actual component:</h3>
<div id=@child_id>
<ChildComponent />
</div>
<h3>Image:</h3>
<img src=@image_url />
<br />
<br />
<br />
<p>URL: @image_url</p>
按下按钮将下载图像,显示它,显示原始 URL,并将 URL 保存到变量 image_url。您可以通过将 @using System.Threading.Tasks
添加到 _Imports.razor< 将
文件。您可以通过删除 JS 函数中的这 4 行来删除自动下载功能:System.Threading.Tasks.Task
缩短为 Task
/
var d = document.createElement("a");
d.href = img;
d.download = "image.png";
d.click();
<script>
window.takeScreenshot = async function() {
var img = "";
await html2canvas(document.querySelector("body")).then(canvas => img = canvas.toDataURL("image/png"));
var d = document.createElement("a");
d.href = img;
d.download = "image.png";
d.click();
return img;
}
</script
设置函数在文档加载时运行:
@inject IJSRuntime JS
@page "/component"
@code {
string image_url = "";
public async System.Threading.Tasks.Task<string> TakeImage()
{
return await JS.InvokeAsync<string>("takeScreenshot");
}
protected override async System.Threading.Tasks.Task OnAfterRenderAsync(bool firstRender)
{
if(firstRender) //Ensure this is the page load, not any page rerender
{
image_url = await TakeImage();
}
}
}
http://localhost:5001/page?img=true
NavigationManager
获取 URI,它可以像
IJSRuntime
一样被注入(inject)。为了解析 URI,我们可以使用
QueryHelpers类(class)。最终代码如下所示:
@inject IJSRuntime JS
@inject NavigationManager Nav
@page "/component"
@code {
string image_url = "";
public async System.Threading.Tasks.Task<string> TakeImage()
{
return await JS.InvokeAsync<string>("takeScreenshot");
}
protected override async System.Threading.Tasks.Task OnAfterRenderAsync(bool firstRender)
{
if(firstRender) //Ensure this is the page load, not any page rerender
{
var uri = Nav.ToAbsoluteUri(Nav.Uri);
if (Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(uri.Query).TryGetValue("img", out var isImg))
{
if (System.Convert.ToBoolean(isImg.ToString()))
{
image_url = await TakeImage();
}
}
}
}
}
现在您可以将 ?img=true
添加到组件的 URL,您将获得它的屏幕截图。
注意,如果div的body/parent有背景,而你想让它出现在图片中,你需要在包含的div的CSS规则中添加background: inherit;
子组件。
关于c# - 通过下载链接将 Razor 组件保存为 JPG/PNG/PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67880262/
我的目录中有一堆图像(100+),它们的名称都不同。有什么方法可以将它们重命名为 0.jpg、1.jpg、2.jpg 等,可能使用脚本(我运行的是 Windows),而不必单独重命名每个文件?如果在
文件的顺序由可以嵌入文件名中的数字确定,但有时嵌入在名称的开头,例如文件1.txt文件2.txt文件3.txt文件10.txt文件11.txtETC..或者1.txt2.txt10.txt等. 重命名
我有一个 inotify 等待脚本,只要检测到文件已上传到源目录,它就会将文件从一个位置移动到另一个位置。 我面临的挑战是我需要保留文件的基本名称并将以下扩展名:.JPEG、.JPG、.jpeg 转换
我有一段代码可以上传图像并创建缩略图,只要扩展名是小写的 jpg,但如果是大写的 JPG,它就不会上传图像。当我重命名图像时,例如example.JPG 到 example.jpg,它会上传。但是 e
我必须缩小和解压缩一组大小为 4608 x 3456 的 JPG 图像。目前,我已经能够将图像正确解压缩为 RGB 格式并将它们转换为位图。 现在我需要实现缩小,根据我目前所读到的正确缩小图像的内容,
这个问题困扰我好久了。我正在尝试在 PHP 中加载图像,但是有 jpg 和 JPG 图像,当我尝试通过 jpg 加载图像时,找不到 JPG 图像(显然) $img1 = ''; $img2 = '';
我使用这个函数来检测我的文件是否存在。虽然我有一些图像存储为 .jpg、.JPG、.png 和 .PNG。但即使真实文件的扩展名为 .JPG 或 .PNG,它也总是将 .jpg 或 .png 返回为真
我有很多这样的文件: 13040-3BLK1.JPG 13040-3NAV11.JPG 13040-50NAV11.JPG 13040-60NAV11.JPG 13040-LNAV1.JPG
我在机器人上安装了摄像头。长话短说,相机输出二进制数组,我相信这是一个 JPG 编码流。我这么说是因为我使用的库中的许多方法都暗示它是 JPG 编码的,并且第一个和最后 2 个字节是 255 216
我正在制作个人网页,我已将其草稿上传到 www.kurtpeek.com。我注意到的一个错误是,我在“关于我”部分中的一张 jpeg 图片“MIT_IAP_SAR_smallest.JPG”没有出现在
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
我有一张图片列表,我想将它们组合成每组一张图片。每个图像都有一个名称以及它是什么类型的图表。我希望有一种方法可以使用名称对图像进行分组,并为每个组返回单个 jpg 或 png 的输出。组合后的图像如下
我通过 JavaScript 设置 img 的 src 属性,如下所示: var newimgid = "images/" + fldrid + "/" + id + ".jpg"; document
我有一个 TImage,它显示文件夹中的 JPG 图像。每个 JPG 图像名称都是数字(例如 5968.jpg)。如果 JPG 图像不存在,我当前加载模板 JPG。 但是,我想在检查本地文件夹后再检查
我的脚本很简单。 SELECT file_name FROM images WHERE `id` = '$id' AND `file_name` LIKE '%_1.jpg' 当我在 mysql 中运
我有一个页面显示了一些产品,例如:- 标题- 描述- 图片 当图像存储在表中时,其存储为例如“image.jpg”...但是我想在上传图像时制作图像名称的标题将用作图像的标题产品的 html 标题(t
我想创建一个按钮来在 a.jpg 和 b.jpg 之间反复翻转图像。这是我的代码: function changeImg() { document.getElementById("
有没有人为 Windows 制作一个简单的 DLL,这样我就可以将原始图像数据保存为 JPG 格式?它也应该有 .lib 和 .h 文件,所以我不需要搞乱源代码编译,因为我发现它非常困难。 需要考虑的
我有一张我正在尝试创建的动态图像,它以前在一个网络主机上工作,直到我发现他们删除了一些功能,其中一些破坏了我的形象。我最近搬到了 hostgator,我也无法让图像在他们的网站上工作。实际的 PHP
有时我将 JPG 图像保存为未压缩的位图 (BMP/PNG),以在更改图像时保持质量。 我想知道,理论上是否可以将位图重新编码回其原始 JPG 格式,而不会损失任何质量(我编辑的区域除外)? 编辑:我
我是一名优秀的程序员,十分优秀!