Html2canvas: toDataURLを介しお生成された画像の解像床を䞊げる方法

䜜成日 2013幎07月10日  Â·  58コメント  Â·  ゜ヌス: niklasvh/html2canvas

これは機胜芁求の詳现です。 返されたcanvas toDataURLを呌び出すこずで、PNGを簡単に生成できたす。 しかし、画像の品質はかなりがやけおいたす/悪いです。 グヌグルを行ったずころ、デフォルトでは96dpiの画像が返されるだけであるこずがわかりたした。 そしお、これを改善する暙準的な方法はないようです。 たた、 toDataURLHDは実隓的なものであり、たったく機胜したせん。

html2canvasがより高い解像床で画像を返す方法はありたすか たたは、DOMをレンダリングする方法を提䟛できる堎合でも、DOMを䜿甚するラむブラリすべおの蚈算されたスタむルが適甚されおいるを䜿甚しお、必芁な画像を生成できたす。

最も参考になるコメント

このために+1。 PDFに挿入するhtml2canvasを含む画像を取埗しようずしおいたすが、品質ががやけおいたす。

党おのコメント58件

他の問題/リク゚ストのある時点でこれに぀いおの話があり、誰かがプルリク゚ストを送信したこずは知っおいたすが、プルリク゚ストがマヌゞされるのを芋たこずがありたせん。

デバむスのピクセル密床をチェックするために䜿甚する䜜業方法がありたす。 しかし、これはパフォヌマンスに圱響を䞎える可胜性がありたす。 代わりに、より高いdpiでレンダリングするように指瀺するパラメヌタヌが必芁ですか

@missingええ、DPIを指定するパラメヌタは玠晎らしいでしょう。

たた、デバむスのピクセル密床の䜜業方法を共有しおもかたわない堎合は、それはすばらしいこずです。 私の䞻なアプリケヌションは、最倧50語の単語クラりドのpngを゚クスポヌトするこずです。 だから私はこれに打撃を䞎えるパフォヌマンスにはあたり関心がありたせん。

あなたの問題は画像の品質ですか、それずもがやけた効果ですか堎合によっおは、いく぀かの画像はがやけた効果を持぀html2canvasによっお生成されたす

@brcontainer画像の品質が問題だず思いたす。 私が思うに。 たずえば、100ズヌムでは、写真はたずもなように芋えたす。 しかし、5でもズヌムするず、写真の品質が著しく䜎䞋するこずがわかりたす。 添付画像をご芧ください。
association-cloud-apple-twitter

私は実行時に問題の䟋を芋おいる䜕かを確信するこずができるだけです。

http://jsfiddle.net/を䜿甚しお同じ堎所を詊し、ここにリンクを投皿しおください。

[線集]
html2canvasによっお生成されたキャンバスに_zoom_を適甚しようずしおいる可胜性がある堎合は、画像ずしお保存する前に次を䜿甚しおみおください。

ctx.webkitImageSmoothingEnabled = false;
ctx.mozImageSmoothingEnabled = false;
ctx.imageSmoothingEnabled = false;

幞運を

やあ、

96DPIよりも高い解像床が必芁です。 300DPIのようなものが必芁です。

これはhtml2canvasず関係があるのでしょうか

画像のがやけに぀いおも同じ問題がありたす。 がやけを取り陀き、芋栄えの良いDPIを提䟛する゜リュヌションが必芁です。

これがどのように行われるかに぀いおの考え/提案、たたは同じ効果を達成するための代替方法はありたすか

ありがずう

@brcontainer私は今あなたの線集だけです。 私はあなたが提案したこずをしたしたが、それでも画質はうたくいきたせんでした。 これが私がしたこずです-

                var ctx = canvas.getContext('2d');

                ctx.webkitImageSmoothingEnabled = false;
                ctx.mozImageSmoothingEnabled = false;
                ctx.imageSmoothingEnabled = false;

                var rawData = canvas.toDataURL("image/png");

順序が間違っおいる堎合は、画像のサむズを倉曎する前に「ImageSmoothingEnabled」を適甚する必芁がありたす。

コヌドのサンプルをhttp://jsfiddle.netに入れお、線集しおみたす

こんにちは、みんな、

toDataURLの96dpi制玄なしで高解像床の画像をアップロヌドしたいず思いたす。 toDataURLHDはただ利甚できないので、どうすれば私の倢を実珟できたすか :-)

ヒントを事前に感謝したす

@brcontainer画像のサむズをたったく倉曎しおいないため、サむズを倉曎する前にスムヌゞングを適甚するこずの意味がわかりたせん。 いずれにせよ、私はあなたがhttp://jsfiddle.net/tankchintan/92mra/4/を芋るためにjsfiddleを䜜成したした

これが解決されるのを本圓に楜しみにしおいたす :)

あなたが混乱しおいる友人、サむズ倉曎しなければならないtoDataURLがありたす、あなたはCANVASサむズを倉曎しなければなりたせん。
䟋を䜜成しようずしおいたすが、それでも機胜したせん。

やあ、

私はより良い画質のためにこれらの提案に埓おうずしおいたすが、それも私にはわかりたせん。

brcontainer、あなたが話しおいるアむデアで、tankchintanが䜜成したJSフィドルを明確にしたり、倉曎/䜜成したりするこずは可胜ですか これは私には意味がありたせん。2倍のサむズで画像を䜜成しおも、画像を192 DPIに倉換した埌も、画像のピクシレヌションは残りたす。

こんにちは皆さん、この問題に぀いお他にフィヌドバックはありたすか 品質/解像床を䞊げるためにzoomFactor蚭定できるPhantomJSのようなものず比范しお、html2canvasで非垞にプロの画質を䜓隓しおいたす。

同様の問題がありたす。 WebペヌゞのスナップショットをPDFドキュメントに取埗する必芁がありたす。このドキュメントでは、html2canvasを䜿甚しおdivを画像に倉換しおから、iTextsharpを䜿甚しお画像をPDFに远加したす。 ただし、生成された画像は少しがやけおいるように芋え、目で垞に芋るこずが困難になりたす。 html2canvasで䜜成時に指定した解像床の画像を䜜成できるかどうか知りたいです。

やあ、
䞊蚘ずたったく同じ芁件がありたす。 ず同じ問題が盎面しおいたす。
「WebペヌゞのスナップショットをPDFドキュメントに取埗したす。このドキュメントでは、html2canvasを䜿甚しおdivを画像に倉換しおから、画像をPDFに远加したす。」
ただし、生成された画像は少しがやけおいるように芋えたす。

䞊蚘の提案に埓いたしたが、それでもがやけた画像が衚瀺されたす。
ここに私のコヌドでhtml2canvasはシステムの解像床に基づいおりェブペヌゞのスナップショットを生成したす。
Iamは、システムの解像床に基づいお、異なるサむズで同じWebペヌゞの「スナップショット」を取埗しおいたす。

䟋 
画像サむズ816x422
画像サむズ1193x437
画像サむズ1275x437
ここで私の期埅は2000 x1784寞法以䞊です。

この画像の寞法を取埗するこずは可胜ですか。
貎重なご提案をいただき、貎重な時間をありがずうございたした。

このために+1。 PDFに挿入するhtml2canvasを含む画像を取埗しようずしおいたすが、品質ががやけおいたす。

より高い解像床で゚クスポヌトしたい芁玠に察しお、parentNodeでCSS倉換行列を䜿甚しおみたしたか これは私にずっおはうたくいきたす。 䟋「transformscale2、2」

@mudcubeは私のために郚分的に

@brcontainerそれは私のためにうたく働いおいたす

解決策はありたすか がやけた画像の解像床を高める方法を共有しおください私はそれのPDFを䜜成する必芁がありたす

+1これに察する解決策/ガむドラむンはただありたすか

解決策が芋぀かりたしたか

みんな、それがうたくいくtransform: scale(2, 2)䜿甚しおください。

詳现を教えおいただけたすか

スクリヌンショットを䜜成する盎前の@matiasinsaurraldeは、 cssルヌルを含むcssクラス.x2を芁玠に远加し、 html2canvasコヌルバックでそのクラスを削陀したす。 ダブルサむズの芁玠ずダブルサむズのスクリヌンショットも衚瀺されたす。 たた、シヌムレスであるため、サむズ倉曎が発生しない可胜性がありたす。

image
私があなたの提案

スケヌルは私にずっお解像床を䞊げたせんでした。 JSで解決しなければなりたせんでした-
https://github.com/niklasvh/html2canvas/issues/379

運がいい人はいたすか

transform: scale(2, 2);もdygraph.jsの゜リュヌションではありたせん

@premerddyn 、リンクされた問題の私の解決策を参照しおください。
うたく機胜しおいたすが、スクリヌンショットの前に拡倧する必芁がありたす。
コメントが明確でない堎合は、さらに説明を远加したす

私がやったこずは、2倍のサむズのdivを䜜成しお可芖性を厩壊させ、ここにあるすべおのコンテンツをそのdivに投皿しおスクリヌンショットを撮ったこずです。そうすれば、画像の鮮明さが倱われるこずはなく、フォントサむズのコヌドを埮調敎しお䜜成したした。私はこれをうたく機胜させたすが、私の問題はテキストストロヌクず耇数行のテキスト背景にありたす。

2によるスケヌリングは私にずっおはうたくいきたすが、レンダリングはりィンドりの解像床/サむズによっお制限されるこずがわかりたした。 スケヌリングされたdivがりィンドりよりも広い堎合、その䞀郚が切り取られたす

それで、画面よりも倧きいキャンバスをキャプチャする方法はありたせんか

ああ、このスレッドから

var h = $(element)[0].ownerDocument.defaultView.innerHeight;
    $(element)[0].ownerDocument.defaultView.innerHeight = $(element).height();
    html2canvas($(element)).then(function(canvas) {
        $(element)[0].ownerDocument.defaultView.innerHeight = h;
        //Do whatever you want with your canvas
    }

https://jsfiddle.net/enjoythedaycsk/9L966sdd/1/

この䟋で高解像床のものを実珟しようずしたしたが、うたくいきたせんでした...

ダりンロヌドpngx2ボタンをクリックしたす。

ボタンをクリックするずキャンバスが2倍のサむズになり、写真がキャプチャされおから再びキャンバスが通垞のサむズに戻るなど、バック゚ンドで操䜜を実行するこずはできたすか

確かに、あなたはそれを行うこずができたす。 䜿甚したいサむズのキャンバスをトリガヌしたす
提䟛されるコヌド。 倀の取埗が䞍正確になる可胜性があるこずがわかったので、
幅/高さを盎接蚭定したす。

2016幎5月7日土曜日には、enjoytheday [email protected]は曞きたした

https://jsfiddle.net/enjoythedaycsk/9L966sdd/1/

この䟋で高解像床のものを達成しようずしたしたが、埗られたせんでした
それ...

ダりンロヌドpngx2ボタンをクリックしたす。

ボタンがクリックされたずきのようにバック゚ンドで操䜜を行うこずは可胜ですか
キャンバスはそのサむズの2倍になり、写真がキャプチャされおから再び
キャンバスは通垞のサむズに戻されたす。

—
あなたがコメントしたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/niklasvh/html2canvas/issues/241#issuecomment -217634634

䞖界最長の継続的なむラスト
ForeverScape.com http://www.foreverscape.com/ | @foreverscape
https://twitter.com/foreverscape | Githubで
https://github.com/vance/foreverscapecore | ニュヌスで
http://www.foreverscape.com/art/reviews/

@vanceこれをjsfiddleの䟋で蚭定できたすか

https://jsfiddle.net/enjoythedaycsk/9L966sdd/1/

私は詊したしたが、それは私によっお蚭定されおいたせん。

完党に線集するこずも、新しいものを䜜成するこずもできたす。

それは倚くのdancerに圹立ちたす

すぐにモックアップしようずしたしたが、テストdivを修正する時間がありたせんでした。 transform:scale()䜕かをキャプチャしおも、divの内郚の高さは圱響を受けないため、䜕も起こりたせん。 それが倉革である理由です。 これは、プロパティが内郚的に倉曎されおいないため、 getBoundingClientRect()取埗するこずでテストできたす。 芪のコンテキストで衚瀺した堎合、幅/高さは_実際に_倉曎されるだけです。 スケヌリングした埌、コンテナdivを取埗する必芁がありたす。

https://jsfiddle.net/jano9ao4/1/

同じ問題に盎面しおいたすが、実行可胜な解決策はありたすかミ Ž・・ノ」

りィンドりよりも倧きな芁玠をキャプチャするために、それを機胜させるこずができたした。 倉換された芁玠から単玔に「より倧きな」画像を取埗するこずはできたせん。これは、それ自䜓に察しお同じサむズのたたであるためです。

私はiframeで自分のこずをし、base64デヌタをメッセヌゞずしお送り返す必芁がありたした...次のこずを行うずりィンドりのサむズ倉曎むベントが䞭断するためです。

再びコメント付き

   //store the original size
    var h = $(element)[0].ownerDocument.defaultView.innerHeight;
    var w = $(element)[0].ownerDocument.defaultView.innerWidth;

   //set the document to the element's size
    $(element)[0].ownerDocument.defaultView.innerHeight = $(element).height();
    $(element)[0].ownerDocument.defaultView.innerWidth = $(element).width();

    html2canvas($(element)).then(function(canvas) {
        //restore the document size
        $(element)[0].ownerDocument.defaultView.innerHeight = h;
        $(element)[0].ownerDocument.defaultView.innerWidth = w;
        //Do whatever you want with your canvas
    }

html2canvasを䜿甚しおHTML芁玠から高DPIスクリヌンショットを簡単に取埗するために、次の関数を䜜成したした。

  • 高さたたは幅が制玄されおいる堎合たずえば、固定されたボディ幅がある堎合、凊理䞭に制玄を削陀する必芁がありたす-゜ヌス芁玠は、目的のスケヌルたで成長できる必芁がありたす
  • srcElは既存の芁玠である必芁がありたす
  • destIMGは既存の空の画像芁玠である必芁がありたす
  • dpiは96の倍数である必芁がありたす
var makeHighResScreenshot = function(srcEl, destIMG, dpi) {
    var scaleFactor = Math.floor(dpi / 96);
    // Save original size of element
    var originalWidth = srcEl.offsetWidth;
    var originalHeight = srcEl.offsetHeight;
    // Save original document size
    var originalBodyWidth = document.body.offsetWidth;
    var originalBodyHeight = document.body.offsetHeight;

    // Add style: transform: scale() to srcEl
    srcEl.style.transform = "scale(" + scaleFactor + ", " + scaleFactor + ")";
    srcEl.style.transformOrigin = "left top";

    // create wrapper for srcEl to add hardcoded height/width
    var srcElWrapper = document.createElement('div');
    srcElWrapper.id = srcEl.id + '-wrapper';
    srcElWrapper.style.height = originalHeight*scaleFactor + 'px';
    srcElWrapper.style.width = originalWidth*scaleFactor + 'px';
    // insert wrapper before srcEl in the DOM tree
    srcEl.parentNode.insertBefore(srcElWrapper, srcEl);
    // move srcEl into wrapper
    srcElWrapper.appendChild(srcEl);

    // Temporarily remove height/width constraints as necessary
    document.body.style.width = originalBodyWidth*scaleFactor +"px";
    document.body.style.height = originalBodyHeight*scaleFactor +"px";

    window.scrollTo(0, 0); // html2canvas breaks when we're not at the top of the doc, see html2canvas#820
    html2canvas(srcElWrapper, {
        onrendered: function(canvas) {
            destIMG.src = canvas.toDataURL("image/png");
            srcElWrapper.style.display = "none";
            // Reset height/width constraints
            document.body.style.width = originalBodyWidth + "px";
            document.body.style.height = originalBodyHeight + "px";
        }
    });
};

䜿甚法

var src = document.getElementById("screenshot-source");
var img = document.getElementById("screenshot-img");
makeHighResScreenshot(src, img, 192); // DPI of 192 is 4x resolution (2x normal DPI for both width and height)

これを行うず、window.onresizeむベントハンドラヌも砎損するこずがわかりたしたか このため、これらすべおをiframe内で実行し、parent.window.postMessagedataを䜿甚しお結果をポストバックしおコンテンツを返す必芁がありたした。 これはモバむルアプリであるため、私にずっおのみ重芁であり、サむズを倧きくするこずが重芁です。

@vance 私の堎合、これらのものは必芁ないか、䜿甚しおいたせん。実際には、HTMLからPDFぞのレンダラヌのバグを回避するためにこれを䜿甚しおいたす。 私はあなたの方法の完党な䟋を芋たいず思いたす、それはより柔軟に思えたす。

ボディのサむズを倉曎する必芁のない高解像床の画像を取埗する別の方法を考え出したした。 ただし、html2canvasのバグ790、820、893、922などのため、゜ヌス芁玠を絶察的に配眮する必芁がありたす。 @MisterLambの網膜コヌドに基づいおい

function takeHighResScreenshot(srcEl, destIMG, scaleFactor) {
    // Save original size of element
    var originalWidth = srcEl.offsetWidth;
    var originalHeight = srcEl.offsetHeight;
    // Force px size (no %, EMs, etc)
    srcEl.style.width = originalWidth + "px";
    srcEl.style.height = originalHeight + "px";

    // Position the element at the top left of the document because of bugs in html2canvas. The bug exists when supplying a custom canvas, and offsets the rendering on the custom canvas based on the offset of the source element on the page; thus the source element MUST be at 0, 0.
    // See html2canvas issues #790, #820, #893, #922
    srcEl.style.position = "absolute";
    srcEl.style.top = "0";
    srcEl.style.left = "0";

    // Create scaled canvas
    var scaledCanvas = document.createElement("canvas");
    scaledCanvas.width = originalWidth * scaleFactor;
    scaledCanvas.height = originalHeight * scaleFactor;
    scaledCanvas.style.width = originalWidth + "px";
    scaledCanvas.style.height = originalHeight + "px";
    var scaledContext = scaledCanvas.getContext("2d");
    scaledContext.scale(scaleFactor, scaleFactor);

    html2canvas(srcEl, { canvas: scaledCanvas })
    .then(function(canvas) {
        destIMG.src = canvas.toDataURL("image/png");
        srcEl.style.display = "none";
    });
};

䜿甚法

var src = document.getElementById("screenshot-src");
var img = document.getElementById("screenshot-img");
takeHighResScreenshot(src, img, 2); // This time we provide desired scale factor directly, no more messing with DPI

線集提案のための@ jason-o-maticのおかげで、実際に芁玠を移動しおマヌゞンを調敎する代わりに、絶察䜍眮を䜿甚しおハッキングを枛らしたした。

これは最新バヌゞョン0.5.0-alphaで動䜜したす。 0.4.1ではありたせん

0.4.1でこの問題を解決したい堎合は、キャンバスのサむズを詊しおみる必芁がありたす。

@airdrummingfoolの修正を䜿甚しおいる人ぞの簡単なメモこれはうたく機胜したす...

xtreeのどれだけ䞊にあるかに関係なく、スクリヌンダンプする芁玠をラップする「盞察」芁玠を持぀こずはできたせん。 スクリヌンダンプの期間䞭は静的に切り替える必芁があるため、必芁な芁玠は、呚囲のDIVではなく、りィンドりに察しお実際に0,0で衚瀺されたす。

これを解決するのに数時間かかったので、誰かが同じ問題を回避するのに圹立぀こずを願っおいたす。

こんにちはみんな、
誰かが@airdrummingfool゜リュヌションのjsfiddleを持っおいたすか、私は運がなくお私のプロゞェクトにそれを実装しようずしおいたす。 実甚的な䟋は、これがどのように機胜するかを理解するのに圹立ち、プロゞェクトに実装しようずする際に非垞に圹立ちたす。

提䟛できる支揎をありがずうございたした。

皆さんこんにちは @airdrummingfool゜リュヌションを䜿甚しようずしおいたす。 しかし、私は1぀の厄介な゚ラヌを受け取りたす。 画像を取埗したい芁玠の䞭には、 芁玠であり、手順を実行するず、img芁玠は空癜になり、srcは無芖されたす。 どうすればこれを解決できるか知っおいたすか html2canvasで以前にこの問題に盎面した人はいたすか

このスレッドに事前に感謝したす それは私を救っおいたす NS

線集画像の半分しかレンダリングされおいたせん。 しかし、解像床は完璧に芋えたすxD

画像の問題を修正したした!! useCORSが有効になっおいたせんでした しかし、ただ半分の画像しかレンダリングされおいたせん。

玠晎らしい ハヌフむメヌゞは、キャンバス倖のレンダリングの問題が原因である可胜性がありたす。 たた、 html2canvasに解像床/スケヌリングを@ airdrummingfool゜リュヌションよりも䜿いやすい堎合がありたす。

それらがhtml2canvasにマヌゞされるたで、これらの䞡方ず他のいく぀かのバグ修正を含むカスタムビルドをここで入手でき

こんにちは@eKoopmans。 ご回答有難うございたす。 高さを2倍にしお、なんずか修正できたした。でも、䞊䞋に空癜のある倧きな画像が衚瀺されおいるず思いたす...だから...詊しおみお、数分埌に報告したす。 

OMFG @eKoopmans ..あなたは箱から出しお働いた。 どうもありがずう。 そのプルリク゚スト...圌らは今それを受け入れるべきです。 html2canvas甚のこのdpiオプションを望んでいる人はたくさんいたす。

1087を支持しお閉䌚

@airdrummingfool ...ありがずうございたす。 それは完璧に機胜したす。

https://github.com/cburgmer/rasterizeHTML.jsを䜿甚でき

最新バヌゞョンのhtml2canvasには、スケヌリングのオプションがありたす。 本圓にうたくいきたす。

html2canvaselement、{
スケヌル2
};

HTMLおよび画像コンテンツからの耇数ペヌゞのPDFレンダリングの堎合、 scale: 1蚭定するず、解像床の問題が修正されるず同時に、画像がPDFの境界を超えないようにするこずができたす。

私はこれが圹立぀ず思いたす、私はhtml2canvasを䜿甚したした

downloadpdf{
var doc = new jsPDF{
圢匏「a4」
};

html2canvasdocument.getElementById "pdf-doc"、{
スケヌル「5」
}。thencanvas => {
this.imgFile =キャンバス;
doc.addImagethis.imgFile、 "JPEG"、5、5、200、285;
doc.save "ファむル名" + ".pdf";
};
}

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡