所以我正在研究一个可以裁剪图像的组件,它运行正常。
如果图片大于其父容器(只能是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;
}
答案 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获得的