# [Java] BMPs laden, verändern und speichern



## Carndret (15. Dezember 2002)

Ich bräuchte eine Funktion (oder ganze Klasse) mit der ich BMPs laden, ein paar Pixel ändern und dann wieder speichern kann.
Ich brauche das für ein Steganographie-Projekt für die Schule.
Ich habe bisher nur den Pixelgrabber gefunden und habe gesehen, dass er nur GIFs laden kann (stimmt das?). Ich bräuchte allerdings das BMP Format.

Danke im Vorraus


----------



## Christian Fein (16. Dezember 2002)

java.awt.Image


----------



## fluessig (21. April 2003)

Werde aus der java.awt.image nicht schlau. Was muss ich genau machen um die Ergebnisse einer Funktion in ein Bitmap (*.bmp) auszugeben? Ich suche sowas in der Form:
createImage(x,y);
setPixel(x,y,Farbe);
speicherBild("Bildname");


----------



## Thomas Darimont (21. April 2003)

Servus!

Soweit ich weis unterstützt Java in der Version [1.4.1_02 SE] nur das Laden von jpeg und gif Dateien ... [Das Java Media Framework und/oder JAI können natürlich mehr ...;-));

Das geht dann aber recht einfach ...

Deklariere eine Variable vom Typ image z.Bsp.:


```
import java.awt.*;

...

private Image img;

im Konstruktor des Frame/Canvas/Window lädst du das Bild dann mithilfe eines MediaTrackers ...

public Konstruktor(){
       ...
       img = getToolkit().getImage("meinbild.jpg");
       MediaTracker mt = new MediaTracker(this);
       //MediaTracker sorgt dafür, dass das Bild
       //vor dem Anzeigen auf jedenfall schon komplett
       //geladen ist ...
       mt.addImage(img,0);
       try{
          mt.waitForAll();
          }catch(InterruptedExeption e){
             //mach nix
          }

        repaint();
        //löscht den Bildschirm und ruft paint wieder auf...
}

public void paint(Graphics g){
      super.paint(g);
      if(img!=null){ //wir wollen ja keine NullPointer-
                     //Exception ...
         g.drawImage(img,25,25,this);
       }
}
```


//Rest ist in Arbeit ...



Gruss Tom


----------



## Thomas Darimont (21. April 2003)

Servus!

So gehts!
Muss nur noch die Bildgrösse bzw. den Pfad zu deinem Bild und Speicherort für das Modifizierte Bild angeben ...


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import javax.imageio.*;
import java.awt.image.*;

/*
 * FrmImageIO.java
 *
 * Created on 21. April 2003, 15:07
 */

/**
 *
 * @author  Administrator
 */
public class FrmImageIO extends javax.swing.JFrame implements ActionListener {
    
    private JButton jbtn;
    private Image img;
    private BufferedImage buffimg;
    private Graphics graph;
    /** Creates new form FrmImageIO */
    public FrmImageIO() {
        initComponents();
        this.setSize(new Dimension(512,384));
        Container cont = this.getContentPane();
        cont.setLayout(new GridLayout(25,20));
        jbtn = new JButton("Write IMAGE!");
        jbtn.addActionListener(this);
        cont.add(jbtn);
        
        img = this.getToolkit().getImage("c:\\javadev\\Beispiel.jpg");
        
        MediaTracker mt = new MediaTracker(this);
        
        mt.addImage(img,0);
        try{
            mt.waitForAll();
        }catch(InterruptedException ie){
            //nix
        }
        
		buffimg = new BufferedImage(283,212,BufferedImage.TYPE_INT_RGB);
//Dimensionen Meines Testbildes (w,h)
				graph = buffimg.createGraphics();
				graph.drawImage(img,0,0,null);
        		
//TEST
graph.drawLine(0,0,100,100);
//TEST       
        
        repaint();
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {//GEN-BEGIN:initComponents
        
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });
        
        pack();
    }//GEN-END:initComponents
    
    /** Exit the Application */
    private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
        System.exit(0);
    }//GEN-LAST:event_exitForm
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        new FrmImageIO().show();
    }
    
    
    public void paint(Graphics g){
        super.paint(g);
        if(img!=null){
            g.drawImage(img,25,50,this);
        }
    }
    
    public void writeIMG(String fileName){
        try{
        ImageIO.write(buffimg,"JPEG",new File("c:\\javadev\\"+fileName));
        }catch(IOException ioe){
            //nix
        }
    }
    
    public void actionPerformed(java.awt.event.ActionEvent actionEvent) {
        System.out.println("Click!");
        if(img!=null){
            writeIMG("MyTestFile.jpg");
        }
    }    
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    // End of variables declaration//GEN-END:variables
    
}
```

Gruss Tom


----------



## fluessig (21. April 2003)

Wow krass!!! Wo hast du das so schnell ausgegraben? Ich will auch wissen, wo man sowas herbekommt (entschuldige wenn ich mich irre, aber ich kann mir nicht vorstellen, dass mir das jemand einfach so mal schnell nebenbei schreibt )


----------



## Thomas Darimont (21. April 2003)

Servus!

...so schnell ?

Hat immerhin ne gute Stunde gedauert, bis ich das so hinbekommen hab... des weitern helfen die Java Foren auf java.sun.com schon etwas weiter ...

daher hab ich das mit dem 


```
buffimg = new BufferedImage(283,212,BufferedImage.TYPE_INT_RGB);
//Dimensionen Meines Testbildes (w,h)
graph = buffimg.createGraphics();
graph.drawImage(img,0,0,null);
```

Rest ist aus API Doc und "try and Error" gemacht ...

Gruss Tom


----------



## Carndret (22. April 2003)

Auch wenn das jetzt etwas zu spät kommt (1/4 Jahr  ). Ich brauchte das für die Schule. Aber ich habe auch etwas gefunden.
Wenn du nur solche Befehle wie createImage(x,y); setPixel(x,y,Farbe); und speicherBild("Bildname"); benutzen willst, kannst du auch das JIMI-SDK nehmen. Das bindest du einfach in dein Programm ein und kannst dann einfach BMPs laden, speichern usw. Da ist auch eine extra Hilfe dabei.
Die habe ich am letzten Tag vor meinem Vortrag noch gefunden ... DAS war vielleicht mal ein Glück ;-) .


----------

