Html2canvas: ์ง€๋„ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฌธ์ œ(Google Maps)

์— ๋งŒ๋“  2014๋…„ 03์›” 06์ผ  ยท  51์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: niklasvh/html2canvas

์•ˆ๋…•, ์–˜๋“ค์•„.
๋‚ด ๋Œ€ํ™” ์ƒ์ž์˜ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1

html2canvas๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์‹œ ์ง€๋„๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2

๋‚ด ์ฝ”๋“œ:

            function imagem()
            {
                var html2obj = html2canvas($('#dialogPrint'));
                var queue  = html2obj.parse();
                var canvas = html2obj.render(queue);
                var img = canvas.toDataURL();
                window.open(img);
            };

๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ์‚ฌ ํ•ด์š”

Needs More Information

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

Google ์ง€๋„์˜ ์ƒˆ ๋ฒ„์ „์—์„œ๋Š” ๋ณ€ํ™˜์ด ๋‹ค๋ฅธ div์— ์ ์šฉ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. @GCorbel ์˜ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ด ์„ ํƒ๊ธฐ์™€ ํ•จ๊ป˜ (".gm-style>div:first>div:first>div:last>div") ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„์ง ์™„์ „ํžˆ ํ…Œ์ŠคํŠธํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ.

๋ชจ๋“  51 ๋Œ“๊ธ€

๋ฌธ์ œ๋Š” Google ์ง€๋„๊ฐ€ html2canvas์—์„œ ์™„์ „ํžˆ ๊ตฌํ˜„๋˜์ง€ ์•Š์€ CSS3 ๋ณ€ํ™˜ ๋งคํŠธ๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”?

Google ์ง€๋„ ์ด๋ฏธ์ง€(์™ธ๋ถ€ ์„œ๋ฒ„์˜ ์ด๋ฏธ์ง€)?

ํ”„๋ก์‹œ ์‚ฌ์šฉ: https://github.com/niklasvh/html2canvas#how -does-it-work

brcontainer: ๋ถˆ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(๋‹ค๋ฅธ ์ปดํ“จํ„ฐ /proxy/์—์„œ ์ง์ ‘ ์ง€๋„ ํƒ€์ผ์— ์•ก์„ธ์Šค). ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ CORS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@bkralik ํ”„๋ก์‹œ๋Š” "์ฐจ๋‹จ๋œ ์‚ฌ์ดํŠธ"์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ html2canvas์šฉ ํ”„๋ก์‹œ๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ API๊ฐ€ ๋กœ์ปฌ ์‚ฌ์ดํŠธ์— ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์™ธ๋ถ€ ์„œ๋ฒ„์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์—ด ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒฝ์šฐ ํ”„๋ก์‹œ ์šฉ์–ด๋Š” ๋‹ค๋ฅธ ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋ก์‹œ๋Š” ๋‹ค์šด๋กœ๋“œํ•œ ์™ธ๋ถ€ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ณ  html2canvas๋Š” ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„์—๋งŒ ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์ œ๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด http://en.wikipedia.org/wiki/Same_origin_policy ๋ฅผ ์ฝ์œผ์‹ญ์‹œ์˜ค.

์ด ํ”„๋ก์‹œ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?

ํ”„๋ก์‹œ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•œ ๋งํฌ(php ์–ธ์–ด , C#(asp.net), python ๋ฐ VB(asp ํด๋ž˜์‹)).

ํ”„๋ก์‹œ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ๋ˆˆ์น˜์ฑ„์ง€ ๋ชปํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์—ฌ๊ธฐ์—์„œ ์•Œ๋ ค ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
https://github.com/niklasvh/html2canvas/wiki/Proxies

์ƒˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ•ญ์ƒ ์ „์ฒด README๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@brcontainer ์ด ํ”„๋ก์‹œ๊ฐ€ ํ•˜๋Š” ์ผ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์Šคํฌ๋ฆฐ์ƒทํ•˜๊ณ  ์‹ถ์„ ๋•Œ SERVER๊ฐ€ ๋ชจ๋“  ์‚ฌ์ง„์„ ๋กœ์ปฌ ํด๋”์— ๋‹ค์šด๋กœ๋“œํ•œ ๋‹ค์Œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๊ฑด ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Google์€ ํƒ€์ผ ์„œ๋ฒ„๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์˜ ๊ด€์ ์—์„œ ๋ˆ„๊ตฐ๊ฐ€ ์›นํŽ˜์ด์ง€๋ฅผ ๋ณด์ง€ ์•Š๊ณ  ๊ฐ‘์ž๊ธฐ ๋งŽ์€ ํƒ€์ผ์„ ์„œ๋ฒ„์— ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค...

๋‚˜๋Š” ์ž๋ฐ”๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@brcontainer ๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ CSS3 ๋ณ€ํ™˜์—๋Š” ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Google ํฌ๋กฌ์—์„œ ์‹คํ–‰๋˜๋Š” googlemaps๊ฐ€ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ๊ตฌํ˜„์—์„œ๋Š” ๋งต์„ ์Šคํฌ๋ฆฌ๋‹ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ €๋ฅผ ๋ฏฟ์œผ์„ธ์š”. ์ œ๊ฐ€ ์ž‘์„ฑํ•œ ํ”„๋กœ์ ํŠธ์— ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค...

@bkralik ๊ทธ๋ž˜์„œ, ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋„ ์ž๋ฐ”๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜์ง€๋งŒ(์ด๋ฏธ PHP, C # ๋ฐ VB๋กœ ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค) ์ž๋ฐ”๋กœ ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑํ•  ์‹œ๊ฐ„์ด ์•„๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ผ์š”์ผ์— ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ JSP ๋˜๋Š” "Java Desktop"์ž…๋‹ˆ๊นŒ?

@brcontainer JSF, Primefaces, Javascript ๋ฐ Java๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์›น

@DanielSBelo JSF ํ”„๋ ˆ์ž„์›Œํฌ ์ €๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด ์ˆœ์ˆ˜ Java๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ–ˆ๋Š”๋ฐ Java ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋กœ ํ˜„์žฌ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์‰ฌ์šธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋ฅผ ๋•๊ณ  ์‹ถ์—ˆ์ง€๋งŒ, ์ •๋ง๋กœ ์‹œ๊ธฐ์ ์ ˆํ•˜์ง€ ์•Š์•˜๋‹ค.

[ํŽธ์ง‘๋จ]
CSS ๋ณ€ํ™˜ ์ง€์› ์ •๋ณด: https://github.com/niklasvh/html2canvas#contributing

@DanielSBelo ์ด์— ๋Œ€ํ•œ ์ข‹์€ ์†”๋ฃจ์…˜์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ? ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€๋„๋ฅผ ์บ”๋ฒ„์Šค๋กœ ์ €์žฅํ•˜๋ฉด Firefox์—์„œ๋Š” ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ Chrome์—์„œ๋Š” ์ง€๋„๋ฅผ ์ €์žฅํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜๊ณผ ์ง์ ‘์ ์ธ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ Chrome์ด COR์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋” ํฝ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋‹ต์„ ์ฐพ์œผ๋ ค๊ณ  ์™„์ „ํžˆ ๋ง‰ํ˜”์Šต๋‹ˆ๋‹ค.

@TGOlson html2canvas ์˜ ํ˜„์žฌ ๋ฆด๋ฆฌ์Šค๋Š” "ํ•œ ๋ ˆ๋ฒจ"์˜ ๋ณ€ํ™˜๋งŒ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— CSS3 ๋ณ€ํ™˜์— ์ •๋ง ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
Google ์ง€๋„๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ณ€ํ™˜์— ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์Šคํฌ๋ฆฐ์ƒท์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
map_2014-08-10_10-44-02
(css์—์„œ๋Š” ์ „์ฒด ๋งต์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐฐ์น˜๋˜์ง€๋งŒ css3์„ ๋น„ํ™œ์„ฑํ™”ํ•œ ํ›„ ์ด๋Ÿฌํ•œ ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.)
์œ ์ผํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์ „์ฒด css3 ๋ณ€ํ™˜ ์Šคํƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด Niklas์— ์˜ํ•ด ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ๋ชจ๋ฅด์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ๊ฒƒ์„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค :-)

๊ตฌ๋…

์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Chrome์—์„œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. html2canvas-proxy-php๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ง€๋„์˜ ์ผ๋ถ€๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.. ์ง€๋„ ํฌ๊ธฐ ์กฐ์ •, ์˜ค๋ฒ„๋ ˆ์ด ์ถ”๊ฐ€/์ œ๊ฑฐ ๋“ฑ๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  - ์ผ๋ถ€ ์ง€๋„ ์บก์ฒ˜ ๊ธฐ๋Šฅ์„ ์‹ ์†ํ•˜๊ฒŒ ์‹œ์ž‘ํ•˜๊ณ  ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์–ธ์ œ๋“ ์ง€ Google ์ŠคํŠธ๋ฆฌํŠธ ๋ทฐ ๋˜๋Š” ์ •์  ์ง€๋„ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€๋„์—์„œ ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์žฌ๊ตฌ์„ฑํ•œ ๋‹ค์Œ( map.getPov ๋“ฑ) Google์—์„œ ํ•ด๋‹น ์ •์  ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์˜ค๋ฒ„๋ ˆ์ด์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š”์ด ๋ฌธ์ œ๋ฅผ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ‹€๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด ์ด stackoverflow ์งˆ๋ฌธ์— ์ด ๋ฌธ์ œ๊ฐ€ ํ‘œ์‹œ๋˜๋ฉฐ css3 ๋ณ€ํ™˜์„ ์ฝ๊ณ  ์ผ๋ฐ˜ CSS ์œ„์น˜๋กœ ์ ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

var transform=$(".gm-style>div:first>div").css("transform")
var comp=transform.split(",") //split up the transform matrix
var mapleft=parseFloat(comp[4]) //get left value
var maptop=parseFloat(comp[5])  //get top value
$(".gm-style>div:first>div").css({ //get the map container. not sure if stable
  "transform":"none",
  "left":mapleft,
  "top":maptop,
})

์•„๋งˆ๋„ css3 ๋ณ€ํ™˜์„ ํ™•์ธํ•˜๊ณ  ๋ Œ๋”๋งํ•˜๋Š” ๋™์•ˆ ์ผ๋ฐ˜ CSS ์œ„์น˜๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ ๋ Œ๋”๋ง ํ›„์— ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ์ •ํ•˜์ง€ ์•Š์€ ํ™”๋ฉด ์บก์ฒ˜ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํŽ˜์ด์ง€๋ฅผ ์™„์ „ํžˆ ์ƒˆ๋กœ๊ณ ์นจํ•œ ํ›„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค(firefox์—์„œ CTLR+R ์‚ฌ์šฉ).

์—ฌ๊ธฐ ๋‚ด ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฐฝ์˜ ์บก์ฒ˜๋œ printreen์˜ 64 ๊ธฐ๋ณธ/png ์ด๋ฏธ์ง€์™€ ๋‚ด๊ฐ€ ์ž…๋ ฅํ•œ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํƒœ๊ทธ๊ฐ€ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค

ํ•จ์ˆ˜ ebfPrintScreen(๊ตฌ์„ฑ ์š”์†Œ ์ด๋ฆ„)
{
html2์นด๋ธŒ๋‚˜์Šค
([๋ฌธ์„œ.๋ณธ๋ฌธ],
{
๋กœ๊น…: ์ฐธ,
useCORS: ์‚ฌ์‹ค,
onrendered: ํ•จ์ˆ˜(์บ”๋ฒ„์Šค)
{
img = ์บ”๋ฒ„์Šค.toDataURL("์ด๋ฏธ์ง€/jpg");

                                                  console.log(img.length);
                                                  console.log(img);

                                                  var imgComp = $c(conponentName);
                                                  imgComp.img.src = img

                                          }
                      }
                );

}

์ฃผ์š” ๋ชฉํ‘œ๋Š” ์ƒ์„ฑ๋œ ํ›„ Google ์ง€๋„ ๊ฒฝ๋กœ๋ฅผ ์บก์ฒ˜ํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์ž‘๋™ํ•  ๋•Œ๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ๋•Œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋‹จ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๋„๋ฅผ ํ™•๋Œ€ํ•˜๊ณ  ํŒจ๋‹ํ•œ ํ›„ ์ด๋ฏธ์ง€๋ฅผ ์ฐ์œผ๋Ÿฌ ๊ฐ€๋Š”๋ฐ ์ง€๋„ ์ „์ฒด๊ฐ€ ๊ฐ‘์ž๊ธฐ ์—ฐํ•œ ๊ฐˆ์ƒ‰์œผ๋กœ ๋’ค๋ฎ์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ Chrome์—์„œ ์ด์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

@mfirdaus ์˜ ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ

@mfirdaus ์˜ ์†”๋ฃจ์…˜์„ ์ ์šฉํ•œ ํ›„ ์ง€๋„ ๋ณด๊ธฐ๋ฅผ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ป๊ฒŒ๋“  ์•„๋ž˜์˜ ์ด ์ฝ”๋“œ๋Š” ์ง€๋„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ html2canvas๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ).

$(".gm-style>div:first>div").css({ //get the map container. not sure if stable
      "transform":"none",
      "left":mapleft,
      "top":maptop,
    })

ํ•ด๋‹น ๋ผ์ธ์ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ "๋ณต์›"ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ง€๊ธˆ์€ ๋ณ€ํ™˜ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ html2canvas ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ํ›„ ์ง€๋„๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด initMap ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ Google Maps v3์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

์ œ ์š”๊ตฌ ์‚ฌํ•ญ์€ ๊ฒฝ๋กœ๊ฐ€ ๊ทธ๋ ค์ง„ Google Map v3์˜ ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Firefox์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ Chrome์—๋Š” ๋งˆ์ปค๋‚˜ ๊ฒฝ๋กœ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ด๋ฏธ ์ปค์Šคํ…€ ๋งˆ์ปค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ˜์†”์— ์˜ค๋ฅ˜๊ฐ€ ์—†๊ณ  ๋กœ๊น…์ด ๋„ˆ๋ฌด ์ œํ•œ๋˜์–ด ๋””๋ฒ„๊น…์— ์–ด๋ ค์›€์„ ๊ฒช์Šต๋‹ˆ๋‹ค.

Chrome์—์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‘ ๊ฐ€์ง€ ์–ธ์–ด๋กœ ํ”„๋ก์‹œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋‘˜ ๋‹ค ์ฐจ์ด๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท์—์„œ ์ด ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌ/์ž˜๋ผ๋ƒ…๋‹ˆ๋‹ค.

  if($.browser.safari) {// Fix for Chrome
    var transform=$(".gm-style>div:first>div").css("transform");
    var comp=transform.split(","); //split up the transform matrix
    var mapleft=parseFloat(comp[4]); //get left value
    var maptop=parseFloat(comp[5]);  //get top value
    $(".gm-style>div:first>div").css({ //get the map container. not sure if stable
      "transform":"none",
      "left":mapleft,
      "top":maptop,
    });
  }

  html2canvas([$("#map")[0]], {
    logging: false,
    useCORS: true,
    onrendered: function (canvas) {
      $('#screenshot').after(canvas);

      if($.browser.safari) {// Fix for Chrome
        $(".gm-style>div:first>div").css({
          left:0,
          top:0,
          "transform":transform
        });
      }
    }
  });

์ž‘๋™ํ•˜์ง€๋งŒ ํ•ธ๋“ค๋Ÿฌ๋กœ ๋งต์„ ์ด๋™ํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งˆ์ปค, ํด๋ฆฌ๊ณค ๋“ฑ์œผ๋กœ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ด์–ดํญ์Šค์—์„œ๋„ ์ž‘๋™ํ•˜์ง€๋งŒ(์ง€๋„๋ฅผ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Œ) ํฌ๋กฌ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์ƒ๊ฐ?

๊ณ ์ • !

๋‚ด๊ฐ€ ์–ด๋ฆฌ์„๊ฒŒ ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐํ•œ ํฌ๋กฌ ์ˆ˜์ •์ด ์‹คํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฑธํ–ˆ๋‹ค :

  if(window.chrome) {// Fix for Chrome
    var transform=$(".gm-style>div:first>div").css("transform");
    var comp=transform.split(","); //split up the transform matrix
    var mapleft=parseFloat(comp[4]); //get left value
    var maptop=parseFloat(comp[5]);  //get top value
    $(".gm-style>div:first>div").css({ //get the map container. not sure if stable
      "transform":"none",
      "left":mapleft,
      "top":maptop,
    });
  }

  html2canvas([$("#map > div.g-map-canvas > div > div > div:nth-child(1)")[0]], {
    logging: false,
    useCORS: true,
    onrendered: function (canvas) {
      $('#screenshot').after(canvas);

      if(window.chrome) {// Fix for Chrome
        $(".gm-style>div:first>div").css({
          left:0,
          top:0,
          "transform":transform
        });
      }
    }
  });

html2canvas์˜ ๋งค์šฐ ๊ธด ์„ ํƒ๊ธฐ๋Š” ๋ฒ„ํŠผ๊ณผ ์˜ต์…˜์ด ์—†๋Š” ๋งต์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ง€๊ธˆ ์ผํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@GCorbel ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜๊ณผ ๋งค์šฐ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ง€๋„๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒ๋‹จ ์ปจํŠธ๋กค์ด ์—†๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ์œ„์น˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์•„์ด๋””์–ด?

์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ v1.0.0 ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด jsfiddle์— ๋Œ€ํ•œ ์˜ˆ๋ฅผ

์ด ํ˜ธ๋Š” ์›์ €์ž์˜ ์ถ”๊ฐ€ ์ •๋ณด ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ฌธ์ œ์— ์žˆ๋Š” ์ •๋ณด๋งŒ์œผ๋กœ๋Š” ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋” ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•„์š”ํ•œ ๋‹ต๋ณ€์ด ์žˆ๊ฑฐ๋‚˜ ์ฐพ์œผ๋ฉด ์—ฐ๋ฝํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

@niklasvh ์—ฌ์ „ํžˆ ์ตœ์‹  ๋ฒ„์ „์˜ ๋ฌธ์ œ์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ด ๋ฌธ์ œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋™์•ˆ ๋งŒ๋“  ๋ฐ”์ด์˜ฌ๋ฆฐ์ž…๋‹ˆ๋‹ค. http://jsfiddle.net/9agom947/4/

๋ฐ”์ด์˜ฌ๋ฆฐ์€ ์—ฐ๊ฒฐ๋œ stackoverflow ์งˆ๋ฌธ์— ์„ค๋ช…๋œ ๋Œ€๋กœ ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ์ด ์Šค๋ ˆ๋“œ์˜ OP์— ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ง€๋„๋ฅผ ํŒจ๋‹ํ•˜์ง€ ์•Š์œผ๋ฉด ์ง€๋„๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Chrome์—์„œ๋Š” ์ง€๋„๋ฅผ ์ด๋™ํ•˜์ง€๋งŒ FireFox์—์„œ๋Š” ์ด๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ณต์‚ฌ๋œ ์ง€๋„๊ฐ€ ์ฒ˜์Œ์— ๋กœ๋“œ๋œ ์˜์—ญ ์™ธ๋ถ€์—์„œ ๋น„์–ด ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

image

์ด ์Šค๋ ˆ๋“œ์— ์ œ๊ณต๋œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@Ananda-Pryana jsFiddle์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ˆ˜์ • ์‚ฌํ•ญ์ด ๋” ์ด์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ตœ๊ทผ ์ถœ์‹œ๋œ ์ตœ์‹  ๋ฒ„์ „์˜ Google ์ง€๋„(v3.32)์— ์ƒˆ๋กœ์šด ์‹คํ—˜์  ๋ Œ๋”๋Ÿฌ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://developers.google.com/maps/documentation/javascript/releases

์ด๋กœ ์ธํ•ด ์ˆ˜์ • ์‚ฌํ•ญ์ด ์†์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ง€ ๋น ๋ฅธ ํ…Œ์ŠคํŠธ๋ฅผ ํ–ˆ์„ ๋ฟ์ด์ง€๋งŒ, ์ด์ œ๋Š” ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €(Chrome๋ฟ๋งŒ ์•„๋‹ˆ๋ผ)์—์„œ ๋™๋“ฑํ•˜๊ฒŒ ๋ง๊ฐ€์ง„ ๊ฒƒ ๊ฐ™์œผ๋‹ˆ, html2canvas์˜ ๋‹ค์Œ ๋ฒ„์ „์—์„œ ๋” ์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋น ๋ฅธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์—ฌ์ „ํžˆ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ์ด์ „ ๋ฒ„์ „์˜ gmap์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Ananda-Pryana ์˜ˆ, gmap์„ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@Ananda-Pryana ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ง€๋‚œ ์ฃผ์— ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ ์ƒˆ ํ”Œ๋žซํผ์œผ๋กœ ์˜ฎ๊ฒผ๊ณ  ๊ทธ ์›€์ง์ž„์ด ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์ด ๋ฒ”์ธ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์™„์ „ํžˆ ์ฅ๊ตฌ๋ฉ์— ๋น ์ ธ๋“ค๊ณ  ์žˆ์—ˆ๋‹ค. ๋‚˜๋Š” 3.30์œผ๋กœ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œํ–ˆ๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ž˜๋ฉ๋‹ˆ๋‹ค.

Google ์ง€๋„์˜ ์ƒˆ ๋ฒ„์ „์—์„œ๋Š” ๋ณ€ํ™˜์ด ๋‹ค๋ฅธ div์— ์ ์šฉ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. @GCorbel ์˜ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ด ์„ ํƒ๊ธฐ์™€ ํ•จ๊ป˜ (".gm-style>div:first>div:first>div:last>div") ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„์ง ์™„์ „ํžˆ ํ…Œ์ŠคํŠธํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ.

@rSensation ํŒ์€ ์ตœ์‹  ๋ฒ„์ „์—์„œ ๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

ํ  ์ด ๋ฌธ์ œ๊ฐ€ ์ €์—๊ฒŒ ๋Œ์•„์˜จ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ๋ณด๋ ค๋ฉด ์ง€๋„๋ฅผ ์ด๋™ํ•ด์•ผ ํ•˜๊ณ  Html2Canvas๋ฅผ ์ด๋™ํ•˜์—ฌ ํ™”๋ฉด์„ ๊ฐ€์ ธ์˜ค๋ฉด ์ผ๋ถ€ ์˜์—ญ์ด ๋นˆ ํšŒ์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๊นŒ?

์˜ค๋ฒ„๋ ˆ์ด ๋ ˆ์ด์–ด๊ฐ€ ์ž˜๋ ค์ง€๋Š” ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ๊ณ„์‹œ๋Š” ๋ถ„๋“ค์—๊ฒŒ --
@GCorbel ์˜ ์„ ํƒ๊ธฐ๋Š” Google ์ง€๋„ ๋ ˆ์ด์–ด๋งŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์˜ค๋ฒ„๋ ˆ์ด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์˜ค๋ฒ„๋ ˆ์ด๊ฐ€ ์žˆ๋Š” div๋ฅผ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: $('.gm-style>div:first>div:first>div:first>div:first>div') ๋Š” ๋‚ด ์˜ค๋ฒ„๋ ˆ์ด div ์ค‘ ํ•˜๋‚˜์˜€์œผ๋ฉฐ ๋™์ผํ•œ ๋ณ€ํ™˜์„ CSS์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

@mylesboone ์˜ค๋ฒ„๋ ˆ์ด ๋ ˆ์ด์–ด๊ฐ€ ์–ด๋–ค div๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ํ˜„์žฌ ์˜ค๋ฒ„๋ ˆ์ด ๋ ˆ์ด์–ด๊ฐ€ ์ž˜๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋กœ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์˜ค๋ฒ„๋ ˆ์ด ๋ ˆ์ด์–ด๋กœ GmapMarker์™€ GmapPolyline์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@sunghunOW
์†”๋ฃจ์…˜์€ https://github.com/niklasvh/html2canvas/issues/1568 ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ธŒ๋ผ์šฐ์ €์˜ ๊ฒ€์‚ฌ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€ํ™˜์ด ํ•„์š”ํ•œ div๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฐพ์€ ์ตœ๊ณ ์˜ ์†”๋ฃจ์…˜:

    html2canvas($('.gm-style>div:eq(0)')[0],{
        useCORS: true,
        allowTaint: true,
        async:false,
    }).then(canvas => {document.body.appendChild(canvas)});
    html2canvas($('.gm-style>div:eq(0)')[0],{
        useCORS: true,
        allowTaint: true,
        async:false,
    }).then(canvas => {document.body.appendChild(canvas)});

์บ”๋ฒ„์Šค๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ•ญ๋ชฉ ์„ ํƒ๊ธฐ๊ฐ€ ์ƒ์ž ๋ฐ–์œผ๋กœ ๋‚˜์™€์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@hseeda ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‹น์‹ ์˜ ์„ ํƒ์ž๊ฐ€ ๋‚˜๋ฅผ ์œ„ํ•ด ์†์ž„์ˆ˜๋ฅผ ์“ฐ๊ณ  ์žˆ์—ˆ๋‹ค!

๋‹ค์Œ์€ ์ž‘๋™ํ•˜๋Š” ์•ฝ๊ฐ„ ์ˆ˜์ •๋œ ์„ ํƒ๊ธฐ์ž…๋‹ˆ๋‹ค(์ ์–ด๋„ ์ €์—๊ฒŒ๋Š” ํ•˜ํ•˜).

const div = document.querySelector('#map > div:first-of-type')

html2canvas(div, {})

๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ์ด์šฉ์•ฝ๊ด€์„ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด ํ•ญ์ƒ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๋Š” Google ๋กœ๊ณ ๊ฐ€ ์ž˜๋ฆฝ๋‹ˆ๋‹ค.(

๊ธ€์Ž„, ๋‚œ ๊ทธ๋ƒฅ ๋…ธ๋“œ ๋˜๋Š” ๋ญ”๊ฐ€๋ฅผ ๋ณต์ œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋žœ๋งŒ์— ์ด ๋งต๊ณผ ์‹ธ์šฐ๋„ค์š” :D

์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

$('#snapshot').on('click',function () {
    html2canvas(document.querySelector('.gm-style'), 
           {useCORS:true, allowTaint: true,async:false} ).then(canvas => {
            document.body.appendChild(canvas)
    });
});

๋นˆ ์ง€๋„ ๋˜๋Š” ์บ”๋ฒ„์Šค ์ƒ์„ฑ ์˜ค๋ฅ˜ ๋ฌธ์ œ๋Š” ๊นŒ๋‹ค๋กœ์› ์ง€๋งŒ ๊ฒฐ๊ตญ ์ด ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ €๋ฅผ ์œ„ํ•ด ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ignoreElements: (node) => {
        return node.nodeName === 'IFRAME';
      }
html2canvas(mapWrapper, {
      useCORS: true,
      allowTaint: false,
      ignoreElements: (node) => {
        return node.nodeName === 'IFRAME';
      }
    }).then(canvas => {
      const url = canvas.toDataURL('image/png');
      saveAs(url, 'image3.png');
      window.URL.revokeObjectURL(url);
    });

@imlinus ์™€ @hseeda ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์ด ์„ ํƒ๊ธฐ๋Š” ๋‚˜๋ฅผ ์œ„ํ•ด ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! Google ๋กœ๊ณ ๋„ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@hseeda ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‹น์‹ ์˜ ์„ ํƒ์ž๊ฐ€ ๋‚˜๋ฅผ ์œ„ํ•ด ์†์ž„์ˆ˜๋ฅผ ์“ฐ๊ณ  ์žˆ์—ˆ๋‹ค!

๋‹ค์Œ์€ ์ž‘๋™ํ•˜๋Š” ์•ฝ๊ฐ„ ์ˆ˜์ •๋œ ์„ ํƒ๊ธฐ์ž…๋‹ˆ๋‹ค(์ ์–ด๋„ ์ €์—๊ฒŒ๋Š” ํ•˜ํ•˜).

const div = document.querySelector('#map > div:first-of-type')

html2canvas(div, {})

๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ์ด์šฉ์•ฝ๊ด€์„ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด ํ•ญ์ƒ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๋Š” Google ๋กœ๊ณ ๊ฐ€ ์ž˜๋ฆฝ๋‹ˆ๋‹ค.(

๊ธ€์Ž„, ๋‚œ ๊ทธ๋ƒฅ ๋…ธ๋“œ ๋˜๋Š” ๋ญ”๊ฐ€๋ฅผ ๋ณต์ œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋žœ๋งŒ์— ์ด ๋งต๊ณผ ์‹ธ์šฐ๋„ค์š” :D

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰