使用BufferedImage.getSubImage()调整图像大小

时间:2015-12-31 16:29:51

标签: javascript java jquery html css

所以我正在研究一个可以裁剪图像的组件,它运行正常。

如果图片大于其父容器(只能是max-width: 100vw),则选择要裁剪的部分图片的div具有将x,y,width,height中使用的BufferedImage.getSubImage(x,y,width,height)

问题:当发生这种情况时,x,y,width,height将相对于已调整大小的图像呈现,但将不是真实图像,因此当传递给getSubImage方法时,所选图像的部分将不相同,这会导致图像的不同部分为cropped

我尝试使用比例方式来计算pixels per resized image,但这会导致太多例外,具体取决于已选择的区域。

有什么想法吗?感谢。

顺便说一句,实际代码没有发布,因为它很长并且正在与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;
    }

1 个答案:

答案 0 :(得分:0)

当你摆出这个问题时,这个问题是无法解决的:

如果W是真实图像的宽度 和w显示的图像 你想计算真实图像的偏移X. 你在显示的图像中有x偏移

你可以做X =(W / w)* x

但由于缺少w,因此无法计算

如果您可以拍摄网页上显示的图像的屏幕截图,那么您有w -

这是我对你说的话的理解

-

这是一个简单的数学问题

如果你从javascript知道w

那么比例因子是W / w

而不是

x * = bi.getWidth();

你做了

x * = bi.getWidth()/ w;

依此类推y

这个新的x是X在真实图像上的裁剪偏移(在文件上)

尝试看看它是否能为您提供正确的结果

所以你有

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

w和h是你从javascript获得的