2015-12-31 3 views
0

Так что я работаю над компонентом, который обрезает изображения, и он отлично работает.Изменение размера изображения с использованием 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; 
    } 
+0

Ваш вопрос выглядит п что-то большее, чем основная математическая проблема. Пожалуйста, закиньте свой код до того, что будет показано, где и как вы делаете расчеты. Не видя, что вы делаете, будет трудно понять, что вы можете делать неправильно. Также есть эта Java или JavaScript? И ты уверен? –

+0

@HovercraftFullOfEels, вопрос с пометкой. –

+0

Каковы начальные значения полей x, y, width, height? Каковы эти значения после умножения ширины и высоты би? Что такое размерность би? – daniel

ответ

0

Эта проблема неразрешима, как вы ставите его:

, если W - ширина реального изображения и w на отображаемом изображении вы хотите вычислить смещение X на реальное изображение в то время как у вас есть х смещенные в отображаемом изображении

вы могли бы сделать X = (W/W) * х

но поскольку ш отсутствует оно не может быть вычислен

если вы можете сделать снимок экрана изображения, отображаемого на веб-странице, то у вас есть ш -

это мое понимание того, что вы говорите

-

его простая задача математики

, если вы знаете, ш из JavaScript

то коэффициент доля W/вес

а не делать

х * = bi.getWidth();

Вы делаете

x * = bi.GetWidth()/вес;

и так далее для у

этот новый х Х урожай смещение на реальном изображении (в архиве)

попробовать и посмотреть, если он дает правильный результат

так вы есть

x *= bi.getWidth()/w; 
y *= bi.getHeight()/h; 
width *= bi.getWidth()/w; 
height *= bi.getHeight()/h; 

ш и ч то, что вы получаете от JavaScript

+0

Я могу получить размеры для обоих изображений, которые отображаются на веб-странице через javascript и оригинал с bufferedImage.getWidth/height. Не могли бы вы рассказать? Я не уверен, что понимаю ваш ответ. –

+0

Я попробовал это в соответствии с вашим aswer, но она по-прежнему оказывает другую область: 'х = (bi.getWidth()/imgWidth) * х;' ' у = (bi.getHeight()/imgHeight) * у ; ' ' width = (bi.getWidth()/imgWidth) * x; ' ' height = (bi.getHeight()/imgHeight) * y; ' ' BufferedImage bi2 = bi.getSubimage (x, y, width, height); ' –

+0

- imgWidth, что пользователь просматривает? или javascritp выбирает то, что должно отображаться? – gpasch