从图像中读取透明像素

时间:2011-07-25 13:03:42

标签: javascript transparency pixel

有没有办法使用javascript从图片中读取透明像素?

我认为,它可能类似于PNG为IE修复的内容(读取透明像素并应用一些东西,哈哈)。但是,是的,对于每个浏览器..

啊,如果没有HTML5可以实现它会很棒。

3 个答案:

答案 0 :(得分:6)

这个问题实际上是由GoogleTechTalks的老兄在这个关于基于javascript的游戏引擎的视频中回答的。 http://www.youtube.com/watch?feature=player_detailpage&v=_RRnyChxijA#t=1610s 它应该从解释它的那一刻开始。

修改 因此,我将总结视频中的内容并提供代码示例。 这比我想象的要困难得多。诀窍是将图像加载到画布上,然后检查每个像素是否透明。数据被放入二维数组中。像alphaData [pixelRow] [pixelCol]。 0代表透明度而1代表透明度。当alphaData数组完成时,它将被放入全局变量。

var a;
function alphaDataPNG(url, width, height) {

    var start = false;
    var context = null;
    var c = document.createElement("canvas");
    if(c.getContext) {
        context = c.getContext("2d");
        if(context.getImageData) {
            start = true;
        }
    }
    if(start) {
        var alphaData = [];
        var loadImage = new Image();
        loadImage.style.position = "absolute";
        loadImage.style.left = "-10000px";
        document.body.appendChild(loadImage);
        loadImage.onload = function() {
            c.width = width;
            c.height = height;
            c.style.width = width + "px";
            c.style.height = height + "px";
            context.drawImage(this, 0, 0, width, height);
            try {
                try {
                     var imgDat = context.getImageData(0, 0, width, height);
                } catch (e) {
                    netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
                    var imgDat = context.getImageData(0, 0, width, height);
                }                    
            } catch (e) {
                throw new Error("unable to access image data: " + e);
            }
            var imgData = imgDat.data;
            for(var i = 0, n = imgData.length; i < n; i += 4) {
                var row = Math.floor((i / 4) / width);
                var col = (i/4) - (row * width);
                if(!alphaData[row]) alphaData[row] = [];
                alphaData[row][col] = imgData[i+3] == 0 ? 0 : 1;
            }
            a=alphaData;
        };
        loadImage.src = url;
    } else {
        return false;
    }
}

我在Firefox中运行本地时出错,而try catch语句解决了它。哦,我得吃...

编辑2: 所以我吃完了晚餐,我想添加一些我用过的资料,并且可以提供帮助。

https://developer.mozilla.org/En/HTML/Canvas/Pixel_manipulation_with_canvas 有关imageData对象的信息。

http://blog.nihilogic.dk/2008/05/compression-using-canvas-and-png.html 有关imageData对象及其使用的更多信息。

http://www.nihilogic.dk/labs/canvascompress/pngdata.js 这是一个非常有用的使用imageData的例子,我提供的代码在很大程度上类似于这个代码。

http://www.youtube.com/watch?v=_RRnyChxijA 有关javascript脚本游戏引擎的信息,非常有趣。

http://blog.project-sierra.de/archives/1577 关于在firefox中使用enablePrivilege的信息。

答案 1 :(得分:5)

这是一个棘手的问题,因为直接从Javascript访问文件的唯一方法是使用FileReader,这是一个相对较新的功能,在大多数浏览器中尚不支持。

但是,您可以使用画布获得所需的结果。如果你有画布,你可以为它指定一些独特的颜色(例如绿色屏幕中使用的霓虹绿)。然后,您可以将图像插入到画布上,并使用提到的here方法获取每个像素。然后你可以检查每个像素的颜色,看看那个点是否与你的背景颜色相对应(它是透明的)还是有其他颜色(不透明)。

有点hackish,但是不要认为你可以用纯JS做任何事情。

答案 2 :(得分:2)

似乎GameJS可以做到这一点,而且更多。我正在引用this SO question来获取我的所有知识,因为我并没有声称对这个主题有任何实际的了解。

当然,这是HTML5,并使用canvas元素。