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

OK、わかりました。今それは働いています。あなた(またはここに貼り付けたダウンロード可能なプロジェクトを作成した人)は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());
        }
    }

これは、変更されたvoidmainメソッドです。それは機能します、uは間違ったファイルのより詳細なフィルタリングのためにifステートメントを改良することができます。また、resメソッドに指定された引数を変更しました。getAbsoulutePathが名前とパスを返すため、見栄えが良くなりました。それがどのように機能したか教えてください

于 2012-03-19T23:54:49.940 に答える
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));
    }
}

の呼び出しは、 Scalr.resizeメソッドresize(image, 500)のいずれかに一致するように変更できます。必要に応じて、フィルターを渡すか、品質を向上させることができます。

テストセットアップからの出力例は次のようになります。

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 に答える
0

これをデバッグして、nullを返しsourceImageFileている特定のものを出力する1つの明白な方法。ImageIO.read(..)listFilesは、イメージディレクトリにあるすべてのファイルとディレクトリのリストを提供するためだと思います。listFilesjavadoc。これを防ぐには、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 に答える