- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试拍摄一张图像并将其存储在 16x16 子图像数组中。我使用的图像是 512x512 像素。但是,在循环迭代时,getSubimage() 因 Raster 异常而停止。
这是代码:
public class TileList extends JPanel {
private static final int width = 16; //width of a tile
private static final int height = width;
private int col = 1;
private int row = 1;
private BufferedImage image;
File tilesetImage = new File("image.png");
BufferedImage tileset[];
public void loadAndSplitImage (File loadImage) {
try{
image = ImageIO.read(loadImage);
}catch(Exception error) {
System.out.println("Error: cannot read tileset image.");
}// end try/catch
col = image.getWidth()/width;
row = image.getHeight()/height;
tileset = new BufferedImage[col*row];
}// end loadAndSplitImage
public TileList() {
loadAndSplitImage(tilesetImage);
setLayout(new GridLayout(row,col,1,1));
setBackground(Color.black);
int x=0;
int y=0;
int q=0; //keeps track of tile #
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
JPanel panel = new JPanel();
tileset[q] = new BufferedImage(width, height, image.getType());
tileset[q] = image.getSubimage(x,y,x + width,y + height);
panel.add(new JLabel(new ImageIcon(tileset[q])));
add(panel);
x += width;
q++;
}// end for loop
y += height;
x = 0;
}// end for loop
}// end constructor
}// end class
这是错误:
Exception in thread "AWT-EventQueue-0" java.awt.image.RasterFormatException: (x
+ width) is outside of Raster
at sun.awt.image.ByteInterleavedRaster.createWritableChild(ByteInterleav
edRaster.java:1245)
at java.awt.image.BufferedImage.getSubimage(BufferedImage.java:1173)
at TileList.<init>(TileList.java:59)
at TileList.createAndShowGui(TileList.java:79)
at TileList$1.run(TileList.java:88)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDo
main.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
ad.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
最佳答案
您向 getSubimage
传递了错误的参数。文档说...
Parameters:
x - the X coordinate of the upper-left corner of the specified rectangular region
y - the Y coordinate of the upper-left corner of the specified rectangular region
w - the width of the specified rectangular region
h - the height of the specified rectangular region
您传入的是 x, y, x + width, y + width
,这意味着如果 x
= 256,width
实际上等于 256 + 16 = 272
。
所以你的新图像将是...x + width = 256 + 272 = 528
,它比你的图像区域更宽。
您应该传递x、y、宽度、高度
tileset[q] = image.getSubimage(x, y, width, height);
关于光栅之外的 Java getSubimage(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54613196/
这个问题已经有答案了: 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() 方
我是一名优秀的程序员,十分优秀!