Wie kann ich in einem dir alle Bilder einlesen, Java?
Hier mein Code:
import java.awt.Component;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Read extends Component {
public static void main(String[] foo) {
new Read();
}
public void printPixelARGB(int pixel, int i, int j) {
int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel) & 0xff;
System.out.println("argb: " + alpha + ", " + red + ", " + green + ", " + blue);
int x = ((alpha-(765-red-green-blue)/3)<<24) + (red<<16) + (green<<8) + blue;
double y = x < 0 ? (1.0/(x))/-1 : x > 0 ? 1.0/x : 0;
System.out.println(y);
}
private void marchThroughImage(BufferedImage image) {
int w = image.getWidth();
int h = image.getHeight();
System.out.println("width, height: " + w + ", " + h);
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
System.out.println("x,y: " + j + ", " + i);
int pixel = image.getRGB(j, i);
printPixelARGB(pixel, i, j);
System.out.println("");
}
}
}
public Read() {
try {
// get the BufferedImage, using the ImageIO class
BufferedImage image =
ImageIO.read(this.getClass().getResource("3.png"));
marchThroughImage(image);
} catch (IOException e) {
System.err.println(e.getMessage());
}
}
}
Meine Frage... Bei der Zeile mit "3.png" soll stehen, dass alle png Files einer dir z.b. C:\Users\xy\pngdir eingelesen werden... Wie macht man das?
LG
4 Antworten
So zum Beispiel (ungetestet, sollte aber im Wesentlichen passen):
File dir = new File("/home/ich/meinefotos");
for(File pngFile: dir.listFiles((d, s) -> s.endsWith(".png"))) {
BufferedImage img = ImageIO.read(pngFile);
// usw.
}
Dann geh mit dem Debugger durch oder lass dir erstmal nur die Files ausgeben. Eine typische Fehlerquelle bei Anfängern sind Windows-Pfade mit Backslashes. Du kannst auch mal mit
dir.exists() && dir.isDirectory()
prüfen, ob der Pfad korrekt ist. Der obige Code schert sich nicht drum.
Debuggen werd ich dir das nicht, aber eine Möglichkeit ist dass die Endungen großgeschrieben sind. Dieser Filter ist etwas robuster:
(d, s) -> s.toLowerCase().endsWith(".png")
String::toLowerCase() gibt es seit Java 1.0, also seit dem Jahr 1996. Ich fürchte du wirst nicht darum herumkommen ein bisschen Java zu lernen, auch wenn du nur Code aus dem Netz kopierst.
auch wenn du nur Code aus dem Netz kopierst.
Ähm NUR... Hab ein NN alleine Programmiert und nicht irgendwo rauskopiert... :)
Will ja nix sagen... aber IntelliJ zeigt den Part als Fehler an... (d, s) -> s.toLowerCase().endsWith(".png")
Übrigens ist es eher schlechter Stil, die ganze lange Arbeit im Konstruktor zu machen. Dafür ist er nicht da.
Ja ehrlich gesagt hab ich das net programmiert sondern abkopiert ausm Internet und hab was verbessert, bzw. was ich noch brauch... Hab ich abkopiert, weil ich mich mit ki beschäftige, dafür aber keine Bock habe, ein Bild einlese Programm zu programmieren :)
Du musst den Pfad der Bilder angeben.
Hier ausführlich:
https://wiki.byte-welt.net/wiki/Grafikdateien_laden_und_anzeigen_(Java)
Die Namen aller Png-Dateien in einem Ordner kriegst du z.B. so:
File dir = new File("C:\\Users\\xy\\pngdir");
String[] fileNames = dir.list((file, filename) -> filename.matches(".*\\.png"));
oder falls du den vollen Pfadnamen brauchst:
File dir = new File("C:\\Users\\xy\\pngdir");
File[] files = dir.listFiles(file -> file.getPath().matches(".*\\.png"));
for (File file: files) {
// Read(file.getAbsolutePath());
}
Deinen Code musst du halt so ändern, dass er einmal pro png-Datei aufgerufen werden kann. Z.B. indem du dem Konstruktor den Pfad mitgibst und in der main-Methode halt jede Datei durchgehst.
wie wäre es ein ordendlichen image deserializer zu verwenden der nativ bitmaps auspuckt und methoden hat um directorys durchzuiterieren?
also das beispiel ist schwach aber sollte mehr oder weniger klappen du brauchst nur noch eine foreach schleife die jede datei durchgeht und dafür brauchst du ne directory collection
so etwas
File[] files = new File("C:/").listFiles();
for (File file : files) {
if (file.isDirectory()) {
System.out.println("Directory: " + file.getName());
showFiles(file.listFiles()); // Calls same method again.
} else {
System.out.println("File: " + file.getName());
}
}
Ok und beim BufferedImage sag ich nicht "3.png" sondern file.getName()... warte aber zeigt file.getName() dann den GANZEN Path?
genau, wenn nicht dann gibt es bestimmt sowas wie getPath oder getFullPath
ähm... ist mir im Moment relativ.... mich würde es interessieren wie ich das auslesen von png Bildern in einer dir machen kann. Hast du da eine Idee?
ne da klappt was nicht... bekomme kein Fehler aber auch kein Output OBWOHL da 1-2 .png Dateien in meinen angegeben Ordner sind...