#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();
}
}
}
Я рад, что вы разобрались с этим 😉
Приветствия. Кит.