Để phân tích không gian trống trong một hình ảnh, cách duy nhất tôi biết là để tải hình ảnh đó vào một canvas
:
var img = new Image(),
$canvas = $("<canvas>"), // create an offscreen canvas
canvas = $canvas[0],
context = canvas.getContext("2d");
img.onload = function() {
context.drawImage(this, 0, 0); // put the image in the canvas
$("body").append($canvas);
removeBlanks(this.width, this.height);
};
// test image
img.src = 'http://images.productserve.com/preview/1302/218680281.jpg';
Tiếp theo, sử dụng phương pháp getImageData(). Phương thức này trả về một đối tượng ImageData mà bạn có thể sử dụng để kiểm tra từng dữ liệu pixel (màu).
var removeBlanks = function (imgWidth, imgHeight) {
var imageData = context.getImageData(0, 0, canvas.width, canvas.height),
data = imageData.data,
getRBG = function(x, y) {
return {
red: data[(imgWidth*y + x) * 4],
green: data[(imgWidth*y + x) * 4 + 1],
blue: data[(imgWidth*y + x) * 4 + 2]
};
},
isWhite = function (rgb) {
return rgb.red == 255 && rgb.green == 255 && rgb.blue == 255;
},
scanY = function (fromTop) {
var offset = fromTop ? 1 : -1;
// loop through each row
for(var y = fromTop ? 0 : imgHeight - 1; fromTop ? (y < imgHeight) : (y > -1); y += offset) {
// loop through each column
for(var x = 0; x < imgWidth; x++) {
if (!isWhite(getRBG(x, y))) {
return y;
}
}
}
return null; // all image is white
},
scanX = function (fromLeft) {
var offset = fromLeft? 1 : -1;
// loop through each column
for(var x = fromLeft ? 0 : imgWidth - 1; fromLeft ? (x < imgWidth) : (x > -1); x += offset) {
// loop through each row
for(var y = 0; y < imgHeight; y++) {
if (!isWhite(getRBG(x, y))) {
return x;
}
}
}
return null; // all image is white
};
var cropTop = scanY(true),
cropBottom = scanY(false),
cropLeft = scanX(true),
cropRight = scanX(false);
// cropTop is the last topmost white row. Above this row all is white
// cropBottom is the last bottommost white row. Below this row all is white
// cropLeft is the last leftmost white column.
// cropRight is the last rightmost white column.
};
Thành thật mà nói tôi đã không thể kiểm tra mã này vì một lý do tốt: Tôi đã xem qua các "Không thể để có được dữ liệu hình ảnh từ vải vì vải đã bị làm hỏng bởi dữ liệu chéo gốc." Ngoại lệ an ninh khét tiếng .
Đây không phải là lỗi, nó là một tính năng dự định. Từ specs:
Các toDataURL(), toDataURLHD(), toBlob(), getImageData(), và getImageDataHD() phương pháp kiểm tra cờ và sẽ ném một ngoại lệ SecurityError hơn là rò rỉ dữ liệu chéo gốc .
này xảy ra khi drawImage()
tải tệp từ các miền bên ngoài, gây nguồn gốc sạch cờ của vải được thiết lập là false, ngăn không cho thao tác dữ liệu hơn nữa.
Tôi sợ bạn sẽ chạy vào cùng một vấn đề, nhưng dù sao, here is the code.
Thậm chí nếu điều này làm việc về phía khách hàng, tôi có thể tưởng tượng như thế nào đau khổ sẽ là hiệu suất-khôn ngoan. Vì vậy, như Jan đã nói, nếu bạn có thể tải xuống hình ảnh và xử lý trước chúng ở phía máy chủ, điều đó sẽ tốt hơn.
Edit: Tôi đã tò mò muốn xem nếu mã của tôi thực sự sẽ cắt một hình ảnh, và thực sự nó làm.
Bạn có thể kiểm tra xem nó ra here
Nó chỉ hoạt động cho hình ảnh từ tên miền của bạn, như đã nói trước đó. Bạn có thể chọn hình ảnh của riêng bạn với nền màu trắng và thay đổi dòng cuối cùng:
// define here an image from your domain
img.src = 'http://localhost/strawberry2.jpg';
Rõ ràng, bạn sẽ cần phải chạy mã từ miền của bạn, chứ không phải từ jsFiddle.
Edit2: Nếu bạn muốn cắt và mở rộng quy mô để giữ tỉ lệ tương tự, sau đó thay đổi này
var $croppedCanvas = $("<canvas>").attr({ width: cropWidth, height: cropHeight });
// finally crop the guy
$croppedCanvas[0].getContext("2d").drawImage(canvas,
cropLeft, cropTop, cropWidth, cropHeight,
0, 0, cropWidth, cropHeight);
để
var $croppedCanvas = $("<canvas>").attr({ width: imgWidth, height: imgHeight });
// finally crop the guy
$croppedCanvas[0].getContext("2d").drawImage(canvas,
cropLeft, cropTop, cropWidth, cropHeight,
0, 0, imgWidth, imgHeight);
Edit3: Một cách nhanh chóng để cắt hình ảnh trên trình duyệt r, là để song song khối lượng công việc thông qua việc sử dụng Nhân viên Web, vì điều này excellent article giải thích.
Tôi có thể đề xuất rằng bạn thực sự thêm một trong những hình ảnh mà sự cố xảy ra với câu hỏi của bạn. Nó sẽ ngăn phiếu bầu đóng lại vì bạn đang quảng cáo trang web của mình một cách hiệu quả. –
Bạn có thể vẽ hình ảnh trên canvas và xóa toàn bộ các cột và hàng trống, đồng thời rescale hình ảnh với kích thước 'giống nhau' (giữ tỷ lệ cỡ ảnh). – Prusse
"Tôi muốn sử dụng javascript hơn là xử lý trước hình ảnh" - Tại sao? Tại sao bạn muốn trình duyệt người dùng phải xóa không gian trắng mỗi lần ảnh được tải thay vì chỉ làm một lần ở phía máy chủ, sau đó lưu ảnh mà không có khoảng trắng để sử dụng trong tương lai? – h2ooooooo