Nano Hash - криптовалюты, майнинг, программирование

Загрузка изображений в HTML Canvas

У меня есть набор изображений svg и некоторые атрибуты, которые я хотел бы загрузить на холст HTML. Цель состоит в том, чтобы загрузить изображения заданного размера и с заданными координатами x, y. Вот мой пример объекта:

var ObjectInstances = {
objects:[
    {
    "ID": "1234",
    "Name": "Backhoe",
    "x": "0",
    "y": "0",
    "height": "150",
    "width": "350",
    "svg": "images/svgs/backhoe.svg"
    },
    {
    "ID": "5678",
    "Name": "Crane",
    "x": "350",
    "y": "150",
    "height": "200",
    "width": "200",
    "svg": "images/svgs/crane1.svg"
    }
] 
};

В идеале я бы перебирал объекты и использовал эти пары ключ:значение для рендеринга каждого изображения на холсте, но я постоянно сталкиваюсь с случаями, когда объекты появляются в разных размерах или в разных местах после перезагрузки. Из своего исследования я знаю, что мне нужно предварительно загрузить все изображения, чтобы нарисовать их на холсте. Я создал параллельные массивы, чтобы справиться с этим. Один массив для хранения предварительно загруженных изображений, другой массив для хранения координат и размеров каждого изображения. Затем я попытался нарисовать изображения, используя эти два массива. Вот мой код:

function loadImages(sources, callback) {
    var images = {};
    var loadedImages = 0;
    var numImages = 0;
    // get num of sources
    for(var src in sources) {
    numImages++;
    }
    for(var src in sources) {
    images[src] = new Image();
    images[src].onload = function() {
        if(++loadedImages >= numImages) {
        callback(images);
        }
    };
    images[src].src = sources[src];
    }
}

// Preload images into a source array
var sources = {};
$.each(ObjectInstances.objects, function(index, value) {
        sources[index]=this.svg;
})

loadImages(sources, function(images) {

$.each(ObjectInstances.objects, function (index, value) {
    var x=$(this)[0].x,
        y=$(this)[0].y,
        w=$(this)[0].width,
        h=$(this)[0].height;
    attach(images[index], x, y, w, h);

});

});


// Load Object Instances

function attach(img, x, y, w, h) {
    context.drawImage(img, x, y, w, h);
}

Может ли кто-нибудь подсказать мне, как лучше всего это сделать?

15.01.2014

Ответы:


1

Я бы не стал отделять элементы изображения от их метаобъекта. Я бы сделал что-то подобное, используя один массив:

var ObjectInstances = {
objects:[
    {
    "ID": "1234",
    "Name": "Backhoe",
    "x": "0",
    "y": "0",
    "height": "150",
    "width": "350",
    "svg": "images/svgs/backhoe.svg",
    image: null
    },
    {
    "ID": "5678",
    "Name": "Crane",
    "x": "350",
    "y": "150",
    "height": "200",
    "width": "200",
    "svg": "images/svgs/crane1.svg",
    image: null
    }
] 
};

Затем выполните итерацию по массиву, чтобы вызвать загрузку по его URL-адресу:

loadImage(ObjectInstances, myCallback);

function loadImages(obj, callback) {

    var i = 0,
        o,
        count = obj.objects.length;

    for(; o = obj.objects[i]; i++) {
        o.image = new Image(o.width, o.height);
        o.image.onload = loader;
        o.image.src = o.svg;
    }

    function loader() {
        count--;
        if (count === 0) callback({
            objectInstances: obj
        });
    }
}

Теперь, когда вы перебираете свой исходный массив, у вас будут действительные элементы изображения, непосредственно прикрепленные к самому объекту (если, конечно, не произошла ошибка, и в этом случае обратный вызов никогда не вызывается, поскольку код стоит здесь - добавьте обработчики событий onerror/onabort для обработки эта ситуация).

Обратите внимание, что я задаю ширину и высоту, используя необязательные аргументы Image, так как мы имеем дело с SVG (не обязательно, но может помочь в процессе растеризации). Это измерение считывается свойствами с теми же именами, в то время как исходное измерение считывается с использованием naturalWidth и naturalHeight.

Измените по мере необходимости. Надеюсь это поможет.

15.01.2014
  • Это было очень полезно. Я поместил версию в скрипт JS: jsfiddle.net/sPHjd с моей функцией drawToCanvas в обратном вызове. Кажется, он работает отлично - каждый раз. В моем более крупном решении я все еще получаю различные рендеринги, но, по крайней мере, я знаю, что это не вызвано этой частью кода. 16.01.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..