- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这里是 Java 8。尝试坚持使用 BufferedImage API,而不是深入研究 JavaFx 领域。
我有一个宽 768 像素、高 432 像素的 JPG 图像。我想使用 BufferedImage#getSubimage(...)
从其中心裁剪一个居中 400x400 像素的正方形。 .
我有以下代码:
BufferedImage image = ImageIO.read(imageTempFile);
int dim = 400;
int xCropBuffer, yCropBuffer;
xCropBuffer = (image.getWidth() - dim) / 2;
yCropBuffer = (image.getHeight() - dim) / 2;
log.info("width = " + image.getWidth() + ", height = " + image.getHeight() + ", dim = " + dim + ", xCropBuffer = " + xCropBuffer + ", yCropBuffer = " + yCropBuffer);
image = image.getSubimage(xCropBuffer, yCropBuffer + dim, dim, dim);
在运行时这会引发以下异常:
java.awt.image.RasterFormatException: (y + height) is outside of Raster
at sun.awt.image.ByteInterleavedRaster.createWritableChild(ByteInterleavedRaster.java:1248)
at java.awt.image.BufferedImage.getSubimage(BufferedImage.java:1202)
at java_awt_image_BufferedImage$getSubimage.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:149)
at com.myapp.DefaultMediaService.uploadImage(DefaultMediaService.java:56)
at com.myapp.MediaService$uploadImage.call(Unknown Source)
日志在抛出异常之前打印以下消息:
width = 768, height = 432, dim = 400, xCropBuffer = 184, yCropBuffer = 16
所以我传入 image.getSubimage(184, 416, 400, 400)
参数...这应该没问题吧?!图像为 768x432,因此 (184, 416) 应该是其左上角的有效坐标,并且 184 + 400 < 768 和 416 - 400 > 0。因此所有这些参数应映射到图像内的有效 400x400 矩形,对吗?
最佳答案
绘制图像与绘制文本不同,其中上升是从基线到较小的 y 坐标。图像由其左上角指定,并向 x 和 y 的更大坐标延伸。因此,您不应为 y 坐标指定 + dim
。
BufferedImage oldImage = ImageIO.read(imageFile),
newImage = oldImage.getSubimage(
(oldImage.getWidth()-dim)/2, (oldImage.getHeight()-dim)/2, dim, dim);
ImageIO.write(newImage, "png", imageFile);
为了完整起见,由于您之前的问题似乎有些困惑,这里有一些替代方案可以实现相同的图像转换,它可以用作其他图像操作的模板:
通过BufferedImageOp
BufferedImage oldImage = ImageIO.read(imageFile),
newImage = new BufferedImage(dim, dim, oldImage.getType());
BufferedImageOp op = new AffineTransformOp(
AffineTransform.getTranslateInstance(
-(oldImage.getWidth()-dim)/2, -(oldImage.getHeight()-dim)/2),
AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
op.filter(oldImage, newImage);
ImageIO.write(newImage, "png", imageFile);
通过图形
BufferedImage oldImage = ImageIO.read(imageFile),
newImage = new BufferedImage(dim, dim, oldImage.getType());
Graphics2D gfx = newImage.createGraphics();
gfx.drawImage(oldImage,
-(oldImage.getWidth()-dim)/2, -(oldImage.getHeight()-dim)/2, null);
gfx.dispose();
ImageIO.write(newImage, "png", imageFile);
无论哪种情况,通过使目标图像小于原始图像来暗示裁剪到所需的尺寸。然后,源图像只需通过(-x,-y)进行平移即可选择所需的细节矩形。
关于java - BufferedImage getSubimage 抛出异常,参数看似不错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50156861/
这个问题已经有答案了: Java getSubimage() outside of raster (2 个回答) 已关闭 6 年前。 我编写了一小段代码来将 Sprite 表分割成单独的图像.....
我正在尝试从 BufferedImage 中提取图像的一部分。我该怎么做呢?它不允许我为 y 设置大于零的值。 例如: getSubimage(0,0,theImage.getWidth(),theI
我正在尝试拍摄一张图像并将其存储在 16x16 子图像数组中。我使用的图像是 512x512 像素。但是,在循环迭代时,getSubimage() 因 Raster 异常而停止。 这是代码: publ
我正在尝试拍摄图像并将其存储在 16x16 子图像数组中。我使用的图像是 512x512 像素。但是,在遍历循环时,getSubimage() 因 Raster 异常而停止。 代码如下: public
我正在尝试用java制作国际象棋游戏,我从谷歌获得了棋子的图像。现在我想将其剪切为 6*2 图像(黑白图像)。但我不明白这个有什么问题。 public static final String
嗯,我第一次尝试制作图形游戏,但是: BufferedImage tileset = null; try{ tileset = ImageIO.read(new File("sets/tile
你好, 我正在运行以下代码来制作 JPanel 的屏幕截图。 private void makePanelImage(Component panel, String saveAs) { Dim
我正在开发一个“绘图”应用程序。整个“绘图”不断地存储在 BufferedImage 对象中(使用不断的更新循环)。我们称它为 drawingArea。 我正在使用 BufferedImage 类的
这里是 Java 8。尝试坚持使用 BufferedImage API,而不是深入研究 JavaFx 领域。 我有一个宽 768 像素、高 432 像素的 JPG 图像。我想使用 BufferedIm
所以我正在开发一个裁剪图像的组件,它工作正常。 如果图像大于它的父容器(只能是max-width: 100vw),选择一个的div要裁剪的图像部分具有将在 BufferedImage.getSubIm
我实现了一个 GetSubImage 函数来提取图像的一部分。我使用 SetROI、Copy 和 ResetROI。但是,当并行任务使用相同的图像时,这不起作用,因为 SetROI 不可并行化。 还有
我正在开发 Java 2D 渲染程序(在 1.6.0_11 上运行),它使用外部图像进行 UI 渲染。这些大图像同时包含多个 UI 图形部分,我现在使用 BufferedImage.getSubima
我有一张尺寸为 16x6080 的图片。这是一个包含 16x16 部分的国家标志的堆叠图像。我的目标是从此图像中仅提取特定国家/地区的国旗并将其保存为自己的文件。这是我当前的代码
我目前正在尝试拆分图像,遇到了一个告密者,我不知道为什么会这样。 这是我的函数的快速伪代码分解 使用 ImageIO.read(File file) 方法读入图像 使用 getSubimage() 方
我是一名优秀的程序员,十分优秀!