如何将图像(PNG)转换为2D数组(二进制图像)?

时间:2016-02-09 21:03:37

标签: javascript google-maps binary-data

我需要以下PNG图像的二维二进制表示:

enter image description here

任何人都可以提供方法或来源将上面的PNG图像转换为2D数组,其中1 = land,0 = water?

通过一些阅读,我找到了一种在使用在线Base64ImageEncoder将图像转换为 base64 后循环遍历图像中所有像素的方法。

使用以下fiddle我能够判断像素是 water 还是 land 然后更改像素颜色,因此输出为:< / p>

enter image description here

我觉得我非常接近得到我需要的东西。如何更改主 for-loop 而不是将数据保存在Matrix中?

JavaScript的:

$(document).ready(function() {
    $("#btnSubmit").click(function(){
        GetBinary();
    }); 
});

function GetBinary() {
    var canvas = document.createElement("canvas");
    canvas.width = imgElement.offsetWidth;
    canvas.height = imgElement.offsetHeight;

    var ctx = canvas.getContext("2d");
    ctx.drawImage(imgElement,0,0);

    var map = ctx.getImageData(0,0,canvas.width,canvas.height);
    var imdata = map.data;

    var r,g,b;
    for(var p = 0, len = imdata.length; p < len; p+=4) {
        r = imdata[p]
        g = imdata[p+1];
        b = imdata[p+2];

        if ((r >= 164 && r <= 255) && (g >= 191 && g <= 229) && (b >= 220 && b <= 255)) {

            // black  = water
             imdata[p] = 0;
             imdata[p+1] = 0;
             imdata[p+2] = 0;

        } else {

            // white = land
             imdata[p] = 255;
             imdata[p+1] = 255;
             imdata[p+2] = 255;                     
        }                   
    }
    ctx.putImageData(map,0,0);
    imgElement.src = canvas.toDataURL();
}               

请注意,我使用的是 base64 图片,因此我们不允许粘贴此处,因为它太长了。请改为my fiddle

HTML:     

<img id='myImage' src='base64 image data' />
<br />
<input id = "btnSubmit" type="button" value="Get Binary Image"/>

2 个答案:

答案 0 :(得分:1)

看起来图像数据返回单个rgba组件数组,您只需要将其分解为行。见http://jsfiddle.net/mendesjuan/wjn0dub7/1/

var currentInnerArray;
var zeroesAndOnes = [];
for(var p = 0, len = imdata.length; p < len; p+=4) {
    r = imdata[p]
    g = imdata[p+1];
    b = imdata[p+2];

    // Each line is the pixel width * 4, (rgba), start a newline
    if (p % imdata.width * 4 === 0) {
      currentInnerArray = [];
      zeroesAndOnes.push(currentInnerArray);
    }
    if ((r >= 164 && r <= 255) && (g >= 191 && g <= 229) && (b >= 220 && b <= 255)) {
      currentInnerArray.push(0);
      // black  = water
      imdata[p] = 0;
      imdata[p+1] = 0;
      imdata[p+2] = 0;

   } else {
     currentInnerArray.push(1);
     // white = land
     imdata[p] = 255;
     imdata[p+1] = 255;
     imdata[p+2] = 255;
     }                  
}
// zeroesAndOnes has your 2d array

答案 1 :(得分:1)

如果您想要将单个像素作为2D数组访问,那么这是相关部分

{{1}}