Одной из наиболее забавных особенностей холста является возможность использовать изображения. Они могут использоваться для выполнения динамического фотопозиции или использования в качестве фона графиков и т. Д. В настоящее время это также единственный способ добавить в них текст (спецификация не содержит каких -либо функций для рисования текста). Внешние изображения могут использоваться в любом формате, поддерживаемом гекконом (например, PNG, GIF или JPEG FORMAT). Другие элементы холста на той же странице также могут использоваться в качестве источника.
Одна из интересных особенностей Canvas заключается в том, что он может вводить изображения, которые можно использовать для синтеза изображения или производства фона и т. Д. В настоящее время в изображения можно добавить только текст (стандартное описание не включает функцию текста рисования). Пока изображения, поддерживаемые гекконом (например, PNG, GIF, JPEG и т. Д.), Можно ввести в холст, а другие элементы холста также могут использоваться в качестве источника изображения.
Импорт изображений - это в основном процесс двухэтапного:
Представление изображения требует только двух простых шагов:
Давайте сначала посмотрим на первый шаг. В основном доступно четыре варианта:
Давайте сначала посмотрим на первый шаг, в основном есть четыре варианта:
Мы можем получить доступ ко всем изображениям на странице, используя либо метод документа.
Мы можем получить изображение на странице (если известен идентификатор элемента изображения) через коллекцию Document.Images, метод document.getElementsbytagname или метод Document.getElementByID.
Как и в случае с обычными изображениями, мы получаем доступ к другим элементам холста, используя либо метод Document.getElementsBytagName, либо метод Document.GetElementByID. Убедитесь, что вы что -то привлекли на холст источника, прежде чем использовать его в целевом холсте.
Подобно изображению на справочной странице, используйте Document.GetElementsBytagName или Document.GetElementByID для получения других элементов холста. Но то, что вы должны представить, это готовый холст.
Одним из наиболее практичных применений этого было бы использовать второй элемент холста в качестве миниатюрного представления о другом большем холсте.
Общее приложение - сделать миниатюры для другого большого холста.
<Другой вариант - создать новые объекты изображения в нашем скрипте. Основной сбой этого подхода заключается в том, что если мы не хотим, чтобы наш сценарий остановился в середине, потому что ему нужно ждать загрузки изображения, нам нужна какая -то форма предварительной загрузки изображения.
Кроме того, мы можем использовать сценарии для создания нового объекта изображения, но основной недостаток этого метода состоит в том, что если мы не хотим, чтобы сценарий сделал паузу, потому что мы ждем устройства изображения, нам все равно нужно прорваться через предварительную нагрузку.
В основном, чтобы создать новый объект изображения, мы делаем это:
Мы можем создавать изображения следующим простым способом:
var img = новое изображение (); // Создать новое изображение objectImg.src = 'myimage.png'; // Установить путь источника
Когда этот скрипт выполняется, изображение начинает загружать. Если загрузка не завершена, когда оператор DrawMage выполняется, сценарий останавливается до тех пор, пока изображение не будет завершено загружать. Если вы не хотите, чтобы это произошло, используйте обработчик событий Onload:
Когда сценарий выполняется, изображение начинает загружать. Если изображение не загружено при вызове DrawMage, сценарий будет ждать, пока он не будет загружен. Если вы не хотите этого, вы можете использовать событие Onload:
var img = новое изображение (); // Создать новое изображение objectimg.onload = function () {// Выполнить операторы DrawImage здесь} img.src = 'myimage.png'; // Установить путь источникаЕсли вы используете только одно внешнее изображение, это может быть хорошим подходом, но как только вам нужно отслеживать более одного, нам нужно прибегнуть к чему -то более хитрому. Это выходит за рамки этого учебника, чтобы посмотреть на тактику предварительной загрузки изображения, но вы можете проверить предварительную загрузку изображения JavaScript для полного решения.
Если вы используете только одну картину, этого достаточно. Но один раз требуется более одного изображения, требуется более сложный метод обработки, но стратегия предварительной загрузки изображения выходит за рамки этого урока. Если вы заинтересованы, вы можете обратиться к предварительному загрузку изображения JavaScript.
Другим возможным способом включения изображений является данные: URL. URL -адреса данных позволяют полностью определить изображение как строку символов Base64, непосредственно в вашем коде. Одним из преимуществ URL -адресов данных является то, что полученное изображение доступно немедленно без другой поездки туда и обратно на сервер. (Еще одно преимущество заключается в том, что тогда можно инкапсулировать в одном файле все ваши CSS, JavaScript, HTML и изображения, делая его более портативным в другие места.) Некоторые недостатки этого метода заключаются в том, что ваше изображение не квалифицировано, а для более крупных изображений кодированный URL может стать довольно длинным: ваше изображение не квалифицировано, а для более крупных изображений - это может стать довольно длинным: ваше изображение не квалифицировано, а для более крупных изображений может стать довольно долгим: ваше изображение не квалифицировано, а для более крупных изображений может стать довольно долгим: ваше изображение не квалифицировано, а для более крупных изображений.
Мы также можем ссылаться на изображения с помощью метода данных: URL. URL-адреса данных позволяет определить изображение в строке строк BASE64, кодируемых. Преимущество заключается в том, что содержание изображения доступно сразу без необходимости снова обойти сервер. (И еще одно преимущество заключается в том, что он может инкапсулировать CSS, JavaScript, HTML и изображения вместе, что очень удобно для миграции.) Недостаток заключается в том, что изображения не могут быть кэшированы. Если изображения большие, встроенные данные URL -адреса будут довольно длинными:
var Img_src = 'Данные: Image/GIF; BASE64, R0LGODLHCWALAAAAAAAAAAAAAAAAAAAUHAHHA+HKCUO4LMNVINDO7QURIXIGBYAOW ==';
Как только у нас появится ссылка на наш объект исходного изображения, мы сможем использовать метод DrawImage, чтобы представить его на холсте. Как мы увидим позже, метод Drawimage перегружен и имеет три разных варианта. В его самой основной форме это выглядит так.
Как только объект исходного графика будет получен, мы можем перевести его в холст, используя метод DrawMage. Существует три формы метода рисования, и следующая является наиболее основной.
DrawMage (Image, x, y)где изображение является ссылкой на наш изображение или холст. x и y образуют координату на холсте, где следует размещать наше изображение.
где изображение является изображением или объектом холста, а x и y - их стартовые координаты в холсте.
В следующем примере я буду использовать внешнее изображение в качестве фона небольшого линейного графика. Использование фонов может сделать ваш скрипт значительно меньше, потому что нам не нужно рисовать сложный фон. Я использую только одно изображение здесь, поэтому я использую обработчик событий Onload объекта изображения для выполнения операторов чертежа. Метод рисования помещает фон на координату (0,0), который является верхним левым углом холста.
В следующем примере я использую внешнее изображение в качестве фона линейного изображения. Нам не нужно рисовать ответственный фон с фоновым изображением и сохранять много кода. Здесь используется только один объект изображения, поэтому действие рисования запускается в функции ответа на событие Onload. Метод рисования помещает фоновое изображение в верхнем левом углу (0,0) холста.
functionDraw () {
function draw () {var ctx = document.getElementByid ('canvas'). getContext ('2d'); var img = новое изображение (); img.onload = function () {ctx.drawimage (img, 0,0); ctx.beginpath (); ctx.moveto (30,96); Ctx.LineTo (70,66); Ctx.LineTo (103,76); Ctx.LineTo (170,15); ctx.stroke (); } img.src = 'images/faintrop.png'; }Второй вариант метода DrawMage добавляет два новых параметра и позволяет нам размещать масштабированные изображения на холсте.
Другим вариантом метода рисования является добавление двух параметров для управления изображением к масштабированию в холсте.
DrawMage (изображение, x, y, ширина, высота)где ширина и высота - размер изображения на холсте.
В этом примере я собираюсь использовать изображение в качестве обоев и повторить его несколько раз на холсте. Это делается просто путем цикла и размещения масштабированных изображений в разных положениях. В коде ниже первого для петли через строки второй для цикла столбцов. Изображение масштабируется треть его исходного размера, который составляет 50x38 пикселей. Мы посмотрим, как это также могло быть достигнуто, создав пользовательский шаблон, позже в этом уроке.
В этом примере я бы использовал изображение для распространения на холсте повторяющимся образом, как фон. Он также очень просто реализовать, просто проберите увеличенные картинки. Смотрите код ниже. Первый слой для петли - повторять строки, а второй слой - повторять столбцы. Размер изображения масштабируется до одной трети исходного, 50x38 px. Этот метод может быть использован для хорошего эффекта фоновых шаблонов, как вы увидите в следующем учебном пособии.
Примечание . Изображения могут стать размытыми при масштабировании или зернистых, если они слишком сильно масштабируются. Масштабирование, вероятно, лучше всего не сделано, если у вас есть немного текста, который должен оставаться разборчивым.Примечание. Изображение может стать неясным или размытым из -за крупномасштабного масштабирования. Если на вашем изображении есть текст, лучше не масштабироваться, потому что после обработки это очень вероятно, что текст на изображении станет неузнаваемым.
functionDraw () {
function draw () {var ctx = document.getElementByid ('canvas'). getContext ('2d'); var img = новое изображение (); img.onload = function () {for (i = 0; i <4; i ++) {for (j = 0; j <3; j ++) {ctx.drawimage (img, j*50, i*38,50,38); }}} img.src = 'images/rother.jpg'; }Третий и последний вариант метода Drawimage имеет восемь новых параметров. Мы можем использовать этот метод, чтобы нарезать части исходного изображения и натянуть их на холст.
Третий и последний вариант метода Drawimage имеет 8 новых параметров для управления отображением срезов.
DrawMage (Image, SX, SY, Swidth, Sheuett, DX, DY, Dwidth, Dheight)Первое изображение параметра, как и в случае с другими вариантами, является либо ссылкой на объект изображения, либо ссылка на другой элемент холста. Для остальных восьми параметров лучше всего взглянуть на изображение справа. Первые четыре параметра определяют местоположение и размер среза на исходном изображении. Последние четыре параметра определяют положение и размер на холсте назначения.
Первый параметр такой же, как и другие, оба являются ссылками на то или иное изображение. Другие 8 параметров лучше всего упоминаются на диаграмму справа. Первые 4 определяют положение и размер среза источника изображения, а последние 4 определяют позицию отображения целевого отображения и размер среза.
Нарезка может быть полезным инструментом, когда вы хотите создавать композиции. Вы можете иметь все элементы в одном файле изображения и использовать этот метод для объединения полного рисунка. Например, если вы хотите создать диаграмму, у вас может быть изображение PNG, содержащее весь необходимый текст в одном файле, и в зависимости от ваших данных может изменить масштаб вашей диаграммы без особых трудностей. Другое преимущество заключается в том, что вам не нужно загружать каждое изображение индивидуально.
Нарезка является мощным инструментом для синтеза изображения. Предположим, есть изображение, содержащее все элементы, тогда вы можете использовать этот метод для синтеза полного изображения. Например, если вы хотите нарисовать диаграмму и иметь файл PNG со всем необходимым текстом на вашей руке, вы можете легко изменить окончательную отображаемую диаграмму в соответствии с фактическими потребностями данных. Другое преимущество этого метода заключается в том, что вам не нужно загружать каждое изображение отдельно.
В этом примере я собираюсь использовать тот же носорог, который мы видели выше, но теперь я собираюсь вырезать его голову и составить его в рамку с изображением. Изображение рамки изображения включает в себя демонстрационную тени, которая была сохранена в виде 24-битного изображения PNG. Поскольку 24-битные изображения PNG включают полный 8-битный альфа-канал, в отличие от GIF и 8-битных изображений PNG, я могу поместить его на любой фон и не придется беспокоиться о матовом цвете.
В этом примере я использовал изображение носорога, которое я использовал выше, но на этот раз я делал ломтиком крупным планом головки носорога, а затем синтезировал его в фоторамку. Рамка имеет теневой эффект и является изображением, сохраняемым в 24-битном формате PNG. Поскольку 24-битное изображение PNG поставляется с полным 8-битным альфа-каналом, в отличие от GIF и 8-битного PNG, я могу поместить его в качестве фона, не беспокоясь о основном цвете.
Я принял другой подход к загрузке изображений, чем пример выше. Я только что поместил изображения непосредственно в свой HTML -документ и использовал правило CSS, чтобы скрыть их от представления (Display: None). Я присвоил оба изображения атрибут идентификатора, чтобы упростить их выбрать. Сам сценарий очень прост. Сначала я нарисую нарезанное и масштабированное изображение на холсте (сначала оператор DrawImage), а затем поместил кадр сверху (второе оператор DrawMage).
Я загружаю изображение другим способом, чем тот, который я использовал выше, вставляю изображение прямо в HTML, а затем скрываю его через CSS (дисплей: нет). Я назначил идентификаторы для обоих изображений, которые удобны для последующего использования. Глядя на сценарий ниже, это довольно просто. Сначала нарежьте головку носорога (первое рисование) и положите ее на холст, а затем положите на него фотоморму (второе притяжение).
function draw () {var canvas = document.getElementbyid ('canvas'); var ctx = canvas.getContext ('2d'); // нарисовать Slice ctx.drawimage (document.getElementById ('Source'), 33,71,104,124,21,20,87,104); // рисовать кадр ctx.drawimage (document.getElementbyId ('frame'), 0,0);}В последнем примере этой главы я сделал небольшую художественную галерею. Галерея состоит из таблицы, содержащей несколько изображений. Когда страница загружена, для каждого изображения на странице вставлен элемент холста, и вокруг него нарисовано кадр.
В моем случае все изображения имеют фиксированную ширину и высоту, как и рама, которая нарисована вокруг него. Вы можете улучшить сценарий так, чтобы он использовал ширину и высоту изображения, чтобы рама идеально подходила вокруг него.
Приведенный ниже код должен быть самостоятельным. Мы пробираемся через массив изображений и соответствующим образом добавляем новые элементы холста. Вероятно, единственное, что нужно отметить, для тех, кто не так знаком с DOM, это использование метода INSERTBEFE. INSERTBEFOR - это метод родительского узла (ячейка таблицы) элемента (изображение), под которым мы хотим вставить наш новый узел (элемент холста).