1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/light-year-vue-picture-cut

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README-CN.md 32 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 14.03.2025 01:09 0c92640

vue-picture-cut 2.x

npm download license

English | Russian |

Инструмент для обработки изображений с возможностью вырезания, созданный на основе vue и typescript. Преимущества: нативный, легковесный, простой в использовании, полный набор функций, высокая гибкость расширения. Среди текущих функций: масштабирование, отражение, поворот, проверка границ, прямоугольное вырезание, произвольное (эллиптическое) вырезание. Масштабирование осуществляется при помощи мыши (колесо мыши) и прикосновением двух пальцев.

github страница проекта
страница проекта на Gitee
демонстрация (github)
демонстрация (Gitee)

версия 0.x (не рекомендовано) [этот вариант слишком баггожен и больше не поддерживается]

🚀 журнал обновлений

1. Как использовать

Установите плагин через npm

npm install vue-picture-cut

Используйте в vue

  1. Глобальное использование в main.js.
import Vue from 'vue';
import 'vue-picture-cut/lib/vue-picture-cut.css';
import VuePictureCut from 'vue-picture-cut';
```Vue.use(VuePictureCut);
  1. Либо локальное использование в .vue файле.
<template>
  <div>
    <input type="file" accept="image/*" @change="inputChange"/>
    <vue-picture-cut :src="src" @on-change="cutChange"/>
  </div>
</template>

<script>
  import { VuePictureCut } from 'vue-picture-cut';

  export default {
    // ...
    components: {
      VuePictureCut
    },
    data() {
      return {
        src: null,
        blob: null,
        base64: null
      };
    },
    methods: {
      inputChange(e) {
        const file = e.target.files[0];
        this.src = URL.createObjectURL(file);
      },
      /**
       * @param {Blob} blob      BLOB объект
       * @param {string} base64    base64 строка
       */
      cutChange({ blob, base64 }) {
        this.blob = blob;
        this.base64 = base64;
      }
    }
    // ...
  };
</script>
```<style>
  @import "~vue-picture-cut/lib/vue-picture-cut.css";
</style>
  1. Обратите внимание

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

2. API

Exposed Objects

При глобальном импорте

import VuePictureCut from 'vue-picture-cut';
Vue.use(VuePictureCut);

Здесь регистрируются компоненты: VuePictureCut, VuePictureCutMask, VuePictureCutMenu.

Отдельные импорты

import {
  VuePictureCut,
  VuePictureCutMask,
  VuePictureCutMenu,
  Bezier,
  createAnimation,
  Tool,
  createUtils
} from 'vue-picture-cut';

Компоненты: VuePictureCut, VuePictureCutMask, VuePictureCutMenu. Инструментальные классы: Bezier, createAnimation, Tool, createUtils.

1. Компонент VuePictureCut

Слоты: default, menu

Использование:

/demo/demo1.html
/demo/demo2.html```vue <vue-picture-cut ref="pictureCut" :src="src" :magnification="magnification" :init-angle="initAngle" :msk-option="mskOption" :max-pixel="maxPixel" :encoder-options="encoderOptions" :format="format" :rotate-control="rotateControl" :menu-position="menuPosition" :menu-thickness="menuThickness" :background-color="backgroundColor" @on-change="onChange" />


1.  `src`:  
    **Тип**: string  
    **По умолчанию**: null  
    **Описание**: ссылка на изображение  

2.  `magnification`:  
    **Тип**: number  
    **По умолчанию**: 1.5  
    **Описание**: коэффициент масштабирования при отрисовке канвы, значение должно быть больше 0; чем больше значение, тем выше логическое разрешение  

3.  `initAngle`:  
    **Тип**: number  
    **Обязательно**: нет  
    **Описание**: начальный угол поворота изображения при загрузке  

4.  `maxPixel`:  
    **Тип**: number  
    **Обязательно**: нет  
    **Описание**: максимальное количество пикселей по ширине или высоте экспортированного изображения; если не указано, то используется фактическое размер изображения.  

5.  `encoderOptions`:  
    **Тип**: number  
    **Обязательно**: нет  
    **Описание**: уровень сжатия экспортированного изображения; если не указано, то используется значение 0.8, диапазон значений от 0 до 1.  

6.  `format`:  
    **Тип**: string  
    **По умолчанию**: "image/jpeg"  
    **Описание**: формат экспорта изображения; если не указано, то используется формат "image/jpeg"; допустимые значения могут быть "image/png" и другие поддерживаемые браузерами форматы.  

7.  `mskOption`:  
    **Тип**: object  
    **По умолчанию**: `{ width: 1, height: 1, isRound: false, resize: true }`  
    **Описание**:  
    width: number - ширина пропорций области выреза  
    height: number - высота пропорций области выреза  
    isRound: boolean - прямоугольник true, эллипс false  
    resize: boolean - может ли область выреза меняться вручную  
    color: string - цвет маски    borderColor: string - цвет границ области выреза  
 8.  `rotateControl`:  
     **Тип**: boolean  
     **По умолчанию**: false  
     **Описание**: показывать ли контроллер для поворота. 
 9.  `menuPosition`:  
     **Тип**: string  
     **По умолчанию**: bottom  
     **Описание**: положение меню, возможные значения: top, bottom, left, right. 
 10.  `menuThickness`:  
     **Тип**: число  
     **Обязательно**: нет  
     **Описание**: высота меню при положении top или bottom, ширина меню при положении left или right, значение должно быть больше  Yöntem 0, если равно 0, то меню скрывается. 
 11.  `backgroundColor`:  
     **Тип**: string  
     **Обязательно**: нет  
     **Описание**: цвет фона компонента. **Событие:**1. `onChange({blob, base64})`: событие отслеживания окончательной обработки изображения  
   blob: объект Blob экспортированного изображения, который можно использовать для загрузки изображения  
   base64: строка Base64 экспортированного изображения, которую можно использовать для загрузки изображения  

**Методы:** 

1. `this.$refs['pictureCut'].scale(zoom)`: масштабирование изображения  
   параметр zoom: коэффициент масштабирования, отношение размера после масштабирования к текущему размеру, значение должно быть больше нуля, значения между 0 и 1 сужают, значения больше 1 увеличивают.

#### 2. Компонент VuePictureCutMask

Компонент VuePictureCutMask является компонентом по умолчанию для слота VuePictureCut и управляет масками для области выреза. Его использование аналогично использованию без него.

**Использование:**

[/demo/demo3.html](https://htmlpreview.github.io/?https://raw.githubusercontent.com/987153776/vue-picture-cut/master/demo/demo3.html)

```vue
<template>
  <vue-picture-cut
    :src="src"
    :magnification="magnification"
    :init-angle="initAngle"
    :rotate-control="rotateControl"
    :max-pixel="maxPixel"
    :encoder-options="encoderOptions"
    :format="format"
    :background-color="backgroundColor"
    @on-change="onChange"
  >
    <vue-picture-cut-mask
      :width="width"
      :height="height"
      :is-round="isRound"
      :resize="resize"
      :color="color"
      :border-color="borderColor"
    />
  </vue-picture-cut>
</template>

**Атрибуты:**1. width:
Тип: число
По умолчанию: 1
Описание: пропорциональная ширина области выреза 2. height:
Тип: число
По умолчанию: 1
Описание: пропорциональная высота области выреза 3. isRound:
Тип: логический
По умолчанию: false
Описание: прямоугольник true, эллипс false 4. resize:
Тип: логический
По умолчанию: false
Описание: может ли область выреза менять свои размеры при помощи перетаскивания 5. color:
Тип: строка
Обязательность: необязательный
Описание: цвет маски 6. border-color:
Тип: строка
Обязательность: необязательный
Описание: цвет границ области выреза#### 3. Компонент VuePictureCutMenu

Компонент меню, эффект которого можно увидеть в демо.

Использование:

/demo/demo4.html /demo/demo5.html

<template>
  <vue-picture-cut
    :src="src"
    :magnification="magnification"
    :init-angle="initAngle"
    :rotate-control="rotateControl"
    :msk-option="mskOption"
    @on-change="cutChange"
  >
    <vue-picture-cut-menu
      slot="menu"
      :cancel="false"
      :max-pixel="maxPixel"
      :encoder-options="encoderOptions"
      :format="format"
      :theme="theme"
      confirm-name="OK"
      cancel-name="Отмена"
      size-auto-name="автоматически"
      size-raw-name="сырец"
      menu-rotate-name="Поворот"
      @on-change="onChange"
      @on-cancel="onCancel"
    />
  </vue-picture-cut>
</template>

Атрибуты:

  1. cancel:
    Тип: boolean
    По умолчанию: false
    Описание: Отображает кнопку отмены.

  2. maxPixel:
    Тип: число
    Обязательность: нет
    Описание: Количество пикселей самой длинной стороны экспортированного изображения. При отсутствии значения используется реальный размер изображения.

  3. encoderOptions:
    Тип: число
    Обязательность: нет
    Описание: Уровень сжатия экспортированного изображения. По умолчанию равен 0.8, принимает значения в диапазоне от 0 до 1.

  4. format:
    Тип: строка
    По умолчанию: 'image/jpeg'
    Описание: Формат экспорта изображения. По умолчанию 'image/jpeg', может быть 'image/png'.

  5. theme:
    Тип: строка
    По умолчанию: 'default'
    Описание: Тема меню. Возможные значения: 'default', 'dark', 'gray'.6. confirmName: Тип: string По умолчанию: 'Подтвердить' Описание: Текст кнопки подтверждения.

  6. cancelName: Тип: string По умолчанию: 'Отмена' Описание: Текст кнопки отмены.

  7. sizeAutoName: Тип: string По умолчанию: 'автоматически' Описание: Текст кнопки автоматического размера.

  8. sizeRawName: Тип: string По умолчанию: 'сырец' Описание: Текст кнопки сыроматериала.

  9. menuRotateName: Тип: string По умолчанию: 'Поворот' Описание: Текст кнопки поворота.

  10. root: Тип: object Обязательность: да, если не передается через слот Описание: Значение должно быть объектом VuePictureCut.

События:

  1. onChange({blob, base64}): Описание: Слушает событие окончательного вырезания и экспорта изображения, то есть при нажатии кнопки подтверждения. blob: Объект Blob экспортированного изображения, который можно использовать для загрузки изображения. base64: Base64 строка экспортированного изображения, которая также может использоваться для загрузки изображения.

  2. onCancel(): слушает нажатие кнопки "Отмена".

4. Объект Bezier

import { Bezier } from 'vue-picture-cut';

const bezier = Bezier();
bezier.setOpt(Bezier.BEZIER['ease-in-out']);
const y = bezier.getPoint(0.5);
console.log(y);
(1) Статическое свойство BEZIER — это объект ключей со значениями, содержащими заранее установленные параметры.| Ключ | Значение | Описание |

| ---- | -------- | -------- | | linear | [0.0, 0.0, 1.0, 1.0] | Линейное сглаживание | | ease | [0.25, 0.1, 0.25, 1.0] | Гладкое сглаживание | | ease-in | [0.42, 0, 1.0, 1.0] | От медленного до быстрого | | ease-out | [0, 0, 0.58, 1.0] | От быстрого до медленного | | ease-in-out | [0.42, 0, 0.58, 1.0] | От медленного до быстрого и обратно |

(2) Конструктор

Безпараметрический конструктор, внутри которого вызывается метод setOptByString('ease').

(3) Методы
Название метода Описание Аргументы Возвращаемое значение
setOpt Устанавливает тип кривой Безье (arg: string, paramsInterface = 'ease') Объект Bezier
setOptByString Устанавливает тип кривой Безье Предопределенные значения BEZIER (arg = 'ease') Объект Bezier
setOptByArr Устанавливает тип кривой Безье (x1: number, y1: number, x2: number, y2: number) Объект Bezier
getPoint Возвращает координату Y, соответствующую координате X (x: number) от 0 до 1 Координата Y, от 0 до 1
(4) Параметры ParamsInterface

ParamsInterface представляет собой массив из четырёх значений типа number.

5. Метод createAnimation

import { createAnimation } from 'vue-picture-cut';

const animation = createAnimation(options);

Метод createAnimation возвращает объект Animation.##### (1) Параметры options| Параметр | Описание | Тип | Допустимые значения | Обязательный | Значение по умолчанию | | -------- | -------- | ---- | ------------------ | ------------ | -------------------- | | duration | Продолжительность анимации в миллисекундах | число | —— | нет | 1000 | | timing | Тип перехода анимации | строка, массив чисел | Значения типа Bezier.BEZIER или ParamsInterface | нет | ease | | delay | Задержка перед началом анимации в миллисекундах | число | —— | нет | 0 | | iteration | Количество повторений анимации, infinite для бесконечного цикла | число, строка | 'infinite' или положительное целое число | нет | 0 | | direction | Направление движения анимации при повторении | строка | normal (по умолчанию, движение вперед); reverse (движение назад); alternate (сначала вперед, затем назад, чередование); alternate-reverse (сначала назад, затем вперед, чередование). | нет | normal | | change | Коллбэк-функция, принимает параметр x, значение которого находится в диапазоне от 0 до 1, используется для управления анимацией | Функция | —— | нет | —— | | end | Коллбэк-функция, выполняется после завершения анимации | Функция | —— | нет | —— |

Методы объекта Animation| Название метода | Описание | Параметры | Возвращаемое значение |

| --- | --- | --- | --- | | start | Запустить анимацию | —— | Объект Animation | | abort | Прервать анимацию | —— | —— |

6. Объект Tool

import { Tool } from 'vue-picture-cut';

Tool.loadImg('http://xxx.xxx.xxx/xxx.jpg')
.then(image => {
  // Успешная загрузка изображения
  // image - это объект Image
}, () => {
  // Неудачная загрузка изображения
});
Включает методы
  1. loadImg(src: string): Promise<HTMLImageElement>
    Описание: Загрузка изображения
    Параметр src: Ссылка на изображение
    Возвращает Promise>: Не указано

  2. rotatePoint(x: number, y: number, angle: number): Point
    Описание: Поворот точки вокруг начала координат на угол angle и вычисление новых координат точки
    Параметр x: Координата x точки
    Параметр y: Координата y точки
    Параметр angle: Угол поворота
    Возвращает Point: {x: number, y: number} новая точка

  3. clipBy(img: HTMLImageElement, width: number, height: number, showRect: RectFull, encoderOptions = 0.8, format = 'image/jpeg', pathDone?: PathDone): string
    Описание: Вырезание изображения по координатам
    Параметр img: Объект Image
    Параметр width: Ширина экспортированного изображения (пиксели)
    Параметр height: Высота экспортированного изображения (пиксели)
    Параметр showRect: Объект RectFull
    Параметр encoderOptions: Качество сжатия
    Параметр format: Формат экспорта изображения ('image/jpeg', 'image/png')
    Параметр pathDone: Метод для указания пути PathDone
    Возвращает String: base643. clipByRound(img: HTMLImageElement, width: number, height: number, showRect: RectFull, encoderOptions = 0.8, format = 'image/jpeg'): string
    Описание: Вырезание изображения по внутреннему кругу
    Параметр img: Элемент изображения
    Параметр width: Ширина изображения
    Параметр height: Высота изображения
    Параметр showRect: Прямоугольник для отображения
    Параметр encoderOptions: Параметры кодирования
    Параметр format: Формат изображения
    Возвращает String: Base64 представление изображения

  4. clipByMax(img: HTMLImageElement, max = 2000, encoderOptions = 1): ClipResult | void
    Описание: Если ширина или высота изображения превышает max, то изображение сжимается
    Параметр img: Элемент изображения
    Параметр max: Максимальное значение
    Параметр encoderOptions: Параметры кодирования
    Возвращает ClipResult | void: Объект ClipResult или undefined

  5. base64ToBlob(base64: string, format = 'image/jpeg'): Blob | null
    Описание: Преобразование base64 в объект Blob
    Параметр base64: Base64 строка
    Параметр format: Формат base64
    Возвращает Blob | null: Объект Blob или null

  6. getEllipseRectByRect(w: number, h: number, angle: number): Rect
    Описание: Вращает вписанную в прямоугольник эллипс на угол angle и вычисляет внешний прямоугольник, содержащий этот эллипс. (Предполагается, что центр прямоугольника совпадает с началом координат)
    Параметр w: Ширина начального прямоугольника
    Параметр h: Высота начального прямоугольника
    Параметр angle: Угол поворота против часовой стрелки
    Возвращаемое значение Rect: Объект Rect6. getRectByRect(w: number, h: number, angle: number): Rect Описание: Вращает прямоугольник на угол angle и вычисляет внешний прямоугольник, содержащий этот прямоугольник. (Предполагается, что центр прямоугольника совпадает с началом координат) Параметр w: Ширина начального прямоугольника Параметр h: Высота начального прямоугольника Параметр angle: Угол поворота против часовой стрелки Возвращаемое значение Rect: Объект Rect#### 7. Метод createUtils

<template>
  <div>
    <input type="file" accept="image/*" @change="inputChange"/>
    <vue-picture-cut ref="pictureCut" :src="src"/>
    <button @click="doCut">Обрезать</button>
  </div>
</template>

<script>
  import { VuePictureCut, createUtils } from 'vue-picture-cut';

  export default {
    // ...
    components: {
      VuePictureCut
    },
    data () {
      return {
        utils: null,
        src: null,
        blob: null,
        base64: null
      };
    },
    mounted() {
      this.utils = createUtils(this.$refs['pictureCut']);
    },
    methods: {
      inputChange(e) {
        const file = e.target.files[0];
        this.src = URL.createObjectURL(file);
      },
      doCut() {
        const res = this.utils.cut();
        if (res) {
          this.blob = res.file;   // объект Blob
          this.base64 = res.src;  // строка base64
        }
      }
    }
    // ...
  }
</script>

<style>
  @import "~vue-picture-cut/lib/vue-picture-cut.css";
</style>
Включенные методы1. cut(maxPixel?: number, encoderOptions?: number, format?: string): ClipResult | null

Описание: Обрезка Параметр maxPixel: Длина большей стороны экспортируемого изображения в пикселях; если не указано, используется фактический размер изображения. Параметр encoderOptions: Уровень сжатия Параметр format: Формат экспортируемого изображения ('image/jpeg', 'image/png' и т.д.) Возвращаемое значение ClipResult | null: Описание отсутствует

  1. cut(opt?: { maxPixel?: number, encoderOptions?: number, format?: string }): ClipResult | null Описание: Обрезка Параметр opt.maxPixel: Максимальное значение пикселей для более длинной стороны изображения при экспорте. При отсутствии значения используется фактический размер изображения. Параметр opt.encoderOptions: Уровень сжатия Параметр opt.format: Формат экспорта изображения ('image/jpeg', 'image/png' и т.д.) Возвращает ClipResult | null: Описание пропущено

  2. setMaskRound(isRound = true): void Описание: Устанавливает форму области выреза. Параметр isRound: true (круглая форма), false (прямоугольная форма)4. setMaskSize(w: number, h: number): void Описание: Устанавливает размер области выреза. Параметр w: ширина в процентах Параметр h: высота в процентах

  3. setMaskSizeToOriginal(): void Описание: Устанавливает размер области выреза в соотношении с шириной и высотой изображения.

  4. setMaskResize(resize = true): void Описание: Устанавливает возможность изменения размера области выреза. Параметр resize: true (можно менять размер), false (нельзя менять размер)

  5. rotate(angle: number, animation = false): number | void Описание: Вращение изображения. Параметр angle: угол поворота против часовой стрелки Параметр animation: выполнение анимации Возвращаемое значение: угол поворота после вращения против часовой стрелки

  6. rotateTo(angle: number, animation = false): void Описание: Вращение изображения до указанного угла. Параметр angle: угол поворота против часовой стрелки направление Параметр animation: выполнение анимации

  7. setFlipV(animation?: boolean): boolean | void Описание: Вертикальное отражение изображения. Параметр animation: выполнение анимации Возвращаемое значение: true (отражено), false (не отражено)

  8. setFlipH(animation?: boolean): boolean | void Описание: Горизонтальное отражение изображения. Параметр animation: выполнение анимации Возвращаемое значение: true (отражено), false (не отражено)11. setFlip(sV: boolean, sH: boolean, animation?: boolean): void Описание: Отражение изображения. Параметр sV: вертикальное отражение, true (отражено), false (не отражено) Параметр sH: горизонтальное отражение, true (отражено), false (не отражено) Параметр animation: выполнение анимации12. scale(zoom: number): void Описание: Изменение масштаба изображения. Параметр zoom: коэффициент масштабирования

  9. reset(): void Описание: Сброс состояния изображения

  10. getOptions(): CutOptions | null Описание: Получение текущих параметров компонента. Возвращаемое значение: CutOptions | null

3. Расширенные возможности

На данный момент можно обратиться за примерами к src/App.vue и src/lib/views/vue-picture-cut-menu.vue.

3.1. Дополнительное наложение

...Документация находится в процессе написания

3.2. Дополнительное меню

...Документация находится в процессе написания

III. Примечание

Используйте VuePictureCut 💗 вас!

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/light-year-vue-picture-cut.git
git@api.gitlife.ru:oschina-mirror/light-year-vue-picture-cut.git
oschina-mirror
light-year-vue-picture-cut
light-year-vue-picture-cut
master