Kampfzwerg Geschrieben 19. Dezember 2011 Geschrieben 19. Dezember 2011 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 Zitieren
speedi Geschrieben 19. Dezember 2011 Geschrieben 19. Dezember 2011 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. Zitieren
Kampfzwerg Geschrieben 19. Dezember 2011 Autor Geschrieben 19. Dezember 2011 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? Zitieren
speedi Geschrieben 19. Dezember 2011 Geschrieben 19. Dezember 2011 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,. 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 Zitieren
Kampfzwerg Geschrieben 19. Dezember 2011 Autor Geschrieben 19. Dezember 2011 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 :-] Zitieren
Kampfzwerg Geschrieben 19. Dezember 2011 Autor Geschrieben 19. Dezember 2011 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. -.- Zitieren
flashpixx Geschrieben 19. Dezember 2011 Geschrieben 19. Dezember 2011 Java ist auch eine Insel – 3.5 Import und Pakete Zitieren
Kampfzwerg Geschrieben 20. Dezember 2011 Autor Geschrieben 20. Dezember 2011 upps....ja sorry is alles schon nen bissel eingerostet danke lg kampfzwerg Zitieren
speedi Geschrieben 20. Dezember 2011 Geschrieben 20. Dezember 2011 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. Zitieren
Kampfzwerg Geschrieben 20. Dezember 2011 Autor Geschrieben 20. Dezember 2011 (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 20. Dezember 2011 von Kampfzwerg Zitieren
etreu Geschrieben 20. Dezember 2011 Geschrieben 20. Dezember 2011 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? Zitieren
Kampfzwerg Geschrieben 20. Dezember 2011 Autor Geschrieben 20. Dezember 2011 also könnt ich das was der filechooser returnt nem object vom typ file zuordnen und übergeben? Zitieren
flashpixx Geschrieben 20. Dezember 2011 Geschrieben 20. Dezember 2011 Du möchtest lernen, wie man die Dokumentation liest: File (Java 2 Platform SE v1.4.2) Zitieren
speedi Geschrieben 20. Dezember 2011 Geschrieben 20. Dezember 2011 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. Zitieren
Sacaldur Geschrieben 22. Dezember 2011 Geschrieben 22. Dezember 2011 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) Zitieren
Kampfzwerg Geschrieben 3. Januar 2012 Autor Geschrieben 3. Januar 2012 @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. Zitieren
Aliter Geschrieben 3. Januar 2012 Geschrieben 3. Januar 2012 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. Zitieren
Kampfzwerg Geschrieben 3. Januar 2012 Autor Geschrieben 3. Januar 2012 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) Zitieren
Kampfzwerg Geschrieben 3. Januar 2012 Autor Geschrieben 3. Januar 2012 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 Zitieren
Kampfzwerg Geschrieben 3. Januar 2012 Autor Geschrieben 3. Januar 2012 *trotzdem danke an alle Zitieren
Empfohlene Beiträge
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.