【问题标题】:How to load all images from folder? (Processing, Java)如何从文件夹中加载所有图像? (处理,Java)
【发布时间】:2018-05-07 15:41:56
【问题描述】:

请帮助我。我想在不知道数据名的情况下将多个图像加载到这个处理草图中。这样我就可以随时将.png 图像放入数据文件夹,程序会自动将它们加载进去。我在一些论坛中搜索过,但除了一些我已经使用过的代码外,没有找到任何东西,但它没有运行正常。

程序一开始它会给我一个NullPointerExceptionimage();

这是控制台输出:

4096
D:\Program Files\processing-3.3.7\PROJECTS\Blendertutorial\data
[0] "1.png"
[1] "2.png"
[2] "3.png"
[3] "4.png"
[4] "5.png"
[5] "6.png"
[6] "7.png"

另外为什么folder.list(); 输出这么大的数字?我那里只有 7 张图片...

import java.io.File;
String fileExtension = ".png";

java.io.File folder = new java.io.File(sketchPath("/PROJECTS/Blendertutorial/data"));
java.io.FilenameFilter extfilter = new java.io.FilenameFilter() {
  boolean accept(File dir, String name) {
    return name.toLowerCase().endsWith(fileExtension);
  }
};

PImage images;
String[] imageNames;
int i=0;
long folderInhalt = folder.length();

void setup(){
  size(500,500);
  println(folder.length());
  println(folder);
  printArray(imageNames);

  imageNames = folder.list(extfilter);
}

void draw(){
  if(mousePressed){
    images = loadImage(folder+"/"+imageNames[0]);
    println(images);
    println(imageNames[i]);
    delay(200);
    i++;
  }
  image(images,0,0);      //NULL POINTER EXCEPTION!
}

【问题讨论】:

  • 与您的问题没有直接关系,但您不应该像这样在draw() 函数中加载图像。而是从 setup() 函数加载它们。否则,您将每秒加载 60 次图像,这将导致您的计算机着火。
  • 谢谢。我只在这个例子中这样做是因为我调用了 delay() 并且因为我不希望它在需要时“预加载”bu load。
  • 问题是鼠标会被按下超过一帧,所以你不断地重新加载图像。至少你应该缓存你的图片,这样你就不会多次重新加载它们,但很可能你应该在设置过程中将它们全部加载。

标签: java image processing loadimage


【解决方案1】:

当调用 draw() 但 mousePressed 为 false 时,代码中会发生什么情况?

考虑你的代码:

PImage images;
...
...
...

void draw(){
  if(mousePressed){
    images = loadImage(folder+"/"+imageNames[0]);
    println(images);
    println(imageNames[i]);
    delay(200);
    i++;
  }
  image(images,0,0);      //NULL POINTER EXCEPTION!
}

您已声明images,但尚未实例化它。

对于mousePressed==falseimages 将保持为空。

这种行为可以解释您的NullPointerException - 您正在调用带有空值参数的image 方法。

【讨论】:

    【解决方案2】:

    为什么是 folder.list();输出这么大的数字?我那里只有 7 张图片...

    你没有打电话给folder.list()。你打电话给folder.length()。此函数返回文件的大小,文件夹未定义。更多信息可以在the Java API找到。

    此外,这与您的问题没有直接关系,但您不应该像这样在 draw() 函数中加载图像。而是从 setup() 函数加载它们。否则,您将每秒加载 60 次图像,这将导致您的计算机着火。

    将您的加载移动到setup() 也将解决您的NullPointerException 问题,因为在未按下鼠标时您将不再绘制空图像。

    【讨论】:

    • 嘿,但我只能把加载放到 setup() 中,其余的仍然必须进入 draw(),因为我希望它在鼠标点击时更新
    • @OliverTworkowski 没关系。您应该将您的加载放入setup() 并将鼠标单击代码放入draw()
    【解决方案3】:

    我有这个,它似乎可以工作(基于文件选择示例)

    void fileSelected(File selection) {
    if (selection == null) {
    println("Window was closed or the user hit cancel.");
    } else {
    println("User selected " + selection.getAbsolutePath());
    img = loadImage(selection.getAbsolutePath());
    }
    }
    

    【讨论】:

      【解决方案4】:
      public void readImagesPath(String dir){
         File folder = new File(dir);
         File[] listOfFiles = folder.listFiles();
      
          for (File file : listOfFiles) {
            if (file.isFile()) {
               System.out.println(file.getName());
            }
          }
       }
      

      使用此代码,您可以检索图像路径,然后可以加载和绘制它们。

      【讨论】:

        猜你喜欢
        • 2016-05-28
        • 2012-06-24
        • 1970-01-01
        • 1970-01-01
        • 2011-12-09
        • 1970-01-01
        • 2017-12-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多