有没有一种方法可以将html渲染为类似PNG的图像?我知道画布是可能的,但我想呈现例如div之类的标准html元素。
有没有一种方法可以将html渲染为类似PNG的图像?我知道画布是可能的,但我想呈现例如div之类的标准html元素。
Answers:
我知道这是一个很老的问题,已经有了很多答案,但是我仍然花了几个小时来尝试做自己想做的事情:
使用无头的Chrome(此响应的版本为74.0.3729.157),实际上很容易:
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless --screenshot --window-size=256,256 --default-background-color=0 button.html
命令说明:
--headless
运行Chrome而不打开它,并在命令完成后退出--screenshot
将捕获屏幕截图(请注意,它将screenshot.png
在运行命令的文件夹中生成一个名为的文件)--window-size
只允许捕获屏幕的一部分(格式为--window-size=width,height
)--default-background-color=0
是告诉Chrome使用透明背景而非默认白色的魔术--screenshot='absolute\path\of\screenshot.png'
为我工作
是。存在HTML2Canvas可以将HTML呈现到HTML2Canvas上<canvas>
(然后可以将其用作图像)。
注意:存在一个已知问题,该问题不适用于SVG
我可以推荐dom-to-image库,该库专门用于解决此问题(我是维护者)。
这是您的用法(此处有更多信息):
var node = document.getElementById('my-node');
domtoimage.toPng(node)
.then (function (dataUrl) {
var img = new Image();
img.src = dataUrl;
document.appendChild(img);
})
.catch(function (error) {
console.error('oops, something went wrong!', error);
});
domtoimage.toSvg
),然后在画布上自己渲染,并尝试以某种方式使用该画布的分辨率。可以在lib本身中实现诸如某种渲染选项之类的功能,因此您可以以像素为单位传递图像尺寸。如果您需要它,非常感谢您在github上创建一个问题。
有很多选择,它们各有利弊。
优点
缺点
优点
缺点
优点
缺点
优点
缺点
披露:我是ApiFlash的创始人。我尽力提供诚实和有用的答案。
这里的所有答案都使用第三方库,而用纯Javascript渲染HTML到图像可能相对简单。还有的甚至一个关于它的文章上MDN画布部分。
诀窍是这样的:
drawImage
在画布上const {body} = document
const canvas = document.createElement('canvas')
const ctx = canvas.getContext('2d')
canvas.width = canvas.height = 100
const tempImg = document.createElement('img')
tempImg.addEventListener('load', onTempImageLoad)
tempImg.src = 'data:image/svg+xml,' + encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"><foreignObject width="100%" height="100%"><div xmlns="http://www.w3.org/1999/xhtml"><style>em{color:red;}</style><em>I</em> lick <span>cheese</span></div></foreignObject></svg>')
const targetImg = document.createElement('img')
body.appendChild(targetImg)
function onTempImageLoad(e){
ctx.drawImage(e.target, 0, 0)
targetImg.src = canvas.toDataURL()
}
注意事项
Document
呈现为栅格(例如Canvas
)是最简单的事,但是由于没有人愿意对其进行标准化,因此我们不得不诉诸疯狂,如上所示(本文作者没有冒犯之处)码)。
我必须为Chrome,Firefox和MS Edge使用的唯一库是rasterizeHTML。与HTML2Canvas相比,它输出的质量更好,并且仍受支持。
获取元素并下载为PNG
var node= document.getElementById("elementId");
var canvas = document.createElement("canvas");
canvas.height = node.offsetHeight;
canvas.width = node.offsetWidth;
var name = "test.png"
rasterizeHTML.drawHTML(node.outerHTML, canvas)
.then(function (renderResult) {
if (navigator.msSaveBlob) {
window.navigator.msSaveBlob(canvas.msToBlob(), name);
} else {
const a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
a.href = canvas.toDataURL();
a.download = name;
a.click();
document.body.removeChild(a);
}
});
rasterizeHTML.drawHTML(node.innerHTML, canvas)
请注意,我在节点上调用innerHTML
使用html2canvas仅包含插件和调用方法即可将HTML转换为Canvas,然后下载为图片PNG
html2canvas(document.getElementById("image-wrap")).then(function(canvas) {
var link = document.createElement("a");
document.body.appendChild(link);
link.download = "manpower_efficiency.jpg";
link.href = canvas.toDataURL();
link.target = '_blank';
link.click();
});
来源:http : //www.freakyjolly.com/convert-html-document-into-image-jpg-png-from-canvas/
使用此代码,它肯定可以工作:
<script type="text/javascript">
$(document).ready(function () {
setTimeout(function(){
downloadImage();
},1000)
});
function downloadImage(){
html2canvas(document.querySelector("#dvContainer")).then(canvas => {
a = document.createElement('a');
document.body.appendChild(a);
a.download = "test.png";
a.href = canvas.toDataURL();
a.click();
});
}
</script>
只是不要忘记在程序中包含Html2CanvasJS文件。 https://html2canvas.hertzen.com/dist/html2canvas.js
仅靠JavaScript不能100%准确地做到这一点。
有一个Qt Webkit 工具和一个python版本。如果您想自己做,我在Cocoa上取得了成功:
[self startTraverse:pagesArray performBlock:^(int collectionIndex, int pageIndex) {
NSString *locale = [self selectedLocale];
NSRect offscreenRect = NSMakeRect(0.0, 0.0, webView.frame.size.width, webView.frame.size.height);
NSBitmapImageRep* offscreenRep = nil;
offscreenRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:nil
pixelsWide:offscreenRect.size.width
pixelsHigh:offscreenRect.size.height
bitsPerSample:8
samplesPerPixel:4
hasAlpha:YES
isPlanar:NO
colorSpaceName:NSCalibratedRGBColorSpace
bitmapFormat:0
bytesPerRow:(4 * offscreenRect.size.width)
bitsPerPixel:32];
[NSGraphicsContext saveGraphicsState];
NSGraphicsContext *bitmapContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:offscreenRep];
[NSGraphicsContext setCurrentContext:bitmapContext];
[webView displayRectIgnoringOpacity:offscreenRect inContext:bitmapContext];
[NSGraphicsContext restoreGraphicsState];
// Create a small + large thumbs
NSImage *smallThumbImage = [[NSImage alloc] initWithSize:thumbSizeSmall];
NSImage *largeThumbImage = [[NSImage alloc] initWithSize:thumbSizeLarge];
[smallThumbImage lockFocus];
[[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
[offscreenRep drawInRect:CGRectMake(0, 0, thumbSizeSmall.width, thumbSizeSmall.height)];
NSBitmapImageRep *smallThumbOutput = [[NSBitmapImageRep alloc] initWithFocusedViewRect:CGRectMake(0, 0, thumbSizeSmall.width, thumbSizeSmall.height)];
[smallThumbImage unlockFocus];
[largeThumbImage lockFocus];
[[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
[offscreenRep drawInRect:CGRectMake(0, 0, thumbSizeLarge.width, thumbSizeLarge.height)];
NSBitmapImageRep *largeThumbOutput = [[NSBitmapImageRep alloc] initWithFocusedViewRect:CGRectMake(0, 0, thumbSizeLarge.width, thumbSizeLarge.height)];
[largeThumbImage unlockFocus];
// Write out small
NSString *writePathSmall = [issueProvider.imageDestinationPath stringByAppendingPathComponent:[NSString stringWithFormat:@"/%@-collection-%03d-page-%03d_small.png", locale, collectionIndex, pageIndex]];
NSData *dataSmall = [smallThumbOutput representationUsingType:NSPNGFileType properties: nil];
[dataSmall writeToFile:writePathSmall atomically: NO];
// Write out lage
NSString *writePathLarge = [issueProvider.imageDestinationPath stringByAppendingPathComponent:[NSString stringWithFormat:@"/%@-collection-%03d-page-%03d_large.png", locale, collectionIndex, pageIndex]];
NSData *dataLarge = [largeThumbOutput representationUsingType:NSPNGFileType properties: nil];
[dataLarge writeToFile:writePathLarge atomically: NO];
}];
希望这可以帮助!
安装phantomjs
$ npm install phantomjs
使用以下代码创建文件github.js
var page = require('webpage').create();
//viewportSize being the actual size of the headless browser
page.viewportSize = { width: 1024, height: 768 };
page.open('http://github.com/', function() {
page.render('github.png');
phantom.exit();
});
将文件作为参数传递给phantomjs
$ phantomjs github.js
HtmlToImage.jar将是将html转换为图像的最简单方法
您可以将参考 HtmlRenderer 添加到您的项目中,然后执行以下操作:
string htmlCode ="<p>This is a sample html.</p>";
Image image = HtmlRender.RenderToImage(htmlCode ,new Size(500,300));