Вам нужно подождать, пока ваше изображение загрузится, прежде чем вы сможете нарисовать его на холсте.
Для этого просто используйте обработчик события load
вашего элемента :
// 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);
use constant
на самом деле делает постоянные подпрограммы.
, Чтобы сделать, что Вы хотите, необходимо явно назвать sub:
use constant X => 1;
my %x = ( &X => 'X');
или
use constant X => 1;
my %x = ( X() => 'X');
Другая опция не состоит в том, чтобы использовать использование постоянная прагма и зеркальное отражение к Только для чтения согласно рекомендациям в Лучших практиках Perl Damian Conway.
я переключился некоторое время назад после понимания, что постоянный ref's хеша является просто постоянной ссылкой на хеш, но ничего не делает о данных в хеше.
синтаксис только для чтения создает "нормально выглядящие" переменные, но на самом деле осуществит постоянность или только для чтения. Можно использовать его точно так же, как Вы были бы любая другая переменная как ключ.
use Readonly;
Readonly my $CONSTANT => 'Some value';
$hash{$CONSTANT} = 1;
Ваша проблема состоит в том, что => волшебная запятая, которая автоматически заключает слово в кавычки перед ним. Таким образом, то, что Вы записали, эквивалентно ('X', 'X').
самый простой путь состоит в том, чтобы просто использовать запятую:
my %x = (X, 'X');
Или, можно добавить различную пунктуацию так, чтобы у Вас больше не было простого слова перед =>:
my %x = ( X() => 'X' );
my %x = ( &X => 'X' );
Используйте $hash{CONSTANT()}
или $hash{+CONSTANT}
, чтобы препятствовать тому, чтобы bareword заключил механизм в кавычки умереть.
Большинство других людей ответило на Ваш вопрос хорошо. Взятый вместе, они создают очень полное объяснение проблемы и рекомендуемые обходные решения. Проблема - то, что прагма Perl "использует постоянный", действительно создает подпрограмму в Вашем текущем пакете, имя которого является первым аргументом прагмы и чье значение является последним.
В Perl, когда-то подпрограмма объявляется, это можно назвать без parens.
Понимание, что "константы" являются просто подпрограммами, Вы видите, почему они не интерполированы в строках и почему "толстая запятая" оператор "=>", который заключает левый аргумент в кавычки, думает, что Вы вручили ему строку (попробуйте другие встроенные функции как время () и ключи () когда-то с толстой запятой для дополнительной забавы).
К счастью, можно вызвать постоянную использующую явную пунктуацию как parens или символ амперсанда.
Однако у меня есть вопрос для Вас: почему Вы используете константы для ключей хеша вообще?
я могу думать о нескольких сценариях, которые могли бы привести Вас в этом направлении:
Вы хотите управление, по которому ключи могут быть в хеше.
Вы хотите абстрагировать название ключей в случае, если они изменяются позже
В случае номера 1, константы, вероятно, не сохранят Ваш хеш. Вместо этого рассмотрите создание Класса, который имеет общедоступные методы set и методы считывания, которые заполняют хеш, видимый только к объекту. Это очень неPerl как решение, но очень легко сделать.
В случае номера 2, я все еще защитил бы сильно для Класса. Если доступ к хешу отрегулирован через четко определенный интерфейс, только реализатор класса ответственен за разбирание в именах ключа хеша. В этом случае я не предложил бы использовать константы вообще.
Hope это помогает и спасибо за внимание.
use constant
прагма создает подпрограмму, смоделированную для взятия аргументов. В то время как это взгляды как постоянный C-стиль, это - действительно подпрограмма, которая возвращает постоянное значение.
=>
(толстая запятая) автоматически заключает оставленный операнд в кавычки, если это - bareword, как делает $hash {ключ} нотация.
, Если Ваше использование постоянного имени похоже на bareword, механизмы заключения в кавычки умрут, и Вы получите его имя как ключ вместо его значения. Для предотвращения этого измените использование так, чтобы это не был bareword. Например:
use constant X => 1;
%hash = (X() => 1);
%hash = (+X => 1);
$hash{X()} = 1;
$hash{+X} = 1;
В инициализаторах, Вы могли также использовать простую запятую вместо этого:
%hash = (X, 1);
Один путь состоит в том, чтобы инкапсулировать X как (X):
my %x ( (X) => 1 );
Другая опция состоит в том, чтобы покончить '=>' и использование'', вместо этого:
my %x ( X, 1 );
=> оператор интерпретирует свою левую сторону как "строку", способ, которым делает QW ().
Попытка с помощью
my %x = ( X, 'X');
Прокомментируйте @shelfoo (репутация не достаточно высоко для добавления комментария непосредственно там все же!)
Полностью согласовывают о Лучших практиках Perl Damian Conway... его наиболее рекомендуемое чтение.
Однако читайте Комментарий Рекомендации Модуля PBP, который является полезными "опечатками", если Вы планируете использовать PBP для внутреннего руководства по стилю.