呈现HTML到图像
有没有办法像PNG呈现HTML图像? 我知道这是可能的canvas,但我想呈现标准的HTML元素,例如div。
是。 存在HTML2Canvas以将HTML呈现到<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); });
你可以使用PhantomJS ,这是一个无头的webkit(safari和(直到最近)chrome)驱动的渲染引擎。 你可以学习如何在这里做页面的屏幕截图。 希望有所帮助!
您可以使用HTML到PDF工具,如wkhtmltopdf。 然后,你可以使用PDF格式的图像工具,如imagemagick。 无可否认,这是服务器端和一个非常复杂的过程…
我为Chrome,Firefox和MS Edge工作的唯一库是rasterizeHTML 。 它输出的HTML2Canvas质量更好,并且仍然支持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); } });
我不认为这是最好的答案,但似乎足够有趣的发布。
编写一个应用程序,打开你喜欢的浏览器到所需的HTML文件,正确的窗口大小,并采取屏幕截图。 然后,删除图像的边界。
你无法单独使用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]; }];
希望这可以帮助!
有很多select,他们都有自己的利弊。
选项1:使用许多可用的库之一
- DOM至图像
- wkhtmltoimage (包含在wkhtmltopdf工具中)
- IMGKit (ruby和基于wkhtmltoimage)
- imgkit (用于python和基于wkhtmltoimage)
- python,webkit2png
- …
优点
- 大部分时间会话都很快
缺点
- 糟糕的渲染
- 不执行JavaScript
- 不支持最近的Webfunction(FlexBox,高级select器,Webfonts,框大小,媒体查询…)
- 有时不太容易安装
- 复杂的规模
选项2:使用PhantomJs,也许包装库
- PhantomJs
- node-webshot (PhantomJs的JavaScript包装库)
- …
优点
- 执行Javascript
- 蛮快
缺点
- 糟糕的渲染
- 不支持最近的Webfunction(FlexBox,高级select器,Webfonts,框大小,媒体查询…)
- 复杂的规模
- 如果有图像需要加载,就不那么容易
选项3:使用Chrome Headless,也许是一个包装库
- Chrome Headless
- 铬devtools协议
- Puppeteer (Chrome无头文件的javascript包装库)
- …
优点
- 执行Javascript
- 近乎完美的渲染
缺点
- 不太容易得到通缉的结果:
- 页面加载时间
- 视口尺寸
- 复杂的规模
- 如果html包含外部链接,相当慢甚至更慢
选项4:使用API
- ApiLeap (基于chrome)
- EvoPDF (有html的选项)
- Grabzit
- …
优点
- 执行Javascript
- 近乎完美的渲染
- 快速caching选项正确使用
- 比例是由API处理的
- 精确计时,视口,…
- 大多数时候他们提供一个免费的计划
缺点
- 如果您打算使用它们,则不是免费的
免责声明:我是ApiLeap的创始人。 我尽我所能提供了一个诚实和有用的答案。
安装phantomjs
$ npm install phantomjs
用下面的代码创build一个文件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(); });
将文件作为parameter passing给phantomjs
$ phantomjs github.js
将DOM对象绘制到canvas中可以快速实现。
从性能的angular度来看,这个方法应该很轻。 因为svg渲染器和dom渲染器显然可以根据需要来回传递缓冲区。 这是有道理的,因为这都是核心代码。
我没有这方面的基准,但是MDN文件维护得很好,不仅仅是壁虎。 所以我猜你至less可以知道,糟糕的performance是一个问题,将在某些时候解决。
您可以添加引用 HtmlRenderer到您的项目,并执行以下操作,
string htmlCode ="<p>This is a sample html.</p>"; Image image = HtmlRender.RenderToImage(htmlCode ,new Size(500,300));
你当然可以。 GrabzIt的JavaScript API允许你从这样的网页捕捉一个div:
<script type="text/javascript" src="grabzit.min.js"></script> <script type="text/javascript"> GrabzIt("Your Application Key").ConvertURL("http://www.example.com/my-page.html", {"target": "#features", "bheight": -1, "height": -1, "width": -1}).Create(); </script>
其中#features是要捕获的div的ID。 如果你想将HTML转换成图像。 你可以使用这种技术:
GrabzIt("Your Application Key").ConvertHTML( "<html><body><h1>Hello World!</h1></body></html>").Create();
免责声明我build立了这个API!