Bilder bearbeiten pixelweise

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

habe mich in der letzten Zeit darum bemüht mit einem BufferedImage pixel zu setzen/ zu lesen. Das funktioniert auch wenn man das BufferedImage selbst leer erstellt, aber ich möchte die pixel in einem bild von der Festplatte setzen.
Deshalb hab ich mir mit Codeschnipseln aus dem Java Almanac 1.4 folgendes zusammen gebaut:
Code:
import javax.imageio.*;
 import java.io.*;
 import java.awt.*;
 import java.awt.Image.*;
 import javax.swing.*;
 
 public class pic {
 
	
	public static void main(String[] args)  {
		Image im = null;
		try {
        // Read from a file
        File file = new File("in.png");
        im = ImageIO.read(file); 
		} 
		catch (IOException e) {}
		
		
		BufferedImage b= null;
		b=pic.toBufferedImage(im); // hier versuch ich dann das BufIm zu bekommen
		
	    // Use a label to display the image
   /* JFrame frame = new JFrame();
    JLabel label = new JLabel(new ImageIcon(image));
    frame.getContentPane().add(label, BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);
	*/
	} //main -Ende-----------------------------------------------------------------------------------------------

	 
	
	    // This method returns a buffered image with the contents of an image
    public static BufferedImage toBufferedImage(Image image) {
        if (image instanceof BufferedImage) {
            return (BufferedImage)image;
        }
    
        // This code ensures that all the pixels in the image are loaded
        image = new ImageIcon(image).getImage();
    
        // Determine if the image has transparent pixels; for this method's
        // implementation, see e661 Determining If an Image Has Transparent Pixels
        boolean hasAlpha = hasAlpha(image);
    
        // Create a buffered image with a format that's compatible with the screen
        BufferedImage bimage = null;
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        try {
            // Determine the type of transparency of the new buffered image
            int transparency = Transparency.OPAQUE;
            if (hasAlpha) {
                transparency = Transparency.BITMASK;
            }
    
            // Create the buffered image
            GraphicsDevice gs = ge.getDefaultScreenDevice();
            GraphicsConfiguration gc = gs.getDefaultConfiguration();
            bimage = gc.createCompatibleImage(
                image.getWidth(null), image.getHeight(null), transparency);
        } catch (HeadlessException e) {
            // The system does not have a screen
        }
    
        if (bimage == null) {
            // Create a buffered image using the default color model
            int type = BufferedImage.TYPE_INT_RGB;
            if (hasAlpha) {
                type = BufferedImage.TYPE_INT_ARGB;
            }
            bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);
        }
    
        // Copy image to buffered image
        Graphics g = bimage.createGraphics();
    
        // Paint the image onto the buffered image
        g.drawImage(image, 0, 0, null);
        g.dispose();
    
        return bimage;
    }
	
	
	    // This method returns an Image object from a buffered image
                 //diese Methode kann das ganze dann rückgängig machen , wenn man wieder ein Image haben will:
    public static Image toImage(BufferedImage bufferedImage) {
        return Toolkit.getDefaultToolkit().createImage(bufferedImage.getSource());
    }
}
Der Almanac sagt: ein Image kann nur zu einem BufferedImage gemacht werden indem man die Methode toBufferedImage siehe Quelltext verwendet. Trotzdem läuft der Quelltext nicht durch: z.b: findet er hasAlpha aus awt.Image nicht.

Vielleicht kann mir jemand sagen was am Quelltext falsch ist , oder eine andere Variante beschreiben Bildpixel zu lesen und zu setzen.
 

Quaxli

Top Contributor
Du solltest diesen Almanac wegschmeißen. Scheint nix vernünftiges drin zu stehen... :bahnhof: Zumindest nicht zu Thema Images.

Außerdem habe ich aufgrund des Satzes

Deshalb hab ich mir mit Codeschnipseln aus dem Java Almanac 1.4 folgendes zusammen gebaut:

den Eindruck, das Du auch nicht so die rechte Ahnung hast. Du wirst mit vorgefertigtem Code, an dem Du rumdockterst, nicht auf einen grünen Zweig kommen. Schau Dir eines der Tutorial an, die hier empfohlen werden und fang am Anfang an. (Tutorials: Entweder "Java ist auch eine Insel" oder www.javabuch.de).

Ich habe Dir trotzdem mal ein Beispiel gebastelt, wobei von Deinem ursprünglichen Code nichts mehr übrig geblieben ist. Nicht wundern, wenn es nach dem Starten einen Moment dauert bis was angezeigt wird, das liegt am FileChooser (aber das weißt Du, wenn Du Dich mit Java etwas auskennst).


Code:
import javax.imageio.*;
import java.io.*;
import java.awt.image.*;
import java.awt.*;
import javax.swing.*;

public class Pic extends JPanel{

	private static final long	serialVersionUID	= 1L;
	
	BufferedImage	bimg;

	public static void main(String[] args) {
		new Pic();
	}

	public Pic() {

		File pic = null;

		JFileChooser chooser = new JFileChooser();
		int returnVal = chooser.showOpenDialog(null);
		if (returnVal == JFileChooser.APPROVE_OPTION) {
			pic = chooser.getSelectedFile();
		}

		System.out.println(pic);

		try {
			bimg = ImageIO.read(pic);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		System.out.println("Bild hat Alpha: " + bimg.getColorModel().hasAlpha());

		JFrame frame = new JFrame("Bild-Test");
		frame.setLocation(100,100);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		setPreferredSize(new Dimension(bimg.getWidth(),bimg.getHeight()));
		frame.add(this);
		
		frame.pack();
		frame.setVisible(true);
		
	}
	
	public void paintComponent(Graphics g){
		g.drawImage(bimg, 0, 0, this);
	}
	

}


Weitergehende Fragen werde ich nur beantworten, wenn ich merke, daß Du mehr kannst, als fremden Code zusammen zu frickeln. Es tut mir leid, wenn das hart klingt, aber ich habe diesbezüglich schlechte Erfahrungen gemacht.
 

thE_29

Top Contributor
Also von Image to BufferedImage ist seine Konvertierung doch OK!

Nur das die Konvertierung total fürn Hugo ist, da er schon ein BufferedImage hat, war ihm anscheinend nicht klar :)

Achja die Pixel kannst du mit dem Raster (getRaster() von BufferedImage) bearbeiten/auslesen!
 
G

Guest

Gast
Also du liest ein Bild ein und packst es in einen Panel. Damit ist mir nicht geholfen: ich brauche : lesen von platte in BufferedImage und pixel lesen setzen ( getRGB und setRGB kenne ich) und dann zurück auf platte schreiben. Das funktioniert bei mir nur wenn ich ein Buf Image neu anlege. Der Konstruktor braucht ja den Bildtyp. Und ich bekomme den richtigen Typ z.B. bei einer png Bildversion nicht hin. Er gibt mir als Typ : 12 aber das korreliert nicht gut mit dem was mir getTypes sagt.
Hier nochmal mein eigener Quelltext:
Code:
 import javax.imageio.*;
 import java.io.*;
 import java.awt.*;
 import java.awt.image.*;
 
/* Klasse mit Hauptprogramm */
public class ImageTest {
 
	
	public static void main(String[] args) throws Exception {
	
		 
		//---------------------------Bild Lesen------------------------------------------------------------

		BufferedImage bi= ImageIO.read(new File("C:/Users/Jay/Documents/JavaStuff/Image/black.png"));
		BufferedImage transp = new BufferedImage(10,10, BufferedImage.TYPE_INT_RGB);
		//--------------------------------------getPixel----------------------------------------------------------------
		int argb = bi.getRGB( 1, 1 );
		System.out.println(argb);
		// -------------------------------------setPixel-----------------------------------------------------------------
		int argb1=0;
		argb1=0xFF00FF00;  //green
		bi.setRGB( 5, 5, new Color(220,1,1).getRGB());
		transp.setRGB( 5, 5, new Color(220,1,1,220).getRGB());//rote intensität hoch - nur wenig verblasst durch transparenz
		int type=0;
		type= bi.getType();
		System.out.println("BufIm ARGB hat Typ:"+BufferedImage.TYPE_INT_ARGB+" mein geladenes Bild hat Typ:"+type);
		//----------------------------------------Bild schreiben-----------------------------------------------------
		
		File file = new File("C:/Users/Jay/Documents/JavaStuff/Image/transpp.png");
		if(file.exists()) {
			file.delete();
		}
		file.createNewFile();
		try{
		ImageIO.write(transp, "png", file);
		}
		catch(IOException E){System.out.println("Bild schreiben funtkioniert nicht");}
		}
}

Wie gesagt mit dem BufferedImage transp , welches ich neu anlege klappts , aber wenn ich ein BufIm von meinem Bild black.png mache läuft das Programm zwar durch aber der pixel wird nicht gesetzt.
(Je nachdem was ich gerade untersuche speicher ich das eine oder andere Bild indem ich in write transp oder bi einsetze ...)
 

Quaxli

Top Contributor
Was ich gemacht habe, war Dein Programm überhaupt mal lauffähig zu kriegen, da z. B. die getAlpha-Methode gar nicht funktioniert hat. Zudem habe ich einigen überflüssigen Müll weggelassen, z. B. diese toBuferredImage()-Methode die keiner braucht. Mein Programm sollte Dir nicht Deine Lösung vorkauen, sondern nur eine Hilfestellung geben.

Was die "12" bei getType betrifft: Wenn Du mal in die API gucken würdest, dann würdest Du sehen, daß die Bildtypen von denen Du redest, statische Integerwerte sind. Und wenn man sich mit der API beschäftigt, kann man sogar sehen, was hinter diese Bildtypen steckt:

Code:
java.awt.image.BufferedImage
public static final int 	TYPE_3BYTE_BGR   	    -->5
public static final int 	TYPE_4BYTE_ABGR 	   -->6
public static final int 	TYPE_4BYTE_ABGR_PRE 	-->7
public static final int 	TYPE_BYTE_BINARY 	   -->12
public static final int 	TYPE_BYTE_GRAY 	            -->10
public static final int 	TYPE_BYTE_INDEXED 	  -->13
public static final int 	TYPE_CUSTOM 	              -->0
public static final int 	TYPE_INT_ARGB 	             -->2
public static final int 	TYPE_INT_ARGB_PRE 	  -->3
public static final int 	TYPE_INT_BGR 	              -->4
public static final int 	TYPE_INT_RGB 	              -->1
public static final int 	TYPE_USHORT_555_RGB    -->9
public static final int 	TYPE_USHORT_565_RGB    -->8
public static final int 	TYPE_USHORT_GRAY 	 -->11
[/code]
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
MiMa Fonts, Icons, Bilder in JavaFX Anwendung AWT, Swing, JavaFX & SWT 5
F Bilder zu ausführbarer Jar-Datei hinzufügen AWT, Swing, JavaFX & SWT 5
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
G JPanel mit JButtons und Bilder AWT, Swing, JavaFX & SWT 5
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
M Swing Bilder in Swing anzeigen AWT, Swing, JavaFX & SWT 9
S AffineTranformation Bilder verschwinden von Anzeige bei Pan, Zoom AWT, Swing, JavaFX & SWT 6
G Bilder in javafx Project AWT, Swing, JavaFX & SWT 11
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
N eclipse Java, bilder benutzten Funktioniert nicht AWT, Swing, JavaFX & SWT 6
Kirby.exe Bilder in GUI einfügen AWT, Swing, JavaFX & SWT 8
T Bilder bei einem JFrame einfügen AWT, Swing, JavaFX & SWT 4
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
L Bilder werden in exportierter Datei nicht geladen AWT, Swing, JavaFX & SWT 6
C Bilder so einbinden, dass sie sich ändern AWT, Swing, JavaFX & SWT 6
J Bilder aus dem SceneBuilder werden in der Jar nicht dargestellt AWT, Swing, JavaFX & SWT 4
TheWhiteShadow JavaFX Bilder werden ungewollt Skaliert AWT, Swing, JavaFX & SWT 1
B JavaFX Bilder in einem Gewissen bereich halten AWT, Swing, JavaFX & SWT 1
J Bilder proportional verkleiner AWT, Swing, JavaFX & SWT 12
E Bilder skalieren AWT, Swing, JavaFX & SWT 4
DaCrazyJavaExpert Swing Bilder überlagern AWT, Swing, JavaFX & SWT 19
A Bilder als Hintergrund AWT, Swing, JavaFX & SWT 2
@SupressWarnings() JavaFX Bilder in executable jar laden AWT, Swing, JavaFX & SWT 5
Sugan JavaFX Bilder drucken AWT, Swing, JavaFX & SWT 0
K JPanel Bilder bei Windows nicht darstellbar AWT, Swing, JavaFX & SWT 6
Sugan Java FX Verzeichnisüberwachung -> Bilder auf GUI anzeigen AWT, Swing, JavaFX & SWT 4
E AWT Bilder als "Array" abspeichern. AWT, Swing, JavaFX & SWT 4
MrSnake Bilder aus Unterordner einfügen AWT, Swing, JavaFX & SWT 2
I 2D-Grafik Bilder Eingefügt, button jetzt im Hintergrund AWT, Swing, JavaFX & SWT 2
C SWT Treeview mit Bilder im Label verändert Expanded Icon AWT, Swing, JavaFX & SWT 1
M Swing JTextPane, Bilder und Text-flow AWT, Swing, JavaFX & SWT 2
A Mit dem Scene Builder eine Collage erstellen (Bilder beziehen aus Flickr) AWT, Swing, JavaFX & SWT 1
thet1983 JTable Bilder AWT, Swing, JavaFX & SWT 6
GenerationLost Bilder an bestimmten Platz einfügen/Objekte visualisieren AWT, Swing, JavaFX & SWT 1
F Bilder in jFrame einfügen AWT, Swing, JavaFX & SWT 3
J Bilder als Variable an einem Objekt speichern AWT, Swing, JavaFX & SWT 3
I Swing Bilder werden nach Export nicht angezeigt AWT, Swing, JavaFX & SWT 1
D 2D-Grafik Bilder anzeigen AWT, Swing, JavaFX & SWT 4
J Bilder auf JPanel (im JScrollPane) nacheinander laden AWT, Swing, JavaFX & SWT 0
vodkaz JFrame,Bilder und Zeitverzögerung AWT, Swing, JavaFX & SWT 2
A Swing Bilder werden nicht angezeigt AWT, Swing, JavaFX & SWT 3
I SWT Bilder, bzw. ein einzelnes Bild AWT, Swing, JavaFX & SWT 6
M Bilder zeichnen, NullPointer Exception AWT, Swing, JavaFX & SWT 3
Xbody 2D-Grafik JavaFX Bilder transformieren AWT, Swing, JavaFX & SWT 2
C 2D-Grafik Steganographie - Verschlüsselung von Dateien in Bildern - Bilder zeigen schwarze Rechtecke AWT, Swing, JavaFX & SWT 13
P Durch Bilder Scrollen AWT, Swing, JavaFX & SWT 2
F Bilder werden nicht in's Array geladen AWT, Swing, JavaFX & SWT 4
K Bilder übereinanderlegen AWT, Swing, JavaFX & SWT 11
windl Querstreifen beim Bilder malen und anpassen an neue CPU AWT, Swing, JavaFX & SWT 12
V Fertige Komponente zum Anzeigen mehrerer Bilder AWT, Swing, JavaFX & SWT 5
Karuka 2D-Grafik Bilder in GridLayout einfügen AWT, Swing, JavaFX & SWT 7
J Bilder in ausführbare jar einbinden AWT, Swing, JavaFX & SWT 7
J Swing Bilder anzeigen in Gridlayout AWT, Swing, JavaFX & SWT 11
H 2D-Grafik Bilder laden ist nicht zuverlässig AWT, Swing, JavaFX & SWT 3
F Bilder ineinander kopieren AWT, Swing, JavaFX & SWT 3
P Bilder verkleinern AWT, Swing, JavaFX & SWT 2
C SWT Mehrere Bilder in GUI laden AWT, Swing, JavaFX & SWT 5
Furtano AWT Skalierung mehrerer Bilder / Histogramme im Fenster AWT, Swing, JavaFX & SWT 4
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
T 2D-Grafik Statisches Hintergrundbild, dynamische Bilder drüber AWT, Swing, JavaFX & SWT 2
C Zwei Bilder übereinander legen AWT, Swing, JavaFX & SWT 1
L [SWT] Daten und Bilder drucken AWT, Swing, JavaFX & SWT 2
S Flickr Bilder in Gui Oberfläche AWT, Swing, JavaFX & SWT 21
L Bilder im JPanel als Hintergrund - Swing AWT, Swing, JavaFX & SWT 2
K Bilder nacheinander einfügen AWT, Swing, JavaFX & SWT 3
H Bilder auf Buttons per Klick tauschen ( Puzzle ) AWT, Swing, JavaFX & SWT 8
H Bilder in Array zufällig anordnen AWT, Swing, JavaFX & SWT 4
P 2D-Grafik Viele Bilder zu einem Video AWT, Swing, JavaFX & SWT 3
J Vergleicher zweier Bilder AWT, Swing, JavaFX & SWT 2
C zwei Bilder nacheinander anzeigen AWT, Swing, JavaFX & SWT 2
L Swing Bilder über andere Bilder laden AWT, Swing, JavaFX & SWT 3
J Bilder überlappen AWT, Swing, JavaFX & SWT 18
P Bilder werden nach Änderung nicht angezeigt AWT, Swing, JavaFX & SWT 15
3 2D-Grafik Rechtecke auf Bilder legen und auslesen AWT, Swing, JavaFX & SWT 4
M Mehrere Bilder auf einmal anzeigen AWT, Swing, JavaFX & SWT 9
P Swing html mit bilder drin AWT, Swing, JavaFX & SWT 12
F Nicht alle Bilder werden angezeigt AWT, Swing, JavaFX & SWT 2
E Bilder auf JFrame AWT, Swing, JavaFX & SWT 7
R Bilder über URL einfügen AWT, Swing, JavaFX & SWT 4
F Applet zeigt Bilder nicht an AWT, Swing, JavaFX & SWT 5
M FileChooser Bilder auswählen AWT, Swing, JavaFX & SWT 8
G Swing Bilder zeichnen AWT, Swing, JavaFX & SWT 28
L Swing Bilder im Icons-Ordner AWT, Swing, JavaFX & SWT 4
U Bilder in Jar werden nicht gefunden AWT, Swing, JavaFX & SWT 5
S SWT Canvas: Flackernde Bilder AWT, Swing, JavaFX & SWT 3
A Bilder vergleichen AWT, Swing, JavaFX & SWT 4
E Swing JTextPane Inhalt(Text und Bilder) als HTML text bekommen AWT, Swing, JavaFX & SWT 3
E AWT Bilder und Java AWT, Swing, JavaFX & SWT 11
P Bilder einfügen AWT, Swing, JavaFX & SWT 4
D Swing JEditorPane mit HTML aber ohne Bilder AWT, Swing, JavaFX & SWT 3
S Swing Kleine Bilder in Panel einfügen AWT, Swing, JavaFX & SWT 13
A AWT Bilder als Link verwenden? AWT, Swing, JavaFX & SWT 11
T SWT Wie Bilder aus JAR-Dateien einbinden? AWT, Swing, JavaFX & SWT 12
S Bilder aus der Google Book Search API auslesen AWT, Swing, JavaFX & SWT 3
J Bilder in JScrollPane zentrieren AWT, Swing, JavaFX & SWT 5
M Bilder in einem Textfeld darstellen AWT, Swing, JavaFX & SWT 2
N Bilder aus Infos generieren lassen. Welches Framework? AWT, Swing, JavaFX & SWT 8
A SWT Bilder resizen AWT, Swing, JavaFX & SWT 9
A Swing Bilder in JFrame einfügen AWT, Swing, JavaFX & SWT 2
Cloud Einige Bilder werden nicht geladen AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen

Neue Themen


Oben