从getImageData()到node.js搭建本地服务器

场景

目前在看html5 canvas方面的知识,顺带敲一敲例子。学习到处理图片反色、蒙板的时候,需要用到getImageData()方法获取图片像素信息。而如果你的图片是来自本地,这个方法就会出现跨域问题。

浏览器报错

关于getImageData()

在MDN中(MDN/getImageData),我们可以看到,这个方法接收一个矩形区域起始点的坐标和宽高等4个参数,返回一个ImageData对象。这个对象中的data属性值是一个数组,每4项代表一个像素的rgba。
不过文档中并没有提到会产生跨域问题,那就来看看什么是跨域和同源策略。

同源策略

还是阅读MDN的文档同源策略,可以看到

同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的关键的安全机制。

也就是说,同源策略是浏览器为了保护当前源的文档不被其他源恶意读写而使用的一个安全机制。但是,又有新的问题了:什么是源?

如果协议,端口(如果指定了一个)和域名对于两个页面是相同的,则两个页面具有相同的源。

原来,源就是协议、端口和域名的组合。如果两个页面的三要素中有一个不相同,那么这两个页面就是不同源的。当然IE的策略中并没有将端口当作策略的三要素,所以http://www.example.com/index.htmlhttp://www.example.com:80/index.html在IE中属于同源。
所以,由于我们canvas的图片是保存在本地,浏览器认为与页面不同源,不能进行getImageData()操作。

解决方法

把图片放置在服务器中,通过服务器返回给客户端。

配置本地服务器

使用node.js配置本地服务器。

  1. 引入http、url、fs和past模块
var http = require('http');
var url = require('url');
var fs = require('fs');
var mine = require('./mine').types;
var path = require('path');

其中,mine.js是文件类型标识,即报文头部的content-type值。

exports.types = {
    "css": "text/css",
    "gif": "image/gif",
    "html": "text/html",
    "ico": "image/x-icon",
    "jpeg": "image/jpeg",
    "jpg": "image/jpeg",
    "js": "text/javascript",
    "json": "application/json",
    "pdf": "application/pdf",
    "png": "image/png",
    "svg": "image/svg+xml",
    "swf": "application/x-shockwave-flash",
    "tiff": "image/tiff",
    "txt": "text/plain",
    "wav": "audio/x-wav",
    "wma": "audio/x-ms-wma",
    "wmv": "video/x-ms-wmv",
    "xml": "text/xml"
  };
  1. 调用http.createServer()方法创建服务
  2. 获取url中的路径,并进行转码,防止其中包含中文字符无法解析
//获取路径名
  var pathname = url.parse(request.url).pathname;
  pathname = decodeURI(pathname);
  var realPath;
  1. 若路径为默认的host:port则跳转至默认路径
//设置默认路径
  if (pathname === '/') {
    realPath = path.join("asset/html/index.html", pathname);
  } else {
    realPath = path.join("asset", pathname);
  }
  1. 否则,获取目录中的文件后缀名,根据不同的后缀名返回不同的文件类型
//获取后缀名
  var ext = path.extname(realPath);
  ext = ext ? ext.slice(1) : 'unknown';
  fs.exists(realPath, function (exists) {
    //如果路径错误返回404
    if (!exists) {
      response.writeHead(404, {
        'Content-Type': 'text/plain'
      });

      response.write("This request URL " + pathname + " was not found on this server.");
      response.end();
    } else {
      fs.readFile(realPath, "binary", function (err, file) {
        if (err) {
          response.writeHead(500, {
            'Content-Type': 'text/plain'
          });
          response.end(err);
        } else {
          var contentType = mine[ext] || "text/plain";
          response.writeHead(200, {
            'Content-Type': contentType
          });
          response.write(file, "binary");
          response.end();
        }
      });
    }
  });
  1. 最后,监听端口。

文件目录

文件目录

server.js放在根目录下,网页文件放在asset目录中。

git地址

css-demo
一个用来实践练习css属性的demo。

总结

只是想要实现一个图片反色的功能,却需要了解跨域、同源策略、node.js搭建服务器等知识。感觉有时候不能把自己局限在前端开发者的角色中,应该开阔视野,上升到程序员的高度来要求自己,多学习,多掌握技能才能提高自己。这一次,跨域部分我没有深入的去学习,以后会补充一篇博客来探讨跨域和解决跨域的几种方法,再深入学习ajax的原理和实现。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容