Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Bildbearbeitung und Analyse

Empfohlene Antworten

Veröffentlicht

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

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.

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?

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

jo alles klar. letztendlich hab ichjs dann auch mittem chooser gemacht die Datei auszuwählen. Kann ich denn damit auch Bitmaps einlesen oder nur jpg´s ?

dickes dankeschön nochmal :-]

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. -.-

upps....ja sorry is alles schon nen bissel eingerostet :D

danke

lg kampfzwerg

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.

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

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?

also könnt ich das was der filechooser returnt nem object vom typ file zuordnen und übergeben?

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.

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...

@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.

  • 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.

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)

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

*trotzdem danke an alle

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.