bubkoo / html-to-image

✂️ Generates an image from a DOM node using HTML5 canvas and SVG.
MIT License
5.79k stars 544 forks source link

Unable to capture 'screenshot' of Google map #116

Closed roguebug closed 3 years ago

roguebug commented 3 years ago

First of all, great work. This is the easiest to use and WORKING module.

I tried to save Google map as an image. The generated image is not exactly the same. In some case, it is very different.

Expected Behavior

The image should look the same as the google map

Current Behavior

See attached screenshots. The left is a Google map using agm-map. The right is generated data PNG. In picture 1, the generated image is very different. In picture 2, only part of the Google map is in the PNG.

html-to-image-googlemap - 1 html-to-image-googlemap - 2

My code is nothing fancy: htmlToImage.toPng(element).then((dataUrl) => { that.imageData = dataUrl; }).catch(function (error) { console.error('oops, something went wrong!', error); });

I noticed the error message in the console: Error while reading CSS rules from https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Google+Sans:400,500,700 SecurityError: Failed to read the 'cssRules' property from 'CSSStyleSheet': Cannot access rules

Not sure if this is what screws up the image rendering.

Your Environment

biiibooo[bot] commented 3 years ago

👋 @roguebug

Thanks for opening your first issue here! If you're reporting a 🐞 bug, please make sure you include steps to reproduce it. To help make it easier for us to investigate your issue, please follow the contributing guidelines.

We get a lot of issues on this repo, so please be patient and we will get back to you as soon as we can.

biiibooo[bot] commented 3 years ago

Hiya! This issue has gone quiet. Spooky quiet. 👻 We get a lot of issues, so we currently close issues after 60 days of inactivity. It’s been at least 20 days since the last update here. If we missed this issue or if you want to keep it open, please reply here. You can also add the label "not-stale" to keep this issue open! As a friendly reminder: the best way to see this issue, or any other, fixed is to open a Pull Request.

Thanks for being a part of the Antv community! 💪💯

sharilyn0415 commented 3 years ago

Run into the same issue. Any updates?

biiibooo[bot] commented 3 years ago

Hiya! This issue has gone quiet. Spooky quiet. 👻 We get a lot of issues, so we currently close issues after 60 days of inactivity. It’s been at least 20 days since the last update here. If we missed this issue or if you want to keep it open, please reply here. You can also add the label "not-stale" to keep this issue open! As a friendly reminder: the best way to see this issue, or any other, fixed is to open a Pull Request.

Thanks for being a part of the Antv community! 💪💯

biiibooo[bot] commented 3 years ago

Hey again! It’s been 60 days since anything happened on this issue, so our friendly neighborhood robot (that’s me!) is going to close it. Please keep in mind that I’m only a robot, so if I’ve closed this issue in error, I’m HUMAN_EMOTION_SORRY. Please feel free to comment on this issue or create a new one if you need anything else. As a friendly reminder: the best way to see this issue, or any other, fixed is to open a Pull Request. Thanks again for being part of the Antv community! 💪💯

maxizhukov commented 3 years ago

I also have same issue, Why are you closing without fixing?

seungilpark commented 2 years ago

same issue here

Screen Shot 2021-12-13 at 11 59 33 AM
managervcf commented 2 years ago

I managed to solve this issue with the html2canvas library. Adding the { useCORS: true } option made it magically it work for me.

If anyone needs, I'm sharing my custom React hook below:

import html2canvas from 'html2canvas';
import { MutableRefObject } from 'react';

/**
 * A hook that exports a function allowing to capture a specific HTMLElement as an image.
 */
export function useScreenshot<T extends HTMLElement>(ref: MutableRefObject<T | null>, filename: string) {
  const takeScreenShot = async (node: T | null) => {
    if (!node) {
      return;
    }

    const dataURI = await html2canvas(
      node,
      // This is a very important line as it allows to capture an image of Google Maps!
      { useCORS: true },
    );
    return dataURI;
  };

  const download = (canvas?: HTMLCanvasElement) => {
    const a = document.createElement('a');

    a.target = '_blank';
    a.href = canvas?.toDataURL() ?? '';
    a.download = `${filename}.jpeg`;
    a.click();
  };

  const downloadScreenshot = () => takeScreenShot(ref.current).then(download);

  return { downloadScreenshot };
}
biiibooo[bot] commented 1 year ago

This thread has been automatically locked because it has not had recent activity. Please open a new issue for related bugs and link to relevant comments in this thread.