Вы полагаетесь на инструмент обрезки, чтобы обеспечить интерфейс для пользователей. проблема в том, что возвращенное изображение зависит от интерфейса, а не от исходного изображения. Вместо того, чтобы просеивать через различные API, чтобы убедиться, что они обеспечивают какой-то способ контроля этого поведения (я предполагаю, по крайней мере, некоторые из них), и потому что это такая простая процедура, я покажу, как обрезать изображение вручную.
Чтобы использовать JCrop в качестве примера
Jcrop предоставляет различные события для cropstart, cropmove, cropend ... Вы можете добавить слушатель слушать эти события и сохранить копию интерфейса состояния тока кадрирования
var currentCrop;
jQuery('#target').on('cropstart cropmove cropend',function(e,s,crop){
currentCrop = crop;
}
Я не знаю, где вы установили размер интерфейса и я предполагаю, что события возвращают детали урожая в масштабе интерфейса
var interfaceSize = { //you will have to work this out
w : ?,
h : ?.
}
Ваш или iginal изображения
var myImage = new Image(); // Assume you know how to load
Так что, когда кнопка кадрирования нажата вы можете создать новое изображение путем масштабирования детали обрезки обратно к исходному размеру изображения, создавая холст на обрезанном размере, рисунок изображения так, чтобы посевная площадь по-разному позиционируется и возвращает холст как есть или как новое изображение.
// image = image to crop
// crop = the current cropping region
// interfaceSize = the size of the full image in the interface
// returns a new cropped image at full res
function myCrop(image,crop,interfaceSize){
var scaleX = image.width/interfaceSize.w; // get x scale
var scaleY = image.height/interfaceSize.h; // get y scale
// get full res crop region. rounding to pixels
var x = Math.round(crop.x * scaleX);
var y = Math.round(crop.y * scaleY);
var w = Math.round(crop.w * scaleX);
var h = Math.round(crop.h * scaleY);
// Assume crop will never pad
// create an drawable image
var croppedImage = document.createElement("canvas");
croppedImage.width = w;
croppedImage.height = h;
var ctx = croppedImage.getContext("2d");
// draw the image offset so the it is correctly cropped
ctx.drawImage(image,-x,-y);
return croppedImage
}
Вы только тогда нужно вызвать эту функцию, когда кнопка кадрирования нажата
var croppedImage;
myButtonElement.onclick = function(){
if(currentCrop !== undefined){ // ensure that there is a selected crop
croppedImage = myCrop(myImage,currentCrop,interfaceSize);
}
}
Вы можете преобразовать изображение в dataURL для загрузки, и загрузить через
imageData = croppedImage.toDataURL(mimeType,quality) // quality is optional and only for "image/jpeg" images
Они все верните исходное разрешение изображений, минус пиксели, обрезанные, поэтому я немного смущен тем, что вы имеете в виду. Не могли бы вы привести пример изображения, показывающий проблему, и образ того, что вы ожидаете от результата, чтобы мы могли видеть, в чем проблема. – Blindman67
Hi Blind! Спасибо за комментарий. Возникла проблема [в Jcrop] (http://deepliquid.com/content/Jcrop.html). Сейчас я использую урожай. Я имел в виду, что обрезанное изображение зависит от размера окна «просмотр изображения».Если у меня большая фотография, скажем 1920x1080px, я хочу обрезать выделенную область, а мое окно «Просмотр изображения» - 40x40 пикселей, я получаю изображение 40x40 пикселей, даже если область будет похожа на, например, 500x500px. Есть ли способ достичь этого 500x500px, имея намного меньший размер предварительного просмотра изображения? – PLAYCUBE