HTML을 이미지로 렌더링 알고 있지만 예를

PNG와 같이 HTML을 이미지로 렌더링하는 방법이 있습니까? 캔버스에서 가능하다는 것을 알고 있지만 예를 들어 div와 같은 표준 HTML 요소를 렌더링하고 싶습니다.



답변

나는 이것이 이미 많은 답변을 가지고있는 아주 오래된 질문이라는 것을 알고 있지만, 실제로 내가 원하는 것을 실제로하려고 노력하는 데 몇 시간을 보냈습니다.

  • html 파일이 주어지면 명령 줄에서 투명한 배경 으로 (png) 이미지를 생성하십시오.

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

명령 설명 :

  • 명령 행에서 Chrome을 실행합니다 (여기서는 Mac에서는 표시되지만 Windows 또는 Linux에서는 유사하다고 가정).
  • --headless Chrome을 열지 않고 실행하고 명령이 완료된 후 종료
  • --screenshot스크린 샷을 캡처합니다 ( screenshot.png명령이 실행되는 폴더에서 파일을 생성한다는 점에 유의하십시오 )
  • --window-size화면의 일부만 캡처 할 수 있습니다 (형식은 --window-size=width,height).
  • --default-background-color=0Chrome에 기본 흰색이 아닌 투명한 배경 을 사용하도록 지시하는 마술
  • 마지막으로 html 파일을 제공합니다 (로컬 또는 원격 URL로).

답변

예. 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);
    });


답변

많은 옵션이 있으며 모두 장단점이 있습니다.

옵션 1 : 사용 가능한 많은 라이브러리 중 하나 사용

찬성

  • 대부분의 경우 변환은 매우 빠릅니다.

단점

  • 잘못된 렌더링
  • 자바 스크립트를 실행하지 않습니다
  • 최근 웹 기능 (FlexBox, 고급 선택기, 웹 폰트, 상자 크기 조정, 미디어 쿼리 등)은 지원하지 않습니다.
  • 때로는 설치가 쉽지 않은 경우가 있습니다
  • 규모가 복잡하다

옵션 2 : PhantomJ 및 랩퍼 라이브러리 사용

찬성

  • 자바 스크립트 실행
  • 꽤 빠른

단점

  • 잘못된 렌더링
  • 최근 웹 기능 (FlexBox, 고급 선택기, 웹 폰트, 상자 크기 조정, 미디어 쿼리 등)은 지원하지 않습니다.
  • 규모가 복잡하다
  • 로드 할 이미지가있는 경우 작동하기가 쉽지 않습니다 …

옵션 3 : Chrome 헤드리스 및 랩퍼 라이브러리 사용

찬성

  • 자바 스크립트 실행
  • 거의 완벽한 렌더링

단점

  • 다음과 관련하여 원하는 결과를 정확하게 얻는 것은 쉽지 않습니다.
    • 페이지로드 타이밍
    • 뷰포트 치수
  • 규모가 복잡하다
  • HTML에 외부 링크가 포함되어 있으면 상당히 느리고 느려집니다.

옵션 4 : API 사용

찬성

  • 자바 스크립트 실행
  • 거의 완벽한 렌더링
  • 캐싱 옵션을 올바르게 사용할 때 빠름
  • 스케일은 API에 의해 처리됩니다
  • 정확한 타이밍, 뷰포트, …
  • 대부분의 경우 무료 플랜을 제공합니다

단점

  • 많이 사용할 계획이라면 무료가 아닙니다.

공개 : 저는 ApiFlash의 창립자입니다. 나는 정직하고 유용한 답변을 제공하기 위해 최선을 다했습니다.


답변

여기에있는 모든 답변은 타사 라이브러리를 사용하는 반면 HTML을 이미지로 렌더링하는 것은 순수한 Javascript에서 비교적 간단 할 수 있습니다. 가 되고 도 있었다 그것에 대해 기사 MDN에 캔버스 섹션은.

요령은 다음과 같습니다.

  • XHTML을 포함하는 foreignObject 노드로 SVG를 만듭니다.
  • 이미지의 src를 해당 SVG의 데이터 URL로 설정하십시오.
  • 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()
}

몇 가지 참고할 사항

  • SVG 내부의 HTML은 XHTML이어야합니다
  • 보안상의 이유로 이미지의 데이터 URL 인 SVG는 외부 소스를로드 할 수 없으므로 HTML에 대한 격리 된 CSS 범위로 작동합니다. 그래서 예를 들어 구글 글꼴 같은 도구를 사용하여 인라인해야하는 이 일을 .
  • SVG 내부의 HTML이 이미지의 크기를 초과하더라도 캔버스에 올바르게 그려집니다. 그러나 실제 높이는 해당 이미지에서 측정 할 수 없습니다. 고정 높이 솔루션은 잘 작동하지만 동적 높이는 약간 더 많은 작업이 필요합니다. SVG 데이터를 격리 된 CSS 범위의 경우 iframe으로 렌더링하고 결과 크기를 캔버스에 사용하는 것이 가장 좋습니다.

답변

헤드리스 웹킷 (사파리의 렌더링 엔진 및 (최근까지) 크롬) 드라이버 인 PhantomJS를 사용할 수 있습니다 . 여기 에서 페이지의 화면 캡처 방법을 배울 수 있습니다 . 희망이 도움이됩니다!


답변

wkhtmltopdf와 같은 HTML-PDF 도구를 사용할 수 있습니다. 그런 다음 PDF를 사용하여 imagemagick와 같은 이미지 도구를 사용할 수 있습니다. 분명히 이것은 서버 측이며 매우 복잡한 프로세스입니다 …