PNG gibi resme html oluşturmanın bir yolu var mı? Tuval ile mümkün olduğunu biliyorum ama örneğin div gibi standart html elemanını işlemek istiyorum.
PNG gibi resme html oluşturmanın bir yolu var mı? Tuval ile mümkün olduğunu biliyorum ama örneğin div gibi standart html elemanını işlemek istiyorum.
Yanıtlar:
Bunun zaten çok fazla cevabı olan oldukça eski bir soru olduğunu biliyorum, ancak hala istediğimi yapmaya çalışarak saatler geçirdim:
Chrome başsız (bu yanıttan itibaren sürüm 74.0.3729.157) kullanmak aslında kolaydır:
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless --screenshot --window-size=256,256 --default-background-color=0 button.html
Komutun açıklaması:
--headless
Chrome'u açmadan çalıştırır ve komut tamamlandıktan sonra çıkış yapar--screenshot
bir ekran görüntüsü yakalar ( screenshot.png
komutun çalıştırıldığı klasörde çağrılan bir dosya oluşturduğunu unutmayın )--window-size
ekranın yalnızca bir kısmını yakalamaya izin ver (biçim --window-size=width,height
)--default-background-color=0
Chrome'a varsayılan beyaz rengi değil şeffaf bir arka plan kullanmasını söyleyen sihir--screenshot='absolute\path\of\screenshot.png'
benim için çalıştı
Evet. HTML2Canvas , HTML'yi oluşturmak için var <canvas>
(daha sonra resim olarak kullanabilirsiniz).
NOT: Bunun SVG ile çalışmayacağı bilinen bir sorun var
Ben sadece bu sorunu çözmek için yazılmış dom-görüntü kitaplığı tavsiye edebilir miyim (ben koruyucusuyum).
Bunu nasıl kullanacağınız (bazıları burada ):
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
) dönüştürmeye çalışın, sonra kendiniz tuval üzerine renderlayın ve bir şekilde o tuvalin çözünürlüğü ile oynamayı deneyin. Büyük olasılıkla lib'in kendisinde bir tür oluşturma seçeneği gibi bir özellik uygulamak mümkündür, böylece görüntü boyutlarını piksel cinsinden geçirebilirsiniz. İhtiyacınız olursa, github'da bir sorun oluşturmanızı takdir ediyorum.
Çok fazla seçenek var ve hepsinin pro ve eksileri var.
Artıları
Eksileri
Artıları
Eksileri
Artıları
Eksileri
Artıları
Eksileri
Açıklama: ApiFlash'ın kurucusuyum. Dürüst ve faydalı bir cevap vermek için elimden geleni yaptım.
Buradaki tüm yanıtlar üçüncü taraf kitaplıklarını kullanırken bir görüntüye HTML oluştururken saf Javascript'te nispeten basit olabilir. Orada olduğunu bile oldu bu konuda bir makale MDN'yi üzerinde tuval bölümünde.
İşin püf noktası şudur:
drawImage
tuval üzerineconst {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()
}
Dikkat edilmesi gereken bazı şeyler
Document
bir raster haline getirilmesine izin vermesi büyük olasılıktır (örneğin a Canvas
), ancak kimse standartlaştırmak için uğraşmadığından, yukarıda gösterildiği gibi deliliğe başvurmalıyız (bunun yazarına suç yok) kodu).
Başsız bir webkit (safari ve (yakın zamana kadar krom işleme platformu ) sürücüsü olan PhantomJS'yi kullanabilirsiniz . Sayfaların ekran yakalama yapmak öğrenebilirsiniz burada . Umarım yardımcı olur!
Wkhtmltopdf gibi bir HTML'den PDF'ye aracını kullanabilirsiniz. Ve sonra imagemagick gibi bir görüntü aracı için PDF kullanabilirsiniz. Kuşkusuz bu sunucu tarafı ve çok kıvrımlı bir süreç ...
Node.js
. Basit ön uca ne dersiniz?
Chrome, Firefox ve MS Edge için çalışmam gereken tek kütüphane rasterleştirildiHTML . HTML2Canvas'tan daha kaliteli çıktı ve HTML2Canvas'ın aksine hala destekleniyor.
Öğe Alma ve PNG Olarak İndirme
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)
Düğümde innerHTML çağırıyorum
HTML'yi Tuval'e dönüştürmek için eklenti ve çağrı yöntemini içeren html2canvas kullanın ve ardından resim PNG olarak indirin
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();
});
Kaynak : http://www.freakyjolly.com/convert-html-document-into-image-jpg-png-from-canvas/
Bunun en iyi cevap olmasını beklemiyorum, ancak göndermek için yeterince ilginç görünüyordu.
Favori tarayıcınızı istediğiniz HTML belgesine açan, pencereyi doğru şekilde boyutlandıran ve ekran görüntüsü alan bir uygulama yazın. Ardından, görüntünün kenarlıklarını kaldırın.
Bu kodu kullanın, kesinlikle işe yarayacaktır:
<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 dosyasını programınıza eklemeyi unutmayın. https://html2canvas.hertzen.com/dist/html2canvas.js
Bunu yalnızca% 100 JavaScript ile doğru şekilde yapamazsınız.
Orada bir Qt Webkit aracı ve bir python sürümü var . Kendiniz yapmak isterseniz, Kakao ile başarılı oldum:
[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];
}];
Bu yardımcı olur umarım!
Phantomjs yükleyin
$ npm install phantomjs
Aşağıdaki kodla github.js dosyası oluşturun
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();
});
Dosyayı argüman olarak phantomjs'e iletin
$ phantomjs github.js
HtmlToImage.jar, bir HTML'yi bir resme dönüştürmenin en basit yolu olacaktır
Şunları yapabilirsiniz referans eklemek HtmlRenderer , projenize ve aşağıdakileri yapın
string htmlCode ="<p>This is a sample html.</p>";
Image image = HtmlRender.RenderToImage(htmlCode ,new Size(500,300));