Fabricjs: лист спрайтов для горизонтальной непрерывной миниатюры видео на холсте

У меня есть несколько листов спрайтов, по одному на каждую минуту видео. Например, если видео длится 3 минуты, у меня есть sprite.0.jpg, sprite.1.jpg, sprite.2.jpg, что означает 3 листа спрайтов, каждый из которых имеет 60 изображений за 1 секунду.

Это означает, что лист спрайтов с 10 столбцами и 6 строками имеет размер одного изображения 142x80, тогда как общий лист спрайтов имеет размер 1420x480 (см. ниже).

Я хочу создать компонент для предварительного просмотра непрерывной миниатюры видео на холсте. (см. ниже)

Как преобразовать листы Sprite в горизонтальную непрерывную миниатюру видео на холсте Fabricjs?

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

// Get the canvas and canvas context
var canvas = document.getElementById("timeline");
var ctx = canvas.getContext("2d");

// Create an image object
var image = new Image();
image.src = "path/to/spritesheet.jpg";

// Wait for the image to load
image.onload = function() {
    // Set the canvas size
    canvas.width = 1420;
    canvas.height = 480;

    // Draw the first frame of the sprite sheet
    ctx.drawImage(image, 0, 0, 1420, 480, 0, 0, canvas.width, canvas.height);
};

Вам нужно будет создать элемент холста шириной 8880 и высотой 480. Внутри div того же размера и абсолютного позиционирования на странице.

mrall 11.02.2023 17:01

@mrall как насчет того, когда я хочу просмотреть превью часового видео? Это кажется неправильным, так как, я думаю, существует ограничение на ширину холста.

Yogesh Yadav 12.02.2023 12:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
2
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Чтобы сделать то, что вы просите, нам нужен цикл на образце листа спрайтов, который вы предоставляете, есть 6 строк, поэтому мы зацикливаем его и рисуем строки в одну.

Вы используете drawImage со всеми параметрами, я предполагаю, что у вас есть ясные основы, если вы не видите больше об этом в документации:
https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage#параметры

Вот рабочий образец:

var canvas = document.getElementById("timeline");
var ctx = canvas.getContext("2d");

var image = new Image();
image.src = "https://i.stack.imgur.com/gOk5s.jpg";
image.onload = function() {
  for (let i = 0; i < 6; i++)
    ctx.drawImage(
      image,
      0, 80 * i, 1420, 80,
      710 * i, 0, 710, 40
    );
};
canvas {
  border: dashed 5px red
}
<canvas id = "timeline" width=4260 height=40></canvas>

Я вижу в ваших комментариях, что вы добавили:

... как насчет того, когда я хочу посмотреть предварительный просмотр видео продолжительностью 1 час? Это кажется неправильным, так как, я думаю, существует ограничение на ширину холста.

Да, есть ограничение и для каждого браузера:
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas#maximum_canvas_size

Но это гораздо более сложный вопрос, который заслуживает отдельного вопроса...

  • одним из вариантов может быть объединение плиток спрайтов, вместо того, чтобы показывать миниатюры каждую 1 секунду, показывать каждые 5 или 10, чтобы лучше разместить большие видео.
  • другой вариант может заключаться в использовании нескольких холстов

Спасибо за подробное объяснение. Это полезно в решении моей проблемы. Да, вы правы, для размещения больших видео стоит отдельный вопрос. Для коротких видеороликов выше решение полезно.

Yogesh Yadav 16.02.2023 06:57

Другие вопросы по теме