Javascript图像处理之将彩色图转换成灰度图

简介:

 最近看了Justany_WhiteSnowJavascript图像处理一文,写的非常好,于是就练练手,略做了一些封装

(function () {
    function imageToGray(iCanvas, url) {
        this.canvas = iCanvas;
        this.iCtx = this.canvas.getContext("2d");
        this.url = url;
    }

    imageToGray.prototype = {
        imread: function (_image) {
            var width = _image.width,
                height = _image.height;
            this.iResize(width, height);
            this.iCtx.drawImage(_image, 0, 0);
            var imageData = this.iCtx.getImageData(0, 0, width, height),
                tempMat = new Mat(height, width, imageData.data);
            imageData = null;
            this.iCtx.clearRect(0, 0, width, height);
            return tempMat;
        },
        iResize: function (_width, _height) {
            this.canvas.width = _width;
            this.canvas.height = _height;
        },
        RGBA2ImageData: function (_imgMat) {
            var width = _imgMat.col,
                height = _imgMat.row,
                imageData = this.iCtx.createImageData(width, height);
            imageData.data.set(_imgMat.data);
            return imageData;
        },
        render: function () {
            var img = new Image();
            var _this = this;
            img.onload = function () {
                var myMat = _this.imread(img);
                var newImage = cvtColor(myMat);
                var newIamgeData = _this.RGBA2ImageData(newImage);
                _this.iCtx.putImageData(newIamgeData, 0, 0);
            };
            img.src = this.url;
        }
    };

    function Mat(_row, _col, _data, _buffer){
        this.row = _row || 0;
        this.col = _col || 0;
        this.channel = 4;
        this.buffer = _buffer || new ArrayBuffer(_row * _col * 4);
        this.data = new Uint8ClampedArray(this.buffer);
        _data && this.data.set(_data);
        this.bytes = 1;
        this.type = "CV_RGBA";
    }

    function cvtColor(_src) {
        if (_src.type && _src.type === "CV_RGBA") {
            var row = _src.row,
                col = _src.col;
            var dst = new Mat(row, col);
            data = dst.data,
            data2 = _src.data;
            var pix1, pix2, pix = _src.row * _src.col * 4;
            while (pix) {
                data[pix -= 4] = data[pix1 = pix + 1] = data[pix2 = pix + 2] = (data2[pix] * 299 + data2[pix1] * 587 + data2[pix2] * 114) / 1000;
                data[pix + 3] = data2[pix + 3];
            }
        } else {
            return src;
        }
        return dst;
    }

    window.imageToGray = imageToGray;
})();

  调用方式如下:

var iCanvas = document.getElementById("grayImage");//canvas element
var imgToGray = new imageToGray(iCanvas, "images/1.jpg");
imgToGray.render();

  给一个完整的小例子吧:)

  本想给个在线运行地址的,但由于园子的图片存在另一个域名下,getImageData存在跨域安全问题,所以就给个下载地址吧(要放在本地的web service上运行哦,或直接丢在VS中运行也可以): 点此下载

  最后来张福利,哈哈!



本文转自Artwl博客园博客,原文链接:http://www.cnblogs.com/artwl/,如需转载请自行联系原作者

相关文章
|
5月前
|
数据采集 JavaScript 前端开发
Go和JavaScript结合使用:抓取网页中的图像链接
Go和JavaScript结合使用:抓取网页中的图像链接
|
1月前
|
Web App开发 存储 数据可视化
编程笔记 html5&css&js 029 HTML图像
编程笔记 html5&css&js 029 HTML图像
|
4月前
|
前端开发 JavaScript
使用 JavaScript 和 CSS 的简单图像放大镜
使用 JavaScript 和 CSS 的简单图像放大镜
56 0
|
5月前
|
JavaScript 前端开发 API
9个JavaScript图像处理库,收藏好留备用
9个JavaScript图像处理库,收藏好留备用
91 0
|
8月前
|
前端开发 JavaScript
前端js实现瀑布图代码
前端js实现瀑布图代码
95 0
|
9月前
|
JavaScript
Dom实操(第二十三课)JS轮番图的设计思路
Dom实操(第二十三课)JS轮番图的设计思路
88 0
|
Web App开发 数据采集 JavaScript
面试官:请用纯 JS 实现,将 HTML 网页转换为图像
在工作时,需要实现一个功能:把一个HTML网页的转换为图像。我想到的第一个想法是使用第三方库,但像dom-to-image或使用Chrome Headless,如Puppeteer。那如何使用纯Javascript解决这种需求呢?
238 0
|
JavaScript
js轮番图
js轮番图
63 0
|
算法 JavaScript
js 最小生成图的问题 普利姆算法
js 最小生成图的问题 普利姆算法
js 最小生成图的问题 普利姆算法