Zum Inhalt springen

Bildbearbeitung und Analyse


Empfohlene Beiträge

Geschrieben

Guten Tag zusammen!

Hat jemand nen Tipp wo ich ein Tutorial finde um zu lernen wie ich mit JAVA ein Bitmap (oder so) einlesen und bearbeiten kann?

Cool wärs natürlich auch, wenn mir das einer so erklären könnte.

Z.B. würd ich gern mit JAVA auf ein Bild zugreife und dann mit ner Schleife cheken wo überall Pixel schwarz gefärbt sind. Sowas halt...

Wenn mir da einer oder eine helfen könnte wär das sau nett :-)

Lg Kampfzwerg

Geschrieben

Das ist im Grunde ziemlich einfach mit Java. Das auslesen einzelnen Bildpunkte kannst du dem folgenden Beispiel-Code entnehmen.


    BufferedImage image = ImageIO.read(new File("TestBild.jpg"));


    for (int x = 0; x < image.getWidth(); x++) {

      for (int y = 0; y < image.getHeight(); y++) {

        Color color = new Color(image.getRGB(x, y));


        System.out.println("pixel (" + x + "," + y + ")");

        System.out.println("red:   " + color.getRed());

        System.out.println("green: " + color.getGreen());

        System.out.println("blue:  " + color.getBlue());

      }

    }

Um in das Bild zu zeichnen, kannst du dir vom Image-Objekt das Graphics-Objekt holen und mittels den Methoden welche dir dort bereit gestellt werden recht komfortabel irgendwelche Dinge machen (z.B. Linien, Kreise, Polygone, Bilder ins Bild zeichnen).

Zum speichern von Bildern kannst du auch wieder ImageIO verwenden. Da gibts auch eine write-Methode.

Geschrieben

jo danke. das is schonmal ne super coole antwort.

Ich glaube du hats es in gewisser Weise schon erwähnt . aber Ich frag nommal:

1) der gibt dann nicht die Farbe , sonder die Farbanteile aus oder?Also in deriner Methode jetzt.

2) Wie kann ich denn ein Bild dass ich zb. auf dem Desktop hab einlesen?

3) Muss ich dafür am anfang was importieren oder kann ich die Methode sozusagen direkt übernehmen?

Geschrieben
1) der gibt dann nicht die Farbe , sonder die Farbanteile aus oder?Also in deriner Methode jetzt.

Ja. Du bekommst die Werte der drei Farbkanäle. Der wert liegt jeweils zwischen 0 und 255. Wobei 0 der kleinste Farbwert ist und 255 der größte ist. Wenn du z.B. abfragen willst, ob ein Pixel rot ist würde es bedeuten, dass der rot-Wert ziemlich groß sein muss und der blau und grün anteil eher niedrig. Volles rot wäre also 255,0,0 (r,g,B). 230,30,30 ist aber auch noch ziemlich rötlich. Da kann man sich bissl spielen/muss man bissl rumprobieren.

Die Farbanteile lassen sich vom Color-Objekt abfragen (schau dir die Sysouts im Beispiel an).

2) Wie kann ich denn ein Bild dass ich zb. auf dem Desktop hab einlesen?

Indem du dem File-Objekt nicht "TestBild.jpg" übergibst sondern einen relative oder absoluten Dateipfad. z.B. "C:/Benutzer/Horsti/Desktop/MeinBild.jpg". Du kannst auch Backslashs im Pfad verwenden, musst diese im Quelltext allerdings maskieren (mit "\\").

Oder automatisieren:

JFileChooser (GUI-Komponente zur Auswahl einer Datei).

oder wenn du es billig willst:

JOptionPane.showInputDialog()

3) Muss ich dafür am anfang was importieren oder kann ich die Methode sozusagen direkt übernehmen?

Falls möglich nutz doch Eclipse, setz den Cursor hinter den Klassennamen und drück Strg+Leertaste (dann bekommst import-Vorschläge)

ja:

javax.imageio.ImageIO

java.awt.image.BufferedImage

java.io.File

java.awt.Color

Desweiteren musst du für den geposteten Code die IOException abfangen (falls das Bild nicht existiert oder es nicht gelesen werden kann...). Stichwort: try-catch

Geschrieben

nebenbei:

Compiliere L:\Schule\Informatik\Facharbeit\einlesen\loader.java mit Java-Compiler

loader.java:12:1: error: class, interface, or enum expected

java.awt.Color

^

1 error

komm das.wenn ich jedoch diese Zeile löschen zeigt er mir die nächste an.Wenn ich alle löschge kommen 15 errors. -.-

Geschrieben

Mit ImageIO kannst du alle möglichen Bilder einlesen. Es werden so ziemlich alle alltäglichen und geläufigen Bildformate unterstützt. Allerdings weiß ich grad nicht so ganz, wie man bei animierten GIFs oder PNGs an die jeweils nachfolgenden Sequenzbilder kommt.

In der API-Doc (Link) findest du eine Liste der unterstützten Formate.

Geschrieben (bearbeitet)

also ich hab das jetzt nochmal alles überprüft. Ich habs jetzt so gemacht , dass ich dem BufferedImage einen festen pfad übergebe:

try

    {

      BufferedImage image = ImageIO.read("F:/Schule/Informatik/Facharbeit/einlesen/bild.jpg");

      for (int x = 0; x < image.getWidth(); x++) {

        for (int y = 0; y < image.getHeight(); y++) {

          Color color = new Color(image.getRGB(x, y));


          System.out.println("pixel (" + x + "," + y + ")");

          System.out.println("red:   " + color.getRed());

          System.out.println("green: " + color.getGreen());

          System.out.println("blue:  " + color.getBlue());

        }

      }

    }

    catch(IOException i)

    {


    }
Da kommt bei mir immer die Fehlermeldung:
Compiliere F:\Schule\Informatik\Facharbeit\einlesen\PixelAnalyseFRAM.java mit Java-Compiler

PixelAnalyseFRAM.java:63:36: error: no suitable method found for read(String)

      BufferedImage image = ImageIO.read("F:/Schule/Informatik/Facharbeit/einlesen/bild.jpg");

                                   ^

    method ImageIO.read(ImageInputStream) is not applicable

      (actual argument String cannot be converted to ImageInputStream by method invocation conversion)

    method ImageIO.read(URL) is not applicable

      (actual argument String cannot be converted to URL by method invocation conversion)

    method ImageIO.read(InputStream) is not applicable

      (actual argument String cannot be converted to InputStream by method invocation conversion)

    method ImageIO.read(File) is not applicable

      (actual argument String cannot be converted to File by method invocation conversion)

1 error
oder, wenn ich das mitm filechooser mache die Fehlermeldung:
Compiliere F:\Schule\Informatik\Facharbeit\einlesen\PixelAnalyseFRAM.java mit Java-Compiler

PixelAnalyseFRAM.java:63:36: error: no suitable method found for read(String)

      BufferedImage image = ImageIO.read(fcJPGSaveFilename());

^

Bearbeitet von Kampfzwerg
Geschrieben

Compiliere F:\Schule\Informatik\Facharbeit\einlesen\PixelAnalyseFRAM.java mit Java-Compiler

PixelAnalyseFRAM.java:63:36: error: no suitable method found for read(String)

      BufferedImage image = ImageIO.read("F:/Schule/Informatik/Facharbeit/einlesen/bild.jpg");

                                   ^

    method ImageIO.read(ImageInputStream) is not applicable

      (actual argument String cannot be converted to ImageInputStream by method invocation conversion)

    method ImageIO.read(URL) is not applicable

      (actual argument String cannot be converted to URL by method invocation conversion)

    method ImageIO.read(InputStream) is not applicable

      (actual argument String cannot be converted to InputStream by method invocation conversion)

    method ImageIO.read(File) is not applicable

      (actual argument String cannot be converted to File by method invocation conversion)

1 error
Steht doch da: Entweder ein ImageInputStream-, URL-, InputStream- oder File-Objekt an die Methode übergeben.
Compiliere F:\Schule\Informatik\Facharbeit\einlesen\PixelAnalyseFRAM.java mit Java-Compiler

PixelAnalyseFRAM.java:63:36: error: no suitable method found for read(String)

      BufferedImage image = ImageIO.read(fcJPGSaveFilename());

Der FileChoose liefert dir den Dateipfad als String. Klingelt es?

Geschrieben

Benutz doch einfach einen einen etwas komfortableren Editor zum Programmieren. Selbst der simple JavaEditor ist in der Lage dir wesentliche Hilfestellungen zu geben was die Methoden-Auswahl angeht. Oder wenns auch etwas mehr sein darf schau dir mal Eclipse an.

Wenn du schon nicht die API-Docs lesen willst kannst dir davon wenigstens helfen lassen und so Fragen wie wieso du die Fehlermeldung "no suitable method found for read(String)" bekommst haben sich erledigt. Du bekommst die Meldung weil es keine read-Methode in der Klasse ImageIO gibt, welche einen String als Übergabeparameter hat. In meinem Beispiel habe ich auch ein File-Objekt übergen welches ich mit einem String instanziert habe. In der Java-API-Documentation findest du im übrigen zu ((fast)) jeder Klasse die bei Java standardmäßig dabei ist eine Liste der Konstruktoren und Methoden.

Geschrieben

ich würde ihm nicht gerade einen Unwillen im Zusammenhang mit dem Lesen der dokumentation zusprechen

ich würde eher sagen, dass er zu selten auf die Idee kommt, darin nachzulesen

@Kampfzwerg: auf dauer gesehen solltest du versuchen, mit weniger Fragen gegenüber anderen auszukommen und statt dessen mehr Recherche zu betreiben

für später ein Hinweis:

wenn du mit Java2D arbeitest (also mit einem Graphics2D Objekt anstelle des Graphics Objekts), dann solltest du auch die Methode setRenderingHint berücksichtigen

hier ein paar mögliche Einstellungen, durch die die Zeichnungen hübscher aussehen:

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);

g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);

g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);

g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

g2d stellt in dem Fall das Graphics2D Objekt dar

(sollten die einen oder anderen Werte unpassend sein, bitte ich um Korrektur)

  • 2 Wochen später...
Geschrieben

@Sacaldur : ok ich werd mich drum bemühen ;-) ....

Hab mir das jetzt nochmal angeguckt. Wüsste aber wirklich nich was daran falsch sein kann? Er sagt mir immer "cant read input file". Das heißt in den Markierten Zeilen muss der Fehler liegen.

 

[B]BufferedImage image = ImageIO.read(new File("C:/bild.jpg"));[/B]   

     for (int x = 0; x < image.getWidth(); x++) {

        for (int y = 0; y < image.getHeight(); y++) {

          [B]Color color = new Color(image.getRGB(x, y));[/B]         

          jTA1.append("|pixel (" + x + "," + y + ")");

          jTA2.append("|red:   " + color.getRed());

          jTA3.append("|green: " + color.getGreen());

          jTA4.append("|blue:  " + color.getBlue());

         }

       }

    }

Ich hab mir den Konstruktor der File angeguckt. Also die erste markierte Zeile muss also stimmen.

Aber die zweite Zeile stimmt auch. Hab mir da die Methode und den konstruktor auch angeguckt.

Geschrieben

  • Kannst du die komplette Exception hier ausgeben?
  • Gibt es die Datei unter dem angegeben Pfad?

"Can't read input file" heißt ja, dass er die Datei nicht lesen kann - warum auch immer.

Geschrieben
javax.imageio.IIOException: Can't read input file!

	at javax.imageio.ImageIO.read(ImageIO.java:1301)

	at PixelAnalyseFrame.loadJPG(PixelAnalyseFrame.java:86)

	at PixelAnalyseFrame.jButton1_ActionPerformed(PixelAnalyseFrame.java:116)

	at PixelAnalyseFrame$1.actionPerformed(PixelAnalyseFrame.java:65)

	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)

	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)

	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)

	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)

	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)

	at java.awt.Component.processMouseEvent(Component.java:6504)

	at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)

	at java.awt.Component.processEvent(Component.java:6269)

	at java.awt.Container.processEvent(Container.java:2229)

	at java.awt.Component.dispatchEventImpl(Component.java:4860)

	at java.awt.Container.dispatchEventImpl(Container.java:2287)

	at java.awt.Component.dispatchEvent(Component.java:4686)

	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)

	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)

	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)

	at java.awt.Container.dispatchEventImpl(Container.java:2273)

	at java.awt.Window.dispatchEventImpl(Window.java:2713)

	at java.awt.Component.dispatchEvent(Component.java:4686)

	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)

	at java.awt.EventQueue.access$000(EventQueue.java:101)

	at java.awt.EventQueue$3.run(EventQueue.java:666)

	at java.awt.EventQueue$3.run(EventQueue.java:664)

	at java.security.AccessController.doPrivileged(Native Method)

	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)

	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)

	at java.awt.EventQueue$4.run(EventQueue.java:680)

	at java.awt.EventQueue$4.run(EventQueue.java:678)

	at java.security.AccessController.doPrivileged(Native Method)

	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)

	at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)

	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)

	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)

	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)

	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)

	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)

	at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Geschrieben

okay. Ich hab das problem entdeckt. Die Datei war anscheinend beschädigt...

Hab die Datei von meiner Platte auf den PC gezogen , wurde dardurch vllt beschädigt. habs mit ner anderen probiert , mit der gings.

Trotzdem an alle und die schnelle Hilfe.

Lg Kampfzwerg

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...