Ответ 1
Для анализа пробелов в изображении я знаю только один способ - загрузить это изображение в 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';
Затем используйте метод getImageData(). Этот метод возвращает объект ImageData, который можно использовать для проверки данных каждого цвета (цвет).
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.
};
Честно говоря, я не смог протестировать этот код по уважительной причине: я наткнулся на печально известную "Не удалось получить данные изображения с холста, поскольку холст был испорчен данными из разных источников." Исключение безопасности.
Это не ошибка, это целевая функция. Из спецификаций:
ToDataURL(), toDataURLHD(), toBlob(), getImageData() и Методы getImageDataHD() проверяют флаг и выдают ошибку SecurityError исключение, а не утечка данных из разных источников.
Это происходит, когда drawImage()
загружает файлы из внешних доменов, в результате чего для флага источника-чистоты холста устанавливается значение false, что предотвращает дальнейшие манипуляции с данными.
Боюсь, что вы столкнетесь с той же проблемой, но в любом случае вот код.
Даже если это работает на стороне клиента, я могу себе представить, насколько несчастным будет с точки зрения производительности. Так что, как сказал Ян, если вы сможете загрузить изображения и предварительно обработать их на стороне сервера, это будет лучше.
Изменить: Мне было любопытно посмотреть, действительно ли мой код обрезает изображение, и это действительно так.
Вы можете проверить это здесь
Это работает только для изображений с вашего домена, как указано ранее. Вы можете выбрать собственное изображение с белым фоном и изменить последнюю строку:
// define here an image from your domain
img.src = 'http://localhost/strawberry2.jpg';
Очевидно, вам нужно будет запустить код из своего домена, а не из jsFiddle.
Edit2: Если вы хотите обрезать и масштабировать, чтобы сохранить то же соотношение сторон, то измените это
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: Один из быстрых способов обрезать изображения в браузере - это распараллелить рабочую нагрузку с помощью Web Workers, как объясняется в этой превосходной статье.