Проблема с сохранением изображений в папке

#java #image-processing #file-io

#java #обработка изображений #file-io

Вопрос:

Я разрабатываю приложение, в котором мне нужно сохранить эскизы изображения в папке внутри папки, в которой находятся изображения. Папка с изображениями выбирается с помощью средства выбора файлов.

У меня возникла проблема с сохранением эскизов. В сообщении об ошибке скорее указано исключение «файл не найден».

Код, который я написал, является :

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

import java.io.IOException;
import javax.imageio.ImageIO;

public class ThumbnailFactory {

    public ThumbnailFactory() {
    }

    public void run(String folder) {
        savepath = folder "\thumbnails";
        File dir = new File(folder);
        for (File file : dir.listFiles()) {
            createThumbnail(file);
        }
    }

    private void createThumbnail(File file) {
        try {
            // BufferedImage is the best (Toolkit images are less flexible)
            BufferedImage img = ImageIO.read(file);
            BufferedImage thumb = createEmptyThumbnail();

            // BufferedImage has a Graphics2D
            Graphics2D g2d = (Graphics2D) thumb.getGraphics();
            g2d.drawImage(img, 0, 0,
                    thumb.getWidth() - 1,
                    thumb.getHeight() - 1,
                    0, 0,
                    img.getWidth() - 1,
                    img.getHeight() - 1,
                    null);
            g2d.dispose();
            ImageIO.write(thumb, "PNG", createOutputFile(file));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private File createOutputFile(File inputFile) throws IOException {
       System.out.println(savepath "\" inputFile.getName());
       File f =  new File(savepath "\" inputFile.getName() ".png");
       if(!f.exists())
       {
           System.out.println("Creating the file in thumbnail directory");
           f.createNewFile();
       }
       return new File(savepath "\" inputFile.getName() ".png") ;
    }

    private BufferedImage createEmptyThumbnail() {
        return new BufferedImage(100, 200,
                BufferedImage.TYPE_INT_RGB);
    }
    private String savepath;
}
  

Это выдает FileNotFoundException , NullPointerException в createOutputFile() методе, в f.createNewFile() точке .

Входным файлом является изображение в выбранной папке. Я должен поместить миниатюру этого изображения в папку, созданную внутри выбранной папки.

Например, выбрана папка с изображениями, D:pictures затем мне нужно поместить миниатюру каждого изображения внутри D:pictures в D:picturesthumbnails .

пожалуйста, укажите на ошибку, которую я делаю, и как ее исправить.

Комментарии:

1. .thumbnails Каталог уже существует? Я не вижу, где вы это создаете (как я и ожидал).

2. Кроме того, вам никогда не нужно ЯВНО ничего удалять.

3. @corlettk — Я предполагаю, что у него есть, поскольку он говорит, что исключение находится в createOutputFile

4. В этом случае у меня возникнет соблазн (по крайней мере, попытаться) повторно использовать thumb и это g2d вместо того, чтобы создавать «тяжелый» мусор для КАЖДОГО изображения, которое я обрабатываю. Просто мысль … игнорируйте меня, если это достаточно быстро для ваших вариантов использования.

5. @corlettk : Каталог эскизов создается до передачи управления этому файлу

Ответ №1:

Вместо того, чтобы писать весь этот код самостоятельно, вы могли бы рассмотреть возможность использования библиотеки Thumbnailator. Весь ваш пример можно записать в следующих нескольких строках, что намного лучше выражает ваши намерения.

 public class ThumbnailFactory {

    public void run(String folder) {
        Thumbnails.of(new File(folder "\thumbnails").listFiles())
            .size(100,200)
            .outputFormat("png")
            .asFiles(Rename.SUFFIX_HYPTHEN_THUMBNAIL);
    }
}
  

Комментарии:

1. Полагаю, мне следовало подумать о поиске существующей библиотеки, которая «делает это правильно» 😉 Спасибо рыбе.

Ответ №2:

Я хотел поиграть с окончательным статическим ЭСКИЗОМ и G2D… Это не сработало, но это работает, если вы можете смириться с несоразмерными результатами придания всем изображениям одинакового размера и, следовательно, формы, независимо от их исходных размеров 😉

 package forums;

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;

public class ThumbnailFactory
{
  private static final String THUMBNAILS_SUBDIR_NAME = File.separator   "thumbnails";

  private final File _thumbsSubdir;
  private final File _picsDir;

  public ThumbnailFactory(String picsDirectoryPath) {
    _picsDir = new File(picsDirectoryPath);
    _thumbsSubdir = new File(thumbDirectoryPath(_picsDir));
  }

  private static String thumbDirectoryPath(File picsDir) {
    return picsDir.getAbsolutePath() THUMBNAILS_SUBDIR_NAME;
  }

  public void createThumbnails() throws IOException {
    if (!_thumbsSubdir.exists()) {
      _thumbsSubdir.mkdir();
    }
    for (File picFile : _picsDir.listFiles(
      new FilenameFilter() {
        public boolean accept(File f, String s) {
          return s.toLowerCase().endsWith(".jpg");
        }
      }
    )) {
      if ( !createThumbnail(picFile, new File(thumbFilename(picFile))) )
        break;
    }
  }

  private String thumbFilename(File pictureFile) {
    return _thumbsSubdir.getAbsolutePath()
             File.separator 
             pictureFile.getName()
             ".png";
  }

  private boolean createThumbnail(File pictureFile, File thumbFile)
    throws IOException
  {
    boolean retval = false;
    BufferedImage image = new BufferedImage(100, 200, BufferedImage.TYPE_INT_RGB);
    Graphics2D g2d = (Graphics2D) image.getGraphics();
    BufferedImage picture = ImageIO.read(pictureFile);
    if (picture!=null) {
      g2d.drawImage(
          picture
        , 0, 0, image.getWidth()-1, image.getHeight()-1
        , 0, 0, picture.getWidth()-1, picture.getHeight()-1
        , null
      );
      retval = ImageIO.write(image, "PNG", thumbFile);
      System.out.println(thumbFile);
    }
    return retval;
  }

  public static void main(String... args) {
    try {
      ThumbnailFactory factory = new ThumbnailFactory("C:/Users/Administrator/Pictures");
      factory.createThumbnails();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
  

Я рад, что вы разобрались с этим 😉

Приветствия. Кит.