2011-07-27 20 views
5

Me gustaría usar javascript o jQuery para recortar y comprimir una imagen en el lado del cliente antes de cargarla en el servidor.Imagen de recorte de Javascript del lado del cliente

flujo de trabajo:

  1. Seleccionar Imagen
  2. Recortar imagen a tamaño específico
  3. comprimir los cultivos
  4. Subir

Alguien ha hecho esto antes? ¿Qué complemento o qué tengo que hacer?

Veo que Facebook puede hacer compresiones de imágenes y redimensionarlas automáticamente antes de cargarlas.

+0

No sé si esto es posible. Es probable que Facebook tome cualquier imagen que cargue, la vuelva a clasificar según el tamaño en el servidor y luego la guarde. Luego vería la imagen de nuevo en la página. Si quieres cambiar el tamaño del código para PHP, tengo algunos que he desarrollado. El único problema es que no tengo la opacidad funcionando para PNG que se cambian de tamaño. – James

+1

¿qué hay de ? – spacevillain

Respuesta

6

EDITAR (2014): Esta respuesta es ahora obsoleto! JavaScript es un lenguaje de programación con implementaciones que están profundamente influenciadas en por los recursos del navegador que están disponibles para ellos. Hace tres años cuando se realizó esta publicación (julio de 2011), los navegadores no tenían ningún tipo de funcionalidad confiable que permitiera a OP hacer lo que él le pidió, de ahí mi respuesta.
Si todavía está interesado en cómo se puede hacer esto ahora, por favor consulte algunas de las muchas respuestas a esta pregunta que han aparecido mientras tanto en SO. Pero por favor evite realizar más comentarios a esta respuesta porque obviamente no tiene sentido. Gracias.

Simplemente ponga JavaScript no para hacer lo que está pidiendo. Cualquier servicio que encuentre que le ofrezca la capacidad de manipular imágenes seleccionadas, puede apostar su dinero a que la imagen se cargó completamente en el servidor antes de que se le ofreciera ninguna otra funcionalidad.

+0

definitivamente se puede hacer. échale un vistazo aquí: http://stackoverflow.com/questions/12728188/cropping-images-in-the-browser-before-the-upload/12730031#12730031 –

+2

Esta respuesta se hizo hace dos años cuando muchas cosas de HTML5 ni siquiera existía y todos los servicios existentes que realizaban manipulación de imágenes lo hicieron en el lado del servidor. – brezanac

+0

Codigo js por más de 6 años y no quiero discutir lo que podría o no podría hacerse hace 2 años. La conclusión es que este hilo todavía es * hot * uno en * nuestra edad * y merece una respuesta actualizada. –

11

Puede hacerlo utilizando base 64, mira a la página web que estoy trabajando con: http://www.wordirish.com todas las imágenes son manipuladas en el lado del cliente usando HTML5 o flash para navegadores antiguos.

sólo necesitas hacerlo:

function thisFunctionShoulBeCallByTheFileuploaderButton(e){ 
    e.preventDefault && e.preventDefault(); 
    var image, canvas, i; 
    var images = 'files' in e.target ? e.target.files : 'dataTransfer' in e ? e.dataTransfer.files : []; 
    if(images && images.length) { 
     for(i in images) { 
      if(typeof images[i] != 'object') continue; 
      image = new Image(); 
      image.src = createObjectURL(images[i]); 
      image.onload = function(e){ 
       var mybase64resized = resizeCrop(e.target, 200, 150).toDataURL('image/jpg', 90); 
       alert(mybase64resized); 
      } 
     }   
    } 
} 

function resizeCrop(src, width, height){ 
    var crop = width == 0 || height == 0; 
    // not resize 
    if(src.width <= width && height == 0) { 
     width = src.width; 
     height = src.height; 
    } 
    // resize 
    if(src.width > width && height == 0){ 
     height = src.height * (width/src.width); 
    } 

    // check scale 
    var xscale = width/src.width; 
    var yscale = height/src.height; 
    var scale = crop ? Math.min(xscale, yscale) : Math.max(xscale, yscale); 
    // create empty canvas 
    var canvas = document.createElement("canvas");     
    canvas.width = width ? width : Math.round(src.width * scale); 
    canvas.height = height ? height : Math.round(src.height * scale); 
    canvas.getContext("2d").scale(scale,scale); 
    // crop it top center 
    canvas.getContext("2d").drawImage(src, ((src.width * scale) - canvas.width) * -.5 , ((src.height * scale) - canvas.height) * -.5); 
    return canvas; 
} 

function createObjectURL(i){ 
    var URL = window.URL || window.webkitURL || window.mozURL || window.msURL; 
    return URL.createObjectURL(i); 
} 

pedazo de la torta;)

+3

comentario de revisión: gracias por su respuesta y bienvenidos a SO. Solo un consejo: responder es bueno, pero es aún más apreciado explicar cada paso de su solución. –

+0

El mimo debe ser * jpeg * not * jpg * in * toDataURL ('image/jpg', 90); *. Gracias por la gran respuesta. – Kareem

Cuestiones relacionadas