Как обрезать все изображения в 1 папке?

#java

Вопрос:

У меня есть проект, в котором мне нужно обрезать все изображения в моей папке. До сих пор он обрезает и стирает лишнее пустое пространство вокруг него, однако мне нужно указать точное имя файла в пути к файлу. Я прикрепил код ниже, чтобы показать вам, что делает мой код. Короче говоря, мне нужна помощь в том, чтобы мой код обрезал целую папку изображений вместо всего 1. А затем автоматически сохранит обрезанное изображение в другой папке. Спасибо.

 import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException;  public class code {  private BufferedImage img;  public static void main(String[] args) throws IOException {  code trim = new code(new File("D:\eclipse-java-workspace\image_manipulation\sample_input_images\DP936BA.jpg"));  System.out.println("Starting first image..");  trim.trim();  trim.write(new File("D:\eclipse-java-workspace\image_manipulation\sample_out_images\output5.jpg"));    }    public code(File input) {  try {  img = ImageIO.read(input);  } catch (IOException e) {  throw new RuntimeException( "Problem reading image", e );  }  }   public void trim()  {  System.out.println(getTrimmedHeight2());  BufferedImage img2 = img.getSubimage(getTrimmedWidth2(), getTrimmedHeight2(), getTrimmedWidth()-getTrimmedWidth2(), getTrimmedHeight()-getTrimmedHeight2());  BufferedImage copyOfImage = new BufferedImage(img2.getWidth(), img2.getHeight(), BufferedImage.TYPE_INT_RGB);  Graphics g = copyOfImage.createGraphics();  g.drawImage(img2, 0, 0, null);   img = copyOfImage;  }  private int getTrimmedWidth2() {  int height = this.img.getHeight();  int width = this.img.getWidth();  int lowest = 99999;   for(int i = 0; i lt; height; i  ) {  for(int j = 0; j lt; width-1; j  ) {  if(img.getRGB(j, i) != Color.WHITE.getRGB() ) {    if(jlt;lowest)  {   lowest = j;  }   break;  }  }  }  return lowest;  }  public void write(File f) {  try {  ImageIO.write(img, "jpg", f);  } catch (IOException e) {  throw new RuntimeException( "Problem writing image", e );  }  }   private int getTrimmedWidth() {  int height = this.img.getHeight();  int width = this.img.getWidth();  int trimmedWidth = 0;   for(int i = 0; i lt; height; i  ) {  for(int j = width - 1; j gt;= 0; j--) {  if(img.getRGB(j, i) != Color.WHITE.getRGB() amp;amp;  j gt; trimmedWidth) {  trimmedWidth = j;  break;  }  }  }   return trimmedWidth ;   }   private int getTrimmedHeight() {  int width = this.img.getWidth();  int height = this.img.getHeight();  int trimmedHeight = 0;   for(int i = 0; i lt; width; i  ) {  for(int j = height - 1; j gt;= 0; j--) {  if(img.getRGB(i, j) != Color.WHITE.getRGB() amp;amp;  j gt; trimmedHeight) {  trimmedHeight = j;  break;  }  }  }  return trimmedHeight;  }   private int getTrimmedHeight2() {  int width = this.img.getWidth();  int height = this.img.getHeight();  int lowest = 99999;   for(int i = 0; i lt; width; i  ) {  for(int j = 0; j lt; height-1; j  ) {  if(img.getRGB(i, j) != Color.WHITE.getRGB() ) {   if(jlt;lowest)  {  System.out.println(j);  lowest = j;  }   break;  }  }  }  return lowest;  }   }  

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

1. Сначала получите список файлов File[] fileList = directory.listFiles() , затем используйте цикл, чтобы просмотреть список, создать code объект для каждого файла и обрезать его for (int i = 0; i lt; fileList.length; i ) {code trim = new code(fileList[i]); trim.trim(); trim.write(...yourNewPath);} Вы также должны проверить, что файлы в fileList каталогах не являются, и что они являются изображениями, прежде чем пытаться их обрезать, в противном случае у вас возникнут ошибки.

2. значит, мне придется перечислить все файлы? Потому что папка состоит из сотен изображений. Извините, я только начал изучать java 3 недели назад.

3. Нет, вы не перечисляете ни одного из них. Вам нужно только указать путь к папке, после чего вы сможете получить список всех файлов примерно так File[] fileList = new File("D:/your/directory/path/).listFiles();

4. Куда именно ведет эта строка кода? Мне действительно тяжело с этим справляться. Спасибо, что помогли мне

Ответ №1:

Вы можете сделать это , используя путь к папке, чтобы получить список файлов File[] fileList = directory.listFiles() , затем используйте цикл, чтобы просмотреть список, создать объект кода для каждого файла и обрезать его for (int i = 0; i lt; fileList.length; i ) {...} .

Ниже приведен пример того, как это может работать. Я добавил комментарии, объясняющие шаги. Имейте в виду, что я не тестировал код, но он должен работать:

 //Path to your folder final static String folderPath = "D:/your/directory/path/";  public static void main(String[] args) throws IOException {  //Get a list of all files in the folder  File[] fileList = new File(folderPath).listFiles();   System.out.println("Starting first image..");   //Loop through the above list of files  for (int i = 0; i lt; fileList.length; i  ){  //For each file create a new code object and trim it  code trim = new code(fileList[i]);  trim.trim();   //Create a file path to save the trimmed file with the same name but add "_TRIMMED" to the end  //You will need to alter this line to put the file extension in the correct place  String newFileName = getPath()   "/"   fileList[i].getName()   "_TRIMMED";    //Finally save the updated file to the new path   trim.write(new File(newFileName));  }    System.out.println("All images trimmed.."); }  

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

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

1. Он ничего не делает. Если только я, вероятно, все еще не сделал это правильно.

2. @jigz Пройдите код с помощью отладчика или добавьте println инструкции, чтобы вы могли видеть, что делает код и fileList действительно ли он содержит какие-либо файлы System.out.println("Found " fileList.length " files to trim."); . Кроме того, дважды проверьте, folderPath указывает ли он на папку с файлами в ней.

3. Извините за поздний ответ, но я наконец понял, о чем вы говорили, большое вам спасибо!