Canvas ctx.draw не работает, может быть, за элементом HTML? [Дубликат]

Согласно документации Python 2.7.2:

Объект hashable, если он имеет значение хэша, которое никогда не изменяется в течение его жизненного цикла (ему нужен метод hash ()), и может сравниваться с другими объектами (ему нужен метод eq () или cmp ()). Объекты Hashable, которые сравнивают одинаковые, должны иметь одно и то же значение хеша.

Hashability делает объект пригодным для использования в качестве словарного ключа и элемента набора, поскольку эти структуры данных используют внутреннее значение хеша.

Все неизменяемые встроенные объекты Python являются хешируемыми, в то время как не изменяемые контейнеры (например, списки или словари). Объекты, являющиеся экземплярами пользовательских классов, по умолчанию хешируются; все они сравниваются неравномерно, а их хэш-значение - их id ().

Кортеж неизменен в том смысле, что вы не можете добавлять, удалять или заменять его элементы, но сами элементы могут быть изменчивый. Значение хеша списка зависит от хэш-значений его элементов и поэтому изменяется при изменении элементов.

Использование хэшей списка идентификаторов для списка будет означать, что все списки будут отличаться по-разному, что было бы удивительно и неудобно.

3
задан 3 revs 6 November 2015 в 18:30
поделиться

1 ответ

Вам нужно подождать, пока ваше изображение загрузится, прежде чем вы сможете нарисовать его на холсте.

Для этого просто используйте обработчик события load вашего элемента <img>:

// create a new image
var img = new Image();
// declare a function to call once the image has loaded
img.onload = function(){
  var canvas = document.createElement('canvas');
  canvas.width = img.width;
  canvas.height = img.height;
  var context = canvas.getContext('2d');
  context.drawImage(img, 0,0);
  var dataURL = canvas.toDataURL();
  // now you can do something with the dataURL
  doSomething(dataURL);
}
// now set the image's src
img.src = "http://somerandomWebsite/picture.png";

Кроме того, для холста 'context.toDataURL() и context.getImageData для работайте правильно, вы должны получить свой ресурс изображения в соответствии с кросс-оригинальным способом , в противном случае холст «испорчен», что означает, что любой метод получения данных с пикселями будет заблокирован.

  • Если ваше изображение поступает с одного и того же сервера, нет проблем.
  • Если ваше изображение подано с внешнего сервера, убедитесь, что оно позволяет вашим в своих кросс-начальных заголовках и установить img.crossOrigin на "use-credentials".
  • Если сервер разрешает анонимные запросы, вы можете установить img.crossOrigin на "anonymous".

Nota Bene : Сервер CORS отправляется сервером, а атрибут cross-origin сообщает, что вы хотите использовать CORS для получения данных изображения, и вы не сможете обойти его, если сервер установлен неправильно. Кроме того, некоторые UserAgents (IE & amp; Safari) до сих пор не реализовали этот атрибут.

Edge Case : Если некоторые из ваших изображений находятся на вашем сервере, а некоторые из них соответствуют требованиям CORS один, тогда вы можете захотеть использовать обработчик события onerror, который должен срабатывать, если вы установите атрибут cross-origin на "anonymous" на сервере без CORS.

function corsError(){
  this.crossOrigin='';
  this.src='';
  this.removeEventListener('error', corsError, false);
} 
img.addEventListener('error', corsError, false);
4
ответ дан 3 revs, 2 users 98% 16 August 2018 в 12:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: