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

Javascript 使用BuffereImage.getSubImage()调整图像大小,javascript,java,jquery,html,css,Javascript,Java,Jquery,Html,Css,所以我正在研究一个可以裁剪图像的组件,它工作得很好 如果图像大于其父容器(只能是最大宽度:100vw),则选择要剪切的图像部分的div具有x,y,width,height,将在BufferedImage.getSubImage(x,y,width,height)中使用 问题:发生这种情况时,x,y,width,height将相对于渲染的大小调整后的图像而不是真实图像,因此当传递到getSubImage方法时,所选图像的部分将不相同,这会导致图像的不同部分被裁剪 我尝试使用比例方法来计算每个调整大

所以我正在研究一个可以裁剪图像的组件,它工作得很好

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

问题:发生这种情况时,
x,y,width,height
将相对于渲染的大小调整后的图像不是真实图像,因此当传递到
getSubImage
方法时,所选图像的部分将不相同,这会导致图像的不同部分被裁剪

我尝试使用比例方法来计算每个调整大小的图像的
像素
,但这会导致太多的异常,具体取决于选择的区域

有什么想法吗?谢谢

顺便说一句,真正的代码没有发布,因为它相当长,并且与
JSF
一起使用,我知道这与问题无关

代码:

单击“确定”按钮后,所有内容归结为:

 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;
    }

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

如果W是真实图像的宽度 和w显示的图像 要计算真实图像的偏移量X 当您在显示的图像中具有x偏移时

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

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

如果您可以对网页上显示的图像进行屏幕截图,则您有:

这就是我对你所说的理解

--

这是一个简单的数学问题

如果您从javascript中了解w

那么比例因子是W/W

而不是做

x*=bi.getWidth()

是吗

x*=bi.getWidth()/w

等等

这个新的x是实际图像(在文件中)的裁剪偏移量的x

试着看看它是否给了你正确的结果

你有吗

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

w和h是从javascript中得到的

你的问题看起来只不过是一个基本的数学问题。请将您的代码归结为显示您在何处以及如何进行计算的要点。如果看不到你在做什么,就很难知道你可能做错了什么。这也是Java还是JavaScript?你确定吗?@HovercraftFullOfEels,问题eddited。x,y,width,height字段的初始值是多少?将bi的宽度和高度相乘后,这些值是多少?bi的尺寸是多少?@daniel,这取决于图像。举个例子就好了。否则,这只是猜测。只需将这些值记录在一个示例图像上,我就可以得到这两个图像的尺寸,一个是通过javascript显示在网页上的,另一个是原始的BuffereImage.getWidth/height。你能详细说明一下吗?我不确定我是否理解你的答案。我根据你的回答尝试了这一点,但它仍然呈现了一个不同的区域:
x=(bi.getWidth()/imgWidth)*x
y=(bi.getHeight()/imghight)*y
width=(bi.getWidth()/imgWidth)*x
height=(bi.getHeight()/imghight)*y
BufferedImage bi2=bi.getSubimage(x,y,宽度,高度)imgWidth是用户查看的内容吗?或者javascritp正在选择应该显示的内容?好的,我看到一个错误宽度=(bi.getWidth()/imgWidth)*x应该是宽度=(bi.getWidth()/imgWidth)*width