Библиотека Two.js ориентирована на работу с векторной графикой,
однако поддерживает и растровые изображения через объект
Two.Texture. Обрезка изображений напрямую в API не
представлена как отдельный высокоуровневый метод, но реализуется за счёт
управления текстурой, координатами отображения и масками.
Основная идея: отображается не всё изображение, а только его часть, задаваемая либо через свойства текстуры, либо через геометрические ограничения (маскирование).
Изображения подключаются через объект Two.Texture:
const texture = new Two.Texture('image.jpg');
Ключевые свойства:
image — сам источник изображенияloaded — флаг загрузкиrepeat — режим повторенияoffset — смещение текстурыscale — масштаб текстурыДля обрезки особенно важны:
offsetscaleОдин из базовых способов — изменение области отображения за счёт
комбинации offset и scale.
scale увеличивает или уменьшает изображениеoffset смещает видимую частьconst texture = new Two.Texture('image.jpg');
const rect = two.makeRectangle(200, 200, 300, 200);
rect.fill = texture;
// Увеличиваем изображение
texture.scale = new Two.Vector(2, 2);
// Смещаем "окно просмотра"
texture.offset = new Two.Vector(-100, -50);
Каждая фигура в Two.js выступает контейнером для текстуры. Это означает, что:
форма фигуры = область видимости изображения
const texture = new Two.Texture('image.jpg');
const rect = two.makeRectangle(250, 250, 200, 150);
rect.fill = texture;
Изображение будет автоматически “обрезано” границами прямоугольника.
Возможность использовать любую форму — одно из преимуществ Two.js.
const texture = new Two.Texture('image.jpg');
const circle = two.makeCircle(250, 250, 100);
circle.fill = texture;
Изображение будет отображаться только внутри круга.
Для более гибкой обрезки используется механизм масок.
maskconst texture = new Two.Texture('image.jpg');
const rect = two.makeRectangle(250, 250, 300, 200);
rect.fill = texture;
const mask = two.makeCircle(250, 250, 100);
rect.mask = mask;
Two.js позволяет изменять параметры в реальном времени.
two.bind('update', function(frameCount) {
texture.offset.x = Math.sin(frameCount * 0.05) * 100;
});
В результате:
Координатная система текстуры отличается от координат сцены.
offset задаётся относительно центраПри обрезке важно учитывать соотношение сторон:
texture.scale = new Two.Vector(1.5, 1);
Это приведёт к:
Для сохранения пропорций:
texture.scale = new Two.Vector(1.5, 1.5);
Для имитации классического crop:
offsetscaleconst texture = new Two.Texture('image.jpg');
const frame = two.makeRectangle(250, 250, 200, 200);
frame.fill = texture;
// Масштабируем изображение под рамку
texture.scale = new Two.Vector(1.2, 1.2);
// Центрируем нужную область
texture.offset = new Two.Vector(-50, 30);
Two.js не имеет встроенной системы спрайтов, но обрезку можно использовать для отображения кадров.
offset показывается нужный участокconst texture = new Two.Texture('sprites.png');
const sprite = two.makeRectangle(100, 100, 64, 64);
sprite.fill = texture;
let frame = 0;
two.bind('update', function() {
const frameWidth = 64;
texture.offset.x = -frame * frameWidth;
frame = (frame + 1) % 10;
});
нет прямого API crop(x, y, width, height)
обрезка реализуется косвенно через:
поведение может отличаться в зависимости от рендерера (SVG / Canvas / WebGL)
При работе с обрезкой важно учитывать производительность:
Texture, если это
возможноАватары
Галереи
Игры
UI-элементы
Наиболее гибкий результат достигается при объединении подходов:
Пример комплексного использования:
const texture = new Two.Texture('image.jpg');
const rect = two.makeRectangle(250, 250, 200, 200);
rect.fill = texture;
const mask = two.makeRoundedRectangle(250, 250, 180, 180, 20);
rect.mask = mask;
texture.scale = new Two.Vector(1.3, 1.3);
texture.offset = new Two.Vector(-30, 10);
Для точной настройки полезно временно:
stroke)rect.stroke = 'red';
rect.linewidth = 2;
Важно учитывать асинхронную загрузку:
texture.bind('load', function() {
// безопасная настройка обрезки
});
Без этого возможны:
Two.js напрямую поддерживает одну маску, но можно:
const group = two.makeGroup(rect);
group.mask = mask;
В SVG-рендерере возможно использование clipPath, который Two.js генерирует автоматически при маскировании.
| Рендерер | Особенности |
|---|---|
| Canvas | быстрее, но меньше контроля |
| SVG | точное маскирование |
| WebGL | высокая производительность |
offset (перепутаны оси)Обрезка в Two.js — это не отдельная операция, а комбинация:
Такой подход даёт гибкость и позволяет реализовать практически любой сценарий отображения изображений в рамках 2D-графики.