JavaScript Image Cropper. Esta es la rama para v1.x, para v2.x, consulte la rama
v2
.
dist/
├── cropper.css
├── cropper.min.css (compressed)
├── cropper.js (UMD)
├── cropper.min.js (UMD, compressed)
├── cropper.common.js (CommonJS, default)
└── cropper.esm.js (ES Module)
npm install cropperjs
En el navegador:
< link href =" /path/to/cropper.css " rel =" stylesheet " >
< script src =" /path/to/cropper.js " > </ script >
CDNJS proporciona soporte de CDN para CSS y JavaScript de Cropper.js. Puede encontrar los enlaces aquí.
new Cropper ( element [ , options ] )
elemento
HTMLImageElement
o HTMLCanvasElement
Opciones (opcional)
Object
<!-- Wrap the image or canvas element with a block element (container) -->
< div >
< img id =" image " src =" picture.jpg " >
</ div >
/* Make sure the size of the image fits perfectly into the container */
img {
display : block;
/* This rule is very important, please don't ignore this */
max-width : 100 % ;
}
// import 'cropperjs/dist/cropper.css';
import Cropper from 'cropperjs' ;
const image = document . getElementById ( 'image' ) ;
const cropper = new Cropper ( image , {
aspectRatio : 16 / 9 ,
crop ( event ) {
console . log ( event . detail . x ) ;
console . log ( event . detail . y ) ;
console . log ( event . detail . width ) ;
console . log ( event . detail . height ) ;
console . log ( event . detail . rotate ) ;
console . log ( event . detail . scaleX ) ;
console . log ( event . detail . scaleY ) ;
} ,
} ) ;
¿Cómo recortar una nueva área después de acercarse o acercarse?
Simplemente haga doble clic en su mouse para ingresar al modo de cultivo.
¿Cómo mover la imagen después de recortar un área?
Simplemente haga doble clic en su mouse para ingresar al modo Move.
¿Cómo solucionar la relación de aspecto en el modo de relación libre?
Simplemente mantenga presionada la tecla
Shift
cuando cambie el tamaño del cuadro de recorte.
¿Cómo recortar un área cuadrada en modo de relación libre?
Simplemente sostenga la tecla
Shift
cuando recorte en la imagen.
El tamaño del cultivo hereda del tamaño del elemento principal de la imagen (envoltorio), así que asegúrese de envolver la imagen con un elemento de bloque visible .
Si está utilizando Cropper en un modal, debe inicializar el Cropper después de que el modal se muestra por completo. De lo contrario, no obtendrá el Cropper correcto.
Los datos recortados salidas se basan en el tamaño de la imagen original, por lo que puede usarlos para recortar la imagen directamente.
Si intenta iniciar Cropper en una imagen de origen cruzado, asegúrese de que su navegador admita los atributos de configuración de HTML5 CORS, y su servidor de imágenes admite la opción Access-Control-Allow-Origin
(consulte el control de acceso HTTP (CORS)).
Límites de recursos de iOS conocidos: a medida que los dispositivos iOS limitan la memoria, el navegador puede bloquearse cuando está recortando una imagen grande (resolución de la cámara del iPhone). Para evitar esto, puede cambiar el tamaño de la imagen primero (preferiblemente por debajo de 1024 píxeles) antes de comenzar un cultivo.
Aumento del tamaño de la imagen conocido: al exportar la imagen recortada en el lado del navegador con el método HTMLCanvasElement.toDataURL
, el tamaño de la imagen exportada puede ser mayor que la imagen original. Esto se debe a que el tipo de imagen exportada no es lo mismo que la imagen original. Así que simplemente pase el tipo de imagen original como el primer parámetro en toDataURL
para solucionar esto. Por ejemplo, si el tipo original es JPEG, use cropper.getCroppedCanvas().toDataURL('image/jpeg')
para exportar la imagen.
⬆ De vuelta a la cima
Puede establecer opciones de Cropper con new Cropper(image, options)
. Si desea cambiar las opciones predeterminadas globales, puede usar Cropper.setDefaults(options)
.
Number
0
0
: No hay restricciones1
: restringir la caja de recorte para que no exceda el tamaño del lienzo.2
: restringir el tamaño mínimo de lienzo para que se ajuste dentro del contenedor. Si las proporciones del lienzo y el contenedor difieren, el lienzo mínimo estará rodeado por un espacio adicional en una de las dimensiones.3
: restringir el tamaño mínimo de lienzo para llenar el contenedor. Si las proporciones del lienzo y el contenedor son diferentes, el contenedor no podrá adaptarse a todo el lienzo en una de las dimensiones. Defina el modo de vista del cultivo. Si establece viewMode
en 0
, el cuadro de cultivo puede extenderse fuera del lienzo, mientras que un valor de 1
, 2
o 3
restringirá el cuadro de cultivo al tamaño del lienzo. viewMode
de 2
o 3
restringirá además el lienzo al contenedor. No hay diferencia entre 2
y 3
cuando las proporciones del lienzo y el contenedor son las mismas.
String
'crop'
'crop'
: crea una nueva caja de cultivo'move'
: mueva el lienzo'none'
: no hacer nadaDefina el modo de arrastre del cultivo.
Number
NaN
Defina la relación de aspecto inicial de la caja de recorte. Por defecto, es la misma que la relación de aspecto del lienzo (envoltura de imágenes).
Solo disponible cuando la opción
aspectRatio
está configurada enNaN
.
Number
NaN
Defina la relación de aspecto fija de la caja de recorte. Por defecto, el cuadro de cultivo tiene una relación libre.
Object
null
Los datos recortados anteriores que almacenó se pasarán al método setData
automáticamente cuando se inicializan.
Solo disponible cuando la opción
autoCrop
se había establecido en latrue
.
Element
, Array
(Elementos), NodeList
o String
(Selector)''
Agregue elementos adicionales (contenedores) para la vista previa.
Notas:
aspectRatio
, asegúrese de establecer la misma relación de aspecto en el contenedor de vista previa.overflow: hidden
en el contenedor de vista previa.Boolean
true
Vuelva a renderizar al cultivo al cambiar el tamaño de la ventana.
Boolean
true
Restaurar el área recortada después de cambiar el tamaño de la ventana.
Boolean
true
Compruebe si la imagen actual es una imagen de origen cruzado.
Si es así, se agregará un atributo crossOrigin
al elemento de imagen clonado, y se agregará un parámetro de marca de tiempo al atributo src
para recargar la imagen de origen para evitar el error de caché del navegador.
Agregar un atributo crossOrigin
al elemento de imagen dejará de agregar una marca de tiempo a la URL de la imagen y dejará de recargar la imagen. Pero la solicitud (xmlhttprequest) para leer los datos de la imagen para la verificación de orientación requerirá una marca de tiempo para reventar el caché para evitar el error de caché del navegador. Puede establecer la opción checkOrientation
en false
para cancelar esta solicitud.
Si el valor del atributo de crossOrigin
de la imagen es "use-credentials"
, entonces el atributo withCredentials
se establecerá en true
cuando lea los datos de la imagen por XMLHTTPRequest.
Boolean
true
Verifique la información de orientación exif de la imagen actual. Tenga en cuenta que solo una imagen JPEG puede contener información de orientación exif.
Exactamente, lea el valor de orientación para girar o voltear la imagen, y luego anular el valor de orientación con 1
(el valor predeterminado) para evitar algunos problemas (1, 2) en dispositivos iOS.
Requiere establecer las opciones rotatable
y scalable
en true
al mismo tiempo.
Nota: No confíe en esto todo el tiempo, ya que algunas imágenes JPG pueden tener valores de orientación incorrectos (no estándar)
Requiere soporte de matrices tipificadas (es decir, 10+).
Boolean
true
Muestre el modal negro sobre la imagen y debajo de la caja de recorte.
Boolean
true
Muestre las líneas discontinuas sobre la caja de recorte.
Boolean
true
Muestre el indicador central sobre la caja de recorte.
Boolean
true
Muestre el modal blanco sobre la caja de recorte (resalte la caja de recorte).
Boolean
true
Muestre el fondo de la cuadrícula del contenedor.
Boolean
true
Habilite recortar la imagen automáticamente cuando se inicializa.
Number
0.8
(80% de la imagen)Debe ser un número entre 0 y 1. Defina el tamaño del área de cultivo automático (porcentaje).
Boolean
true
Habilitar para mover la imagen.
Boolean
true
Habilitar para rotar la imagen.
Boolean
true
Habilitar escalar la imagen.
Boolean
true
Habilitar para acercar la imagen.
Boolean
true
Habilitar para ampliar la imagen arrastrando el tacto.
Boolean
true
Habilite acercar la imagen por el mouse de mouse.
Number
0.1
Defina la relación de zoom al zoom de la imagen por el ratón.
Boolean
true
Habilite mover el cuadro de recorte arrastrando.
Boolean
true
Habilite cambiar el tamaño de la caja de cultivo arrastrando.
Boolean
true
Habilite para alternar el modo de arrastre entre "crop"
y "move"
al hacer clic dos veces en el cultivo.
Requiere soporte de eventos
dblclick
.
Number
200
El ancho mínimo del contenedor.
Number
100
La altura mínima del contenedor.
Number
0
El ancho mínimo del lienzo (envoltura de imágenes).
Number
0
La altura mínima del lienzo (envoltura de imágenes).
Number
0
El ancho mínimo de la caja de cultivo.
Nota: Este tamaño es relativo a la página, no con la imagen.
Number
0
La altura mínima de la caja de recorte.
Nota: Este tamaño es relativo a la página, no con la imagen.
Function
null
Un atajo al evento ready
.
Function
null
Un atajo para el evento cropstart
.
Function
null
Un atajo para el evento cropmove
.
Function
null
Un atajo para el evento cropend
.
Function
null
Un atajo al evento crop
.
Function
null
Un atajo para el evento zoom
.
⬆ De vuelta a la cima
Como hay un proceso asincrónico al cargar la imagen, debe llamar a la mayoría de los métodos después de listos , excepto setAspectRatio
, replace
y destroy
.
Si un método no necesita devolver ningún valor, devolverá la instancia de Cropper (
this
) para la composición de la cadena.
new Cropper ( image , {
ready ( ) {
// this.cropper[method](argument1, , argument2, ..., argumentN);
this . cropper . move ( 1 , - 1 ) ;
// Allows chain composition
this . cropper . move ( 1 , - 1 ) . rotate ( 45 ) . scale ( 1 , - 1 ) ;
} ,
} ) ;
Muestre la caja de cultivo manualmente.
new Cropper ( image , {
autoCrop : false ,
ready ( ) {
// Do something here
// ...
// And then
this . cropper . crop ( ) ;
} ,
} ) ;
Restablezca la imagen y el cuadro de cultivo a sus estados iniciales.
Limpie la caja de recorte.
URL :
String
Hassamesize (opcional):
Boolean
false
Reemplace el SRC de la imagen y reconstruya el Cropper.
Habilitar (Desengar) el Cropper.
Desactive (congele) el cultivador.
Destruye el cultivador y elimina la instancia de la imagen.
offsetX :
Number
offsety (opcional):
Number
offsetX
.Mueva el lienzo (envoltura de imágenes) con compensaciones relativas.
cropper . move ( 1 ) ;
cropper . move ( 1 , 0 ) ;
cropper . move ( 0 , - 1 ) ;
X :
Number
left
del lienzoy (opcional):
Number
top
del lienzox
.Mueva el lienzo (envoltura de imágenes) a un punto absoluto.
Number
Zoom del lienzo (envoltura de imágenes) con una relación relativa.
cropper . zoom ( 0.1 ) ;
cropper . zoom ( - 0.1 ) ;
relación :
Number
Pivot (opcional):
Object
{ x: Number, y: Number }
Zoom del lienzo (envoltura de imágenes) a una relación absoluta.
cropper . zoomTo ( 1 ) ; // 1:1 (canvasData.width === canvasData.naturalWidth)
const containerData = cropper . getContainerData ( ) ;
// Zoom to 50% from the center of the container.
cropper . zoomTo ( .5 , {
x : containerData . width / 2 ,
y : containerData . height / 2 ,
} ) ;
Number
Gire la imagen en un grado relativo.
Requiere soporte de transformación 2D CSS3 (es decir, 9+).
cropper . rotate ( 90 ) ;
cropper . rotate ( - 90 ) ;
Number
Gire la imagen en un grado absoluto.
Scalex :
Number
1
1
no hace nada.Scaley (opcional):
Number
scaleX
.Escalar la imagen.
Requiere soporte de transformación 2D CSS3 (es decir, 9+).
cropper . scale ( - 1 ) ; // Flip both horizontal and vertical
cropper . scale ( - 1 , 1 ) ; // Flip horizontal
cropper . scale ( 1 , - 1 ) ; // Flip vertical
Number
1
1
no hace nada.Escala la abscisa de la imagen.
Number
1
1
no hace nada.Escala la ordenada de la imagen.
redondeado (opcional):
Boolean
false
true
para obtener valores redondeados.(Valor de retorno):
Object
x
: El desplazamiento a la izquierda del área recortaday
: La parte superior compensada del área recortadawidth
: el ancho del área recortadaheight
: la altura del área recortadarotate
: los grados girados de la imagenscaleX
: El factor de escala se aplicará en la abscisa de la imagenscaleY
: El factor de escala para aplicarse en la ordenación de la imagenSalga los datos finales de la posición del área recortada y el tamaño (según el tamaño natural de la imagen original).
Puede enviar los datos al lado del servidor para recortar la imagen directamente:
- Gire la imagen con la propiedad
rotate
.- Escala la imagen con las propiedades
scaleX
yscaleY
.- Recorte la imagen con las propiedades
x
,y
,width
yheight
.
Object
getData
.Cambie la posición y el tamaño del área recortada con nuevos datos (según la imagen original).
Nota: Este método solo disponible cuando el valor de la opción
viewMode
es mayor o igual a1
.
Object
width
: el ancho actual del contenedorheight
: la altura actual del contenedorEmitir los datos del tamaño del contenedor.
Object
left
: el desplazamiento a la izquierda de la imagentop
: la parte superior compensada de la imagenwidth
: el ancho de la imagenheight
: la altura de la imagennaturalWidth
: el ancho natural de la imagennaturalHeight
: la altura natural de la imagenaspectRatio
: la relación de aspecto de la imagenrotate
: los grados girados de la imagen si se girascaleX
: El factor de escala se aplicará en la abscisa de la imagen si se escalascaleY
: el factor de escala que se aplica en la ordenación de la imagen si se escalaENCONTRA LA POSICIÓN DE IMAGEN, TAMAÑO Y OTROS DATOS RELACIONADOS.
Object
left
: el desplazamiento a la izquierda del lienzotop
: la parte superior compensada del lienzowidth
: el ancho del lienzoheight
: la altura del lienzonaturalWidth
: el ancho natural del lienzo (solo lea)naturalHeight
: la altura natural del lienzo (solo lea)Salga los datos de posición y tamaño del lienzo (envoltura de imágenes).
const imageData = cropper . getImageData ( ) ;
const canvasData = cropper . getCanvasData ( ) ;
if ( imageData . rotate % 180 === 0 ) {
console . log ( canvasData . naturalWidth === imageData . naturalWidth ) ;
// > true
}
Object
left
: el nuevo desplazamiento a la izquierda del lienzotop
: la nueva parte superior de compensación del lienzowidth
: el nuevo ancho del lienzoheight
: la nueva altura del lienzoCambie la posición y el tamaño del lienzo (envoltura de imágenes) con nuevos datos.
Object
left
: el desplazamiento a la izquierda de la caja de recortetop
: la parte superior compensada de la caja de recortewidth
: el ancho de la caja de cultivoheight
: la altura de la caja de recorteSalga la posición de la caja de recorte y los datos de tamaño.
Object
left
: el nuevo desplazamiento a la izquierda de la caja de recortetop
: la nueva parte superior compensada de la caja de recortewidth
: el nuevo ancho de la caja de cultivoheight
: la nueva altura de la caja de recorteCambie la posición y el tamaño de la caja de recorte con nuevos datos.
Opciones (opcional):
Object
width
: el ancho de destino del lienzo de salida.height
: la altura de destino del lienzo de salida.minWidth
: el ancho de destino mínimo del lienzo de salida, el valor predeterminado es 0
.minHeight
: la altura mínima de destino del lienzo de salida, el valor predeterminado es 0
.maxWidth
: el ancho de destino máximo del lienzo de salida, el valor predeterminado es Infinity
.maxHeight
: la altura máxima de destino del lienzo de salida, el valor predeterminado es Infinity
.fillColor
: un color para llenar los valores alfa en el lienzo de salida, el valor predeterminado es transparent
.imageSmoothingEnabled
: Establecer para cambiar si las imágenes se suavizan ( true
, predeterminada) o no ( false
).imageSmoothingQuality
: establezca la calidad del suavizado de la imagen, uno de "bajo" (predeterminado), "medio" o "alto".rounded
: configure true
para usar valores redondeados (la posición de área recortada y los datos de tamaño), el valor predeterminado es false
.(Valor de retorno):
HTMLCanvasElement
Notas:
fillColor
primero, si no, la parte transparente en la imagen JPEG se volverá negra de forma predeterminada.Soporte del navegador:
Obtenga un lienzo extraído de la imagen recortada (compresión con pérdida). Si no se recorta, devuelve un lienzo dibujado toda la imagen.
Después de entonces, puede mostrar el lienzo como una imagen directamente, o usar htmlcanvaselement.todataurl para obtener una URL de datos, o usar htmlcanvaselement.toblob para obtener un blob y cargarlo en servidor con formios de formato si el navegador admite estas API.
Evite obtener una imagen de salida en blanco (o negro), es posible que deba establecer las propiedades maxWidth
y maxHeight
en números limitados, debido a los límites de tamaño de un elemento de lona. Además, debe limitar la relación zoom máxima (en el evento zoom
) por la misma razón.
cropper . getCroppedCanvas ( ) ;
cropper . getCroppedCanvas ( {
width : 160 ,
height : 90 ,
} ) ;
cropper . getCroppedCanvas ( {
minWidth : 256 ,
minHeight : 256 ,
maxWidth : 4096 ,
maxHeight : 4096 ,
} ) ;
cropper . getCroppedCanvas ( {
fillColor : '#fff' ,
imageSmoothingEnabled : false ,
imageSmoothingQuality : 'high' ,
} ) ;
// Upload cropped image to server if the browser supports `HTMLCanvasElement.toBlob`.
// The default value for the second parameter of `toBlob` is 'image/png', change it if necessary.
cropper . getCroppedCanvas ( ) . toBlob ( ( blob ) => {
const formData = new FormData ( ) ;
// Pass the image file name as the third parameter if necessary.
formData . append ( 'croppedImage' , blob /*, 'example.png' */ ) ;
// Use `jQuery.ajax` method for example
$ . ajax ( '/path/to/upload' , {
method : 'POST' ,
data : formData ,
processData : false ,
contentType : false ,
success ( ) {
console . log ( 'Upload success' ) ;
} ,
error ( ) {
console . log ( 'Upload error' ) ;
} ,
} ) ;
} /*, 'image/png' */ ) ;
Number
Cambie la relación de aspecto de la caja de cultivo.
String
'none'
'none'
, 'crop'
, 'move'
Cambie el modo de arrastre.
Consejos: puede alternar el modo "Cultivo" y "Mover" haciendo doble clic en el Cropper.
⬆ De vuelta a la cima
Este evento se dispara cuando la imagen de destino se ha cargado y la instancia de Cropper está lista para operar.
let cropper ;
image . addEventListener ( 'ready' , function ( ) {
console . log ( this . cropper === cropper ) ;
// > true
} ) ;
cropper = new Cropper ( image ) ;
event.detail.originalevent :
Event
pointerdown
, touchstart
y mousedown
event.detail.action :
String
'crop'
: crea una nueva caja de cultivo'move'
: mueva el lienzo (envoltura de imágenes)'zoom'
: zoom en / fuera el lienzo (envoltura de imágenes) por touch.'e'
: cambiar el tamaño del lado este de la caja de cultivo'w'
: cambiar el tamaño del lado oeste de la caja de cultivo's'
: cambiar el tamaño del lado sur de la caja de cultivo'n'
: cambiar el tamaño del lado norte de la caja de cultivo'se'
: cambiar el tamaño del lado sureste de la caja de cultivo'sw'
: cambiar el tamaño del lado suroeste de la caja de cultivo'ne'
: cambiar el tamaño del lado noreste de la caja de cultivo'nw'
: cambiar el tamaño del lado noroeste de la caja de cultivo'all'
: mueva la caja de recorte (todas las direcciones)Este evento se dispara cuando el lienzo (envoltura de imágenes) o la caja de recorte comienza a cambiar.
image . addEventListener ( 'cropstart' , ( event ) => {
console . log ( event . detail . originalEvent ) ;
console . log ( event . detail . action ) ;
} ) ;
event.detail.originalevent :
Event
pointermove
, touchmove
y mousemove
.event.detail.action : lo mismo que "CropStart".
Este evento se dispara cuando el lienzo (envoltura de imágenes) o la caja de recorte está cambiando.
event.detail.originalevent :
Event
pointerup
, pointercancel
, touchend
, touchcancel
y mouseup
.event.detail.action : lo mismo que "CropStart".
Este evento se dispara cuando el lienzo (envoltura de imágenes) o la caja de recorte deja de cambiar.
Sobre estas propiedades, consulte el método
getData
.
Este evento se dispara cuando cambia el lienzo (envoltura de imágenes) o la caja de recorte.
Notas:
autoCrop
se establece en el true
, se activará un evento crop
antes del evento ready
.data
, se activará otro evento crop
antes del evento ready
.event.detail.originalevent :
Event
wheel
, pointermove
, touchmove
y mousemove
.event.detail.oldratio :
Number
event.detail.ratio :
Number
canvasData.width / canvasData.naturalWidth
)Este evento se dispara cuando una instancia de Cropper comienza a acercarse o alejar su lienzo (envoltura de imágenes).
image . addEventListener ( 'zoom' , ( event ) => {
// Zoom in
if ( event . detail . ratio > event . detail . oldRatio ) {
event . preventDefault ( ) ; // Prevent zoom in
}
// Zoom out
// ...
} ) ;
⬆ De vuelta a la cima
Si tiene que usar otro Cropper con el mismo espacio de nombres, simplemente llame al método estático Cropper.noConflict
.
< script src =" other-cropper.js " > </ script >
< script src =" cropper.js " > </ script >
< script >
Cropper . noConflict ( ) ;
// Code that uses other `Cropper` can follow here.
</ script >
Lea nuestras pautas contribuyentes.
Mantenido bajo las pautas de versiones semánticas.
MIT © Chen Fengyuan
⬆ De vuelta a la cima