2011-07-27 39 views
5

Tôi muốn sử dụng javascript hoặc jQuery để cắt và nén hình ảnh ở phía máy khách trước khi tải lên máy chủ.Hình ảnh cắt xén phía máy khách

workflow:

  1. Chọn ảnh
  2. Crop Image để kích thước cụ thể
  3. Nén vụ
  4. Tải lên

Có ai làm điều này trước đây chưa? Plugin nào hoặc tôi phải làm gì?

Tôi thấy facebook có thể thực hiện nén hình ảnh và tự động thay đổi kích thước hình ảnh trước khi tải lên.

+0

Tôi không biết nếu điều này là có thể. Facebook có khả năng chụp bất kỳ hình ảnh nào bạn tải lên, kích thước lại chúng trên máy chủ và sau đó lưu chúng. Sau đó, bạn sẽ thấy hình ảnh có kích thước lại trên trang. Nếu bạn muốn thay đổi kích thước mã cho PHP tôi có một số tôi đã phát triển. Vấn đề duy nhất là tôi không có opacity làm việc cho PNG được thay đổi kích thước. – James

+1

những gì về ? – spacevillain

Trả lời

6

EDIT (2014): Câu trả lời này giờ đã lỗi thời! JavaScript là ngôn ngữ lập trình có triển khai có ảnh hưởng sâu sắc đến bởi tài nguyên trình duyệt nào đang được cung cấp cho họ. Ba năm trước khi bài đăng này được tạo (tháng 7 năm 2011), các trình duyệt không có bất kỳ chức năng nào đáng tin cậy sẽ cho phép OP thực hiện những gì mà anh ta yêu cầu, do đó tôi trả lời.
Nếu bạn vẫn quan tâm đến cách thực hiện việc này, vui lòng tham khảo một số câu trả lời cho câu hỏi này đã xuất hiện trong thời gian chờ đợi trên SO. Nhưng hãy kiềm chế bản thân từ việc đưa ra bất kỳ ý kiến ​​nào thêm cho câu trả lời này vì nó rõ ràng là vô nghĩa. Cảm ơn bạn.

Chỉ cần đặt JavaScript không có nghĩa là làm những gì bạn đang yêu cầu. Bất kể dịch vụ nào bạn gặp phải cung cấp khả năng thao tác các hình ảnh được chọn, bạn có thể đặt cược tiền của mình rằng hình ảnh đã được tải lên hoàn toàn đến máy chủ trước khi bất kỳ chức năng nào khác được cung cấp.

+0

nó chắc chắn có thể được thực hiện. hãy xem tại đây: http://stackoverflow.com/questions/12728188/cropping-images-in-the-browser-before-the-upload/12730031#12730031 –

+2

Câu trả lời này được thực hiện cách đây hai năm khi có nhiều nội dung HTML5 thậm chí không tồn tại và mọi dịch vụ tồn tại đang thực hiện thao tác hình ảnh đã làm nó ở phía máy chủ. – brezanac

+0

Tôi mã js trong hơn 6 năm và tôi không muốn tranh luận những gì có thể hoặc không thể được thực hiện khoảng 2 năm trước đây. Điểm mấu chốt là chủ đề này vẫn là một * nóng * trong * tuổi của chúng tôi * và nó xứng đáng được trả lời cập nhật. –

11

Bạn có thể làm điều đó bằng base64, nhìn vào trang web của tôi đang làm việc với: http://www.wordirish.com tất cả các hình ảnh được chế tác về phía khách hàng sử dụng HTML5 hoặc flash cho các trình duyệt cũ.

bạn chỉ cần làm điều đó:

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); 
} 

miếng bánh;)

+3

nhận xét nhận xét: cảm ơn câu trả lời của bạn và chào mừng bạn đến với SO. Chỉ cần một mẹo: trả lời là tốt đẹp, nhưng nó thậm chí còn được đánh giá cao hơn để giải thích từng bước của giải pháp của bạn. –

+0

Mime cần phải là * jpeg * không * jpg * trong * toDataURL ('hình ảnh/jpg', 90); *. Cảm ơn câu trả lời tuyệt vời. – Kareem

Các vấn đề liên quan