如何从多个较小的图像构建图像
How do I build an Image from multiple smaller Images
所以我正在制作这个 adventure/progression 游戏,对于字体,我使用了 spriteSheet 中的图块(每个图块都是一个字母),我将用于许多不同的目的,但我无法弄清楚为什么我的程序是 returning 一个黑色图像,而不是一个由较小图像(每个包含一个字母)构建的图像。该程序在我 return scaledImage 图像但只有 return 一个字母时工作。应该发生的是我将单词分成一个字母并使用 BufferedImage 和 Graphics2D 从 spriteSheet 中获取匹配的字母,那部分有效,但是当我将它绘制到缓冲图像时,它 return 是一个黑色图像。
BufferedImage spriteSheet;
String[] alphabet = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
"t", "u", "v", "w", "x", "y", "z", " " };
public ImageIcon getWord(String word, int x, int size) throws IOException {
String tempLetter;
try {
spriteSheet = ImageIO.read(new File("img/SpriteSheet.png"));
} catch (IOException e) {
e.printStackTrace();
}
Image testImage = null;
BufferedImage bi = new BufferedImage(size * word.length(), size, BufferedImage.TYPE_INT_RGB);
Graphics2D wordImage = bi.createGraphics();
Image subImage;
Image scaledImage;
for (int l = 0; l < word.length(); l++) {
tempLetter = word.substring(l, l + 1);
for (int i = 0; i < alphabet.length; i++) {
if (tempLetter.equalsIgnoreCase(alphabet[i])) {
subImage = spriteSheet.getSubimage(2 + (2 * i) + (i * 200), 2, 200, 200);
scaledImage = subImage.getScaledInstance(size, size, Image.SCALE_DEFAULT);
wordImage.drawImage(scaledImage, l*size, 0, null);
testImage = scaledImage;
} else {
continue;
}
}
}
wordImage.dispose();
File wordFile = new File("img/word.png");
ImageIO.write(bi, "png", wordFile);
ImageIcon ic = new ImageIcon("img/word.png");
wordFile.delete();
return ic;
}
我是这样调用方法的:
JButton play = new JButton();
play.setBounds(300, 300, 600, 150);
play.setIcon(sc.getWord("play", 600, 150));
p.add(play);
f.add(p);
经过一段时间的研究,我发现字母不显示的原因是因为它们是黑色的,而且 BufferedImage 的背景也是黑色的。所以这些字母显示出来了,但由于背景而“看不见”。
所以我正在制作这个 adventure/progression 游戏,对于字体,我使用了 spriteSheet 中的图块(每个图块都是一个字母),我将用于许多不同的目的,但我无法弄清楚为什么我的程序是 returning 一个黑色图像,而不是一个由较小图像(每个包含一个字母)构建的图像。该程序在我 return scaledImage 图像但只有 return 一个字母时工作。应该发生的是我将单词分成一个字母并使用 BufferedImage 和 Graphics2D 从 spriteSheet 中获取匹配的字母,那部分有效,但是当我将它绘制到缓冲图像时,它 return 是一个黑色图像。
BufferedImage spriteSheet;
String[] alphabet = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
"t", "u", "v", "w", "x", "y", "z", " " };
public ImageIcon getWord(String word, int x, int size) throws IOException {
String tempLetter;
try {
spriteSheet = ImageIO.read(new File("img/SpriteSheet.png"));
} catch (IOException e) {
e.printStackTrace();
}
Image testImage = null;
BufferedImage bi = new BufferedImage(size * word.length(), size, BufferedImage.TYPE_INT_RGB);
Graphics2D wordImage = bi.createGraphics();
Image subImage;
Image scaledImage;
for (int l = 0; l < word.length(); l++) {
tempLetter = word.substring(l, l + 1);
for (int i = 0; i < alphabet.length; i++) {
if (tempLetter.equalsIgnoreCase(alphabet[i])) {
subImage = spriteSheet.getSubimage(2 + (2 * i) + (i * 200), 2, 200, 200);
scaledImage = subImage.getScaledInstance(size, size, Image.SCALE_DEFAULT);
wordImage.drawImage(scaledImage, l*size, 0, null);
testImage = scaledImage;
} else {
continue;
}
}
}
wordImage.dispose();
File wordFile = new File("img/word.png");
ImageIO.write(bi, "png", wordFile);
ImageIcon ic = new ImageIcon("img/word.png");
wordFile.delete();
return ic;
}
我是这样调用方法的:
JButton play = new JButton();
play.setBounds(300, 300, 600, 150);
play.setIcon(sc.getWord("play", 600, 150));
p.add(play);
f.add(p);
经过一段时间的研究,我发现字母不显示的原因是因为它们是黑色的,而且 BufferedImage 的背景也是黑色的。所以这些字母显示出来了,但由于背景而“看不见”。