2

此代码尝试调整名为“imgs”的目录中的图像大小。不幸的是,由于某种原因,当我取消注释时 listFiles(..) 循环ImageIO.read(sourceImageFile)将返回 null。然而,在循环 ( res("imgs/foto_3.jpg")) 之外直接处理相同的文件是可行的。显然,这个循环阻止了文件被读取。解决方案?

import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import static org.imgscalr.Scalr.*;

public class App {

    public static void main(String[] args) throws IOException {
//        for (File sourceImageFile : new File("imgs").listFiles()) {
//            res("imgs/"+sourceImageFile.getName());
//        }
        res("imgs/foto_3.jpg");

    }

    public static void res(String arg) throws IOException {

        File sourceImageFile = new File(arg);
        BufferedImage img = ImageIO.read(sourceImageFile);

        BufferedImage thumbnail = resize(img, 500);

        thumbnail.createGraphics().drawImage(thumbnail, 0, 0, null);
        ImageIO.write(thumbnail, "jpg", new File("resized/" + sourceImageFile.getName()));
    }
}

在此处输入图像描述

要重现该问题,您可以下载 Maven 项目

4

5 回答 5

2

你能改变res接受一个File对象而不是一个字符串吗?然后您可以编写以下内容,这样会更好:

for (File sourceImageFile : new File("imgs").listFiles()) {
    res(sourceImageFile);
}

至于您最初的问题,请尝试添加一些跟踪语句或使用调试器来查找确切传递给res.

于 2012-03-19T23:48:06.777 回答
2

我不确定为什么文件列表迭代会干扰缩略图生成,但你私下向我提到你正在使用imgscalr并且很好奇批处理目录的正确代码是什么样的,所以我写了这个例子给你的代码。

下面的代码将处理任何目录(imgs硬编码以与您的示例代码保持一致)并将其写入任何其他目录(resized用于保持一致——随意更改任一目录)

import static org.imgscalr.Scalr.*;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class ScaleDirExample {
    public static void main(String[] args) throws IOException {
        File[] images = new File("imgs").listFiles();

        for (File f : images) {
            System.out.println("Processing: " + f.getName() + "...");

            if (f.isDirectory()) {
                System.out.println("\tSkipping, file is a directory...");
                continue;
            } else
                process(f);
        }
    }

    private static void process(File file) throws IOException {
        // Load image.
        BufferedImage image = ImageIO.read(file);

        // Resize image.
        image = resize(image, 500);

        // Save the resized image as the thumbnail.
        saveThumbnail(file, image);
    }

    private static void saveThumbnail(File originalFile, BufferedImage thumbnail)
            throws IOException {
        String filename = originalFile.getName();

        // Determine file extension.
        String fileExt = filename.substring(filename.lastIndexOf('.') + 1);

        // Save the thumbnail to the resized dir.
        ImageIO.write(thumbnail, fileExt, new File("resized/" + filename));
    }
}

resize(image, 500)可以修改调用以匹配任何Scalr.resize 方法- 如果需要,您可以通过过滤器或提高质量。

我的测试设置的示例输出如下所示:

Processing: flower-dog-gimp.jpg...
Processing: flower-dog.jpg...
Processing: logoOXdaComida.png...
Processing: mr-t-thumbnail.jpg...
Processing: mr-t.jpg...
Processing: problem-trans-peter-griffin.png...

希望有帮助!

于 2012-03-20T14:43:25.833 回答
2

好的,我想通了。现在它正在工作。您(或创建您在此处粘贴的可下载项目的任何人)正在使用 Mac OS,它会自动创建一个 .DS_Store 文件。当您尝试将其传递给 res 方法时,它不知道如何处理非图像文件并充当 null。

   public static void main(String[] args) throws IOException {
        for (File sourceImageFile : new File("imgs").listFiles()) {
            if (sourceImageFile.getName().endsWith(".jpg"))
                res(sourceImageFile.getAbsolutePath());
        }
    }

这是修改后的 void main 方法。它有效,您可以改进 if 语句以更深入地过滤错误文件。我还更改了 res 方法的参数。现在看起来好多了,因为 getAbsoulutePath 返回名称和路径。让我知道它是如何工作的

于 2012-03-19T23:54:49.940 回答
0

一种明显的调试方法是输出返回 null的特定sourceImageFile内容。ImageIO.read(..)我怀疑它是因为 listFiles 将为您提供图像目录中所有文件和目录的列表。列表文件 javadoc。您可以通过使用确保 listFiles 仅返回正确类型的文件和附加文件的 FileFilter 来防止这种情况。

仅返回文件的文件过滤器示例如下:

import java.io.FileFilter
class RegularFilesOnlyFileFilter implements FileFilter {
   public boolean accept(File pathName) {
       return pathName.isFile();
   }
}

使用这个过滤器的方法是这样的——new File("imgs").listFiles(new RegularFilesOnlyFilesFilter())

于 2012-03-19T23:55:34.637 回答
-1

我改变了 res 方法:

public static void res(File arg) throws IOException {
        if (arg.contains(".DS_Store")) {
            return;
        }

一个mac问题(或者应该过滤非图像文件,如建议的那样)!

于 2012-03-20T15:39:03.887 回答