#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. Извините за поздний ответ, но я наконец понял, о чем вы говорили, большое вам спасибо!