zoukankan      html  css  js  c++  java
  • 前端地图截屏方案

    截屏一直以来,就是客户端的专利,对于浏览器端可谓无能为力。

    不过,自从canvas出来以后,就不一样了。

    HTML5中canvas的方法,toDataURL() 可将canvas的内容保存为图片。

    简单保存canvas图片的代码如下:

    function convertCanvasToImage(canvas) {
        var image = new Image();
        image.src = canvas.toDataURL("image/png");
        return image;
    }
    

    对于普通canvas截图没有问题,甚至对于整个DOM树也可以先转换成canvas,然后转换成截图。业界有成熟的类似的类库 html2canvas

    问题

    工作中,需要对地图截图,遇到不少问题,折腾了很久,在此记录。

    原图:

    canvas_a

    最后的截图代码:

    JS Bin on jsbin.com

    问题一 跨域

    截图失败,浏览器提示:Uncaught SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.

    为什么会出现跨域问题呢?仔细一想,地图上有一些图片,存储在地图服务商的服务器,当我们toDataURL的时候取不到图片数据,跨域也就能够想通了。

    解决方式,暂时不获取跨域图片,直接try catch掉。暂时能够截图,看到的效果:

    canvas_b

    问题二 圆角模糊

    如上图中,圆形中间多了一个叉,暂时不知道原因,解决方式是在截图前去除圆角。

    canvas_c

    问题三 图片不显示

    其实是问题一留下的问题,截图左下角,有个高德的图片没有显示,问题一解决方式是绕过,但问题还是要解决。

    在服务器端,是不存在跨域。所以,问题三的解决方式,我们可以在本地起一个代理服务器,代理通过获取图片,然后设置setHeader('Access-Control-Allow-Headers', '*’); 然后给本地浏览器使用。

    代理服务器代码:

    JS Bin on jsbin.com

    通过服务器跨域,然后允许所有访问图片,就可以跨域了。

    问题四 地理名称不显示

    通过上图可以看到,地图截图所有的地理位置名称都没有。打开log后可以看到,问题还是出在跨域上。地图所有的地理位置名称也是通过图片实现,图片存在地图服务商的服务器上,通过canvas渲染,和问题三的单纯的图片不太一样。

    要解决这个问题,必须地图服务器设置Header为”Access-Control-Allow-Headers: *”。通过公司关系,和高德产品经理、开发联系过,对方回答没办法设置这个,处于安全考虑。于是,这个问题无解。

    最后效果:

    canvas_e

    原创文章,欢迎转载。转载请注明:转载自Fs21 ' s Home,谢谢!
    原文链接地址:前端地图截屏方案

  • 相关阅读:
    产品小细节中的大体验
    产品经理的四点思考:不该简单满足用户需求
    产品经理的十大顶级错误
    SQL Server数据库大型应用解决方案总结
    java中public static void main(String[] args)中String[] args代表什么意思?
    异常处理1
    java中的String
    华为2013年西安java机试题目:如何过滤掉数组中的非法字符。
    2用java代码实现冒泡排序算法(转载)
    1用java实现冒泡排序算法以及解决的几个小问题。
  • 原文地址:https://www.cnblogs.com/freestyle21/p/5116738.html
Copyright © 2011-2022 走看看