Можно использовать HTML-изображения, такие как холст с getImageData / putImageData? - PullRequest
11 голосов
/ 18 сентября 2009

Я хотел бы знать, существует ли способ динамического изменения / доступа к данным, содержащимся в html-изображениях, так же, как если бы они были элементом холста html5. С помощью canvas вы можете в javascript получить доступ к необработанным пиксельным данным с помощью getImageData () и putImageData (), но я до сих пор не смог понять, как это сделать с изображениями.

Ответы [ 7 ]

15 голосов
/ 30 ноября 2010
// 1) Create a canvas, either on the page or simply in code
var canvas = document.createElement('canvas');
var ctx    = canvas.getContext('2d');

// 2) Copy your image data into the canvas
var myImgElement = document.getElementById('foo');
ctx.drawImage( myImgElement, 0, 0 );

// 3) Read your image data
var w = myImgElement.width, h=myImgElement.height;
var imgdata = ctx.getImageData(0,0,w,h);
var rgba = imgdata.data;

// 4) Read or manipulate the rgba as you wish
for (var px=0,ct=w*h*4;px<ct;px+=4){
  var r = rgba[px  ];
  var g = rgba[px+1];
  var b = rgba[px+2];
  var a = rgba[px+3];
}

// 5) Update the context with newly-modified data
ctx.putImageData(imgdata,0,0);

// 6) Draw the image data elsewhere, if you wish
someOtherContext.drawImage( ctx.canvas, 0, 0 );

Обратите внимание, что шаг 2 также может быть введен из изображения, загруженного непосредственно в скрипт, а не на страницу:

// 2b) Load an image from which to get data
var img = new Image;
img.onload = function(){
  ctx.drawImage( img, 0, 0 );
  // ...and then steps 3 and on
};
img.src = "/images/foo.png"; // set this *after* onload
6 голосов
/ 18 сентября 2009

Вы можете нарисовать изображение в элемент холста с помощью drawImage () , а затем получить данные пикселей из холста.

3 голосов
/ 17 января 2013

После некоторых проблем с этим кодом, я хочу добавить одну или две вещи к ответу Phrogz:

// 1) Create a canvas, either on the page or simply in code
var w = myImgElement.width, h=myImgElement.height; // NEw : you need to set the canvas size if you don't want bug with images that makes more than 300*150

var canvas = document.createElement('canvas');
canvas.height = h;
canvas.width = w;
var ctx    = canvas.getContext('2d');

// 2) Copy your image data into the canvas
var myImgElement = document.getElementById('foo');
ctx.drawImage( myImgElement, 0, 0, w, h ); // Just in case...

// 3) Read your image data
var imgdata = ctx.getImageData(0,0,w,h);
var rgba = imgdata.data;

// And then continue as in the other code !
2 голосов
/ 09 июня 2013

, который работал для меня (IE10x64, Chromex64 на win7, Linux с Chromium Arm, ... похоже, ошибка с Firefox 20 Arm Linux, но не уверен ... для повторного тестирования)

- HTML -

<canvas id="myCanvas" width="600" height="300"></canvas>
<canvas id="myCanvasOffscreen" width="1" height="1"></canvas>

- JS -

  // width & height can be used to scale image !!!
  function getImageAsImageData(url, width, height, callack) {
    var canvas = document.getElementById('myCanvasOffscreen');
    canvas.width = width;
    canvas.height = height;
    var context = canvas.getContext('2d');

    var imageObj = new Image();
    imageObj.onload = function() {
      context.drawImage(imageObj, 0, 0, width, height);
      imgData = context.getImageData(0,0,width, height);
      canvas.width = 1;
      canvas.height = 1;

      callack( imgData );
    };
    imageObj.src = url;
  }

- затем -

  var canvas = document.getElementById('myCanvas');
  var ctx = canvas.getContext('2d');

  var imgData;
  getImageAsImageData('central_closed.png', IMG_WIDTH, IMG_HEIGHT, 
    function(imgData) {

      // do what you want with imgData.data (rgba array)
      // ex.  colorize( imgData, 25, 70, 0);

      ctx.putImageData(imgData,0,0);

    }
  );
1 голос
/ 16 апреля 2012

сначала вы хотите нарисовать картинку на холсте, а затем получить imageData с холста, это неправильный путь, потому что js считают это «междоменным доступом», но метод getIamgeData не позволяет "Междоменный доступ" к образу. Вы можете попробовать, поместив его в корневой каталог и получив к нему доступ "localhost".

0 голосов
/ 06 марта 2016

Работает непосредственно на элемент IMG также действует:

var image = document.createElement('img'),w,h ;

image.src = "img/test.jpg" ;

$(image).one('load',function(){

    w = image.naturalWidth ;
    h = image.naturalHeight ;

    var cnv = document.createElement('canvas') ;
    $(cnv).attr("width",w) ;
    $(cnv).attr("height",h) ;

    var ctx = cnv.getContext('2d') ;
    ctx.drawImage(image,0,0) ;

    var imgdata = ctx.getImageData(0,0,w,h) ;

    var rgba = imgdata.data ;
    for (var px=0,ct=w*h*4;px<ct;px+=4){
        var r = rgba[px+0] ;
        var g = rgba[px+1] ;
        var b = rgba[px+2] ;
        var a = rgba[px+3] ;
        // Do something
        rgba[px+0] = r ;
        rgba[px+1] = g ;
        rgba[px+2] = b ;
        rgba[px+3] = a ;
    }

    ctx.putImageData(imgdata,0,0) ;

    $("body").append(cnv) ;

}) ;
0 голосов
/ 18 сентября 2009

Я не уверен, если это возможно, но вы можете попробовать запросить информацию о пикселях из PHP, если библиотека GD это будет легкая задача, но, безусловно, будет медленнее. Поскольку вы не указали приложение, поэтому я предлагаю проверить SVG для этой задачи, если они могут быть векторными изображениями, чем вы сможете запросить или изменить изображение.

...