提问人:ItsErtHere 提问时间:11/6/2023 最后编辑:ItsErtHere 更新时间:11/6/2023 访问量:42
如何让我的代码正确覆盖我的所有图像组而不会引发 NullPointerException?
How do I get my code to overlay all of my groups of images correctly without throwing a NullPointerException?
问:
我正在叠加多个图像并赋予它们自己的文件名。我将每个底部图像(在名为 bottom 的文件夹中,有 12 张图像)与每个顶部图像(在名为 top 的文件夹中,有 10 张图像)叠加在一起。我的命名过程有效,我的覆盖过程也有效,但是由于某种原因,我的代码只遍历了顶部文件夹中的前 3 个图像,并返回了 NullPointerExeption,同时遍历了所有底部图像。如何让它遍历我的所有图像?
我尝试的代码是:
package images;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
public class overlay_images {
public static void main(String[] args) throws IOException,NullPointerException {
File bottom = new File("C:\\Users\\mymsa\\Documents\\Mathmatical Docs\\Java Math\\images\\all_img\\bottom");
File top = new File("C:\\Users\\mymsa\\Documents\\Mathmatical Docs\\Java Math\\images\\all_img\\top_lantern_blocks");
int x = bottom.listFiles().length;
int y = top.listFiles().length;
BufferedImage[][] imgs = new BufferedImage[x*y][2];
BufferedImage[] newImgs = new BufferedImage[x*y];
String newFileName = "";
for(int n=0;n<x*y;n++) {
imgs[n] = new BufferedImage[] {ImageIO.read(bottom.listFiles()[n%x]),
ImageIO.read(top.listFiles()[n/x])};
newImgs[n] = new BufferedImage(16,16,BufferedImage.TYPE_4BYTE_ABGR);
for(int i=0;i<16;i++) {
for(int j=0;j<16;j++) {
int ptop = ImageIO.read(top.listFiles()[n/x]).getRGB(i,j);
int pbttm = ImageIO.read(bottom.listFiles()[n%x]).getRGB(i,j);
if(ptop/(2^24)==0) {newImgs[n].setRGB(i,j,pbttm);} else {newImgs[n].setRGB(i,j,ptop);}
}
}
newImgs[n].setRGB(8,15,imgs[n%x][0].getRGB(8,15));
newFileName = "C:\\Users\\mymsa\\Documents\\Mathmatical Docs\\Java Math\\images\\all_img\\lantern_blocks\\";
newFileName+= top.listFiles()[n/x].getName().replace(".png","") + "_";
newFileName+= bottom.listFiles()[n%x].getName();
newFileName = newFileName.replace("bulb", "lantern");
newFileName = newFileName.replace("_off", "_block");
ImageIO.write(newImgs[n],"png",new File(newFileName));
}
}
}
VSCode 显示第 21 行导致错误:如何修复此错误?
我只是重做了代码以直接遍历文件而不是通过数字,并且在第 17 行遇到了相同的错误:int ptop = ImageIO.read(top.listFiles()[n/x]).getRGB(i,j);
package images;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
public class overlay_images {
public static void main(String[] args) throws IOException,NullPointerException {
File bottom = new File("C:\\Users\\mymsa\\Documents\\Mathmatical Docs\\Java Math\\images\\all_img\\bottom");
File top = new File("C:\\Users\\mymsa\\Documents\\Mathmatical Docs\\Java Math\\images\\all_img\\top_lantern_blocks");
BufferedImage newImg = new BufferedImage(16,16,BufferedImage.TYPE_4BYTE_ABGR);
String newFileName = "";
for(File m:bottom.listFiles()) {
for(File n:top.listFiles()) {
newImg=new BufferedImage(16,16,BufferedImage.TYPE_4BYTE_ABGR);
for(int i=0;i<16;i++) {
for(int j=0;j<16;j++) {
int ptop = ImageIO.read(n).getRGB(i,j);
int pbttm = ImageIO.read(m).getRGB(i,j);
if(ptop/(2^24)==0) {newImg.setRGB(i,j,pbttm);} else {newImg.setRGB(i,j,ptop);}
}
}
newImg.setRGB(8,15,ImageIO.read(m).getRGB(8,15));
newFileName = "C:\\Users\\mymsa\\Documents\\Mathmatical Docs\\Java Math\\images\\all_img\\lantern_blocks\\";
newFileName+= n.getName().replace(".png","") + "_";
newFileName+= m.getName();
newFileName = newFileName.replace("bulb", "lantern");
newFileName = newFileName.replace("_off", "_block");
ImageIO.write(newImg,"png",new File(newFileName));
}
}
}
}
答: 暂无答案
评论