Так что я работаю над компонентом, который обрезает изображения, и он отлично работает.Изменение размера изображения с использованием BufferedImage.getSubImage()
Если изображение больше, чем его родительский контейнер (который может быть только max-width: 100vw
), то div
, который выбирает часть изображения, которое будет обрезано, имеет x,y,width,height
, которая будет использоваться в BufferedImage.getSubImage(x,y,width,height)
.
Проблема: Когда это произойдет, то x,y,width,height
будет относительно уменьшенное изображение оказывается но не к реальному изображению, таким образом, часть изображения, выбранного не будет тем же самым, когда передается к getSubImage
, и это приводит к тому, что другая часть изображения будет cropped
.
Я попытался использовать пропорции для вычисления pixels per resized image
, но это вызывает слишком много исключений в зависимости от области, в которой выбрана функция ben.
Любые идеи? Благодарю.
BTW настоящий код не размещен, потому что он довольно длинный и используется с JSF
, и я знаю, что это не имеет отношения к проблеме.
Код:
Here's an image showing the component working
При нажатии кнопки ОК нажата все это сводится к следующему:
public String processImage() {
ByteArrayInputStream bais = new ByteArrayInputStream(completeImg);
HttpSession ses = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
ImageContainer curIc = (ImageContainer) ses.getAttribute("ic");
try {
BufferedImage bi = ImageIO.read(bais);
// all values showld be calculated now in relation
// to the real images's dimensions.
x *= bi.getWidth();
y *= bi.getHeight();
width *= bi.getWidth();
height *= bi.getHeight();
BufferedImage bi2 = bi.getSubimage(x, y, width, height);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bi2, "jpg", baos);
croppedImg = baos.toByteArray();
curIc.setCroppedImageContent(croppedImg);
} catch (IOException ex) {
FacesContext.getCurrentInstance().addMessage("msgs",
new FacesMessage(FacesMessage.SEVERITY_FATAL, "ioexception", "error processing image"));
}
return null;
}
Ваш вопрос выглядит п что-то большее, чем основная математическая проблема. Пожалуйста, закиньте свой код до того, что будет показано, где и как вы делаете расчеты. Не видя, что вы делаете, будет трудно понять, что вы можете делать неправильно. Также есть эта Java или JavaScript? И ты уверен? –
@HovercraftFullOfEels, вопрос с пометкой. –
Каковы начальные значения полей x, y, width, height? Каковы эти значения после умножения ширины и высоты би? Что такое размерность би? – daniel