HTML5 Canvas ImageData действует странно - PullRequest
1 голос
/ 18 сентября 2010

Я не могу понять, почему это не работает. Я рисую изображение на холсте, использую getImageData, манипулирую пикселями и затем сохраняю этот массив пикселей для дальнейшего использования. Когда я буду готов нарисовать эти пиксели позже, я использую createImageData на другом холсте одинакового размера, задаю для свойства data результирующего объекта ImageData массив сохраненных пикселей и затем вызываю putImageData. Результат: сохраненные данные массива не назначены объекту ImageData. Ниже приведен код для тестовой страницы:

<!DOCTYPE html>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en-US' lang='en-US'>
<head>
 <meta http-equiv='content-type' content='text/html;charset=UTF-8' />
 <link rel="stylesheet" type="text/css" href="styles.css"  media="screen" />
 <script type='text/javascript' src='http://code.jquery.com/jquery-1.4.2.min.js'></script>
 <title>Audio Browser</title>
</head>
<body>

<script type='text/javascript'>
 $(document).ready(function()
 {
  var copy = document.createElement('canvas');
  var viewer = $('#viewer')[0];
  var output = $('#output')[0];
  var ctx = viewer.getContext('2d');
  var outputContext = output.getContext('2d');
  var img = $('#input')[0];
  var imageData;
  var songs = [];

  output.width = copy.width = img.width;
  output.height = copy.height = img.height;
  copy.getContext('2d').drawImage(img, 0, 0);

  viewer.width = 1500;
  viewer.height = 800;

  originalData = copy.getContext('2d').getImageData(0, 0, copy.width, copy.height);
  imageData = originalData.data;

  for(var i = 3; i < imageData.length; i+=4)
  {
   var row = Math.floor(i / copy.width / 4);

   imageData[i] *= 1-((copy.height - row)/copy.height*2);
  }

  songs.push({'fadeImg' : imageData});


  draw();

  function draw()
  {
   originalData = copy.getContext('2d').createImageData(copy.width, copy.height);

   originalData.data = songs[0].fadeImg;

   outputContext.putImageData(originalData, 0, 0);
  }
 });

</script>

<img id='input' src='albumArt/small.png' />
<canvas id='output'></canvas>
<br />
<canvas id='viewer'></canvas>
</body>
</html>

EDIT:

Я только что нашел что-то интересное, когда попробовал это в новой бета-версии IE9. В IE я получаю следующую ошибку: SCRIPT65535: Invalid set operation on read-only property on originalData.data = songs[0].fadeImg; Я проверял Firefox раньше, и в консоли ошибок нет ошибок. Может быть, Firefox просто молча терпит неудачу. Если это так, как я могу скопировать массив обратно без чрезвычайно расточительного цикла for?

1 Ответ

0 голосов
/ 08 января 2013

Я также столкнулся с этой проблемой недавно.

К сожалению, кажется, что прямое назначение данных невозможно, потому что это Uint8ClampedArray.

Согласно Kronos.com:

Он ведет себя идентично другим типизированным представлениям массива, за исключением того, что сеттеры и конструктор используют преобразование [WEBIDL], а не арифметику по модулю при преобразовании входящих числовых значений.

Так что петля - это путь ... Это должно сделать:

for (var i in songs[0].fadeImg){
   originalData.data[i] = songs[0].fadeImg[i];
}

Это очень неудобно, но это единственный путь, который я нашел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...