# Bild einscannen und speichern



## headnut (28. Apr 2011)

Guten Morgen allerseits

Seit Stunden nun bin ich am suchen einer simplen Lösung für ein kleines Problem...

Ich möchte mit einem Button ein Bild von einem Scanner einlesen und nachher in einem Ordner speichern.

Ich habe mich mit mmscomputing auseinander gesetzt, jedoch ohne erfolg. Es kann doch nicht soo schwer sein oder?

Vielen Dank schonmal für die Hilfe.


----------



## André Uhres (28. Apr 2011)

Hallo Headnut,

diese Seite könnte helfen: Java - Twain - image acquisition - Programmer's Heaven

Gruß,
André

EDIT: Sorry, das ist nicht kostenfrei!


----------



## headnut (28. Apr 2011)

Jo das hab ich auch schon gesehen...

Aber es müsste doch einfacher zu machen sein...


----------



## homer65 (28. Apr 2011)

Linux Nutzer können scanimage nutzen. Ist allerdings per Kommandozeile.
Ich habe mal ein Java Programm drumherum gestrickt, das die eingescannten Bilder in einer MySQL Datenbank speichert.
Bei Interesse kannst du den Quellcode haben.


----------



## homer65 (28. Apr 2011)

Hier der Link zum Quellcode:
http://ehm.homelinux.org/software/JMyScanner-0.3.tar.gz


----------



## homer65 (28. Apr 2011)

Für dich von Interesse ist wahrscheinlich nur das beiliegende scanner Skript:

```
#!/bin/bash
#
ein=/tmp/temp.tiff
aus=${1}
rm "${ein}"
rc=0
echo "Gescannt werden soll:" ${aus}
scanimage --resolution=150 --format=tiff > "${ein}"
rc=$?
if [ $rc -ne 0 ]; then
	echo "scanimage returned:" $rc
	exit 12
fi
convert "${ein}" "${aus}"
rc=$?
if [ $rc -ne 0 ]; then
	echo "convert returned:" $rc
	exit 8
fi
rm "${ein}"
rc=$?
if [ $rc -ne 0 ]; then
	echo "rm returned:" $rc
	exit 4
fi
exit 0
```


----------



## headnut (28. Apr 2011)

Nee es ginge hier um eine Windows Maschine...


----------



## s4ke (28. Apr 2011)

Dann musst du wohl da durch. Das hatte ich auch schonmal gemacht, aber leider den Code und die .dll dafür verloren... Wird zudem Teil des Projekts, das ich nach meinem Player vor habe.


----------



## Andi_CH (29. Apr 2011)

headnut hat gesagt.:


> Nee es ginge hier um eine Windows Maschine...



cygwinläufft auf Windows und kann jegliche Art von Shellscripts ausführen.


----------



## headnut (12. Jul 2011)

Zu diesem Thema hier hat niemand sonst eine bessere lösung?


----------



## Ariol (12. Jul 2011)

Bridge the gap between Java and Twain - JavaWorld

Läuft wohl mit JNI und EZTwain Free


----------



## headnut (12. Jul 2011)

mit mmscomputing hat niemand erfahrung?

Ich habe follgendes funktienerendes Programm gefunden das für mich fast reichen würde:

Meine Frage wäre nun ob ich dem Api irgendwo mitteilen kann mit welchen grauwerten und so es scannen soll? Kennt das jemand??


```
// Don't forget to comment out next line if the resulting class is run from the java root directory


import java.io.File;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;

import uk.co.mmscomputing.device.scanner.Scanner;
import uk.co.mmscomputing.device.scanner.ScannerDevice;
import uk.co.mmscomputing.device.scanner.ScannerListener;
import uk.co.mmscomputing.device.scanner.ScannerIOException;
import uk.co.mmscomputing.device.scanner.ScannerIOMetadata;

public class twaintest implements ScannerListener{

  static twaintest app;  

  Scanner Scanner;
  boolean isFinished = false;

  @SuppressWarnings("static-access")
public twaintest(String[] argv)throws ScannerIOException{
    Scanner=Scanner.getDevice();
    Scanner.addListener(this);    
    Scanner.acquire();
  }

public void update(ScannerIOMetadata.Type type, ScannerIOMetadata metadata){
    if(type.equals(ScannerIOMetadata.ACQUIRED)){
      BufferedImage image=metadata.getImage();
      System.out.println("Have an image now!");
      try{
        ImageIO.write(image, "BMP", new File("TEST.jpg"));
      }catch(Exception e){
        e.printStackTrace();
      }
    }else if(type.equals(ScannerIOMetadata.NEGOTIATE)){
      ScannerDevice device=metadata.getDevice();
      try{
        device.setShowUserInterface(false);
        device.setShowProgressBar(true);
        device.setResolution(100);
      
      }catch(Exception e){
        e.printStackTrace();
      }
    }else if(type.equals(ScannerIOMetadata.STATECHANGE)){
      System.err.println(metadata.getStateStr());
      if(metadata.isFinished()){
        isFinished = true;
      }
    }else if(type.equals(ScannerIOMetadata.EXCEPTION)){
      metadata.getException().printStackTrace();
    }
  }

  @SuppressWarnings("static-access")
public static void main(String[] argv){
    try{
      app=new twaintest(argv);                             // 2010-06-05
      while(!app.isFinished){                              // We need to keep the 'main' thread alive until 
        Thread.currentThread().sleep(200);                 // the native jtwain deamon thread has finished, otherwise
      }                                                    // the program is killed while the data source is still running
    }catch(Exception e){                                   // => crash inevitable
      e.printStackTrace();
    }
  }
}
```


----------



## Ariol (12. Jul 2011)

Hmm, ich kann nur die Auflösung finden...


----------



## headnut (12. Jul 2011)

Es geht mir nicht in den kopf dass es nicht möglich sein soll im 2011 auf einfache art und weise einen Scanner anzusteuern!

Drucken ist ja auch kein Problem...


----------



## Ariol (12. Jul 2011)

Scannen geht ja auch, dein Problem ist der Kontrast und evtl die Helligkeit.
Ich weiß nicht einmal, ob das auf HW-Seite möglich ist.

Wie wärs wenn du einfach den Kontrast des BufferedImage, dass du bekommst anpasst:
Image Processing: Brightness and Contrast : Image2D Graphics GUIJava


----------



## headnut (12. Jul 2011)

Ein ganz neuer Ansatz! Ich müsste zwar ein zimlich aufwendiges Gui basteln aber dafüt könnte ich alles anpassen, grauwerte und so!

Das ganze Array mässig abspeichern und schon hätte ich spezifische einstellungen pro produkt!

Muss ich mir morgen fertig überlegen, ich denke da gibt es ganze Tutorials und beispiele!


----------



## HoaX (12. Jul 2011)

Bei der Lib von mmsc gibts irgendwo ne Einstellung dass zum Scannen der normale Scanner-Dialog angezeigt wird iirc.


----------



## headnut (12. Jul 2011)

Das weiss ich bringt mir aber nichts danke trotzdem!

Das sollte einmal eingestellt werden und ab dann automatisch laufen


----------



## headnut (13. Jul 2011)

oh mann ich verzweifle!

jetzt erkennt die mms lib nicht mal ein A3 scanner, ich verstehs nicht...


----------



## Ariol (13. Jul 2011)

Hab's gerade nicht hier, aber AFAIR gab es eine getDevices()-Funktion in einer der Klassen, mit der man über die gefundenen Geräte iterieren konnte.

Ansonsten sollte die API aber mit TWAIN-fähigen Geräten umgehen können.


----------



## headnut (13. Jul 2011)

Diese findet auch glaube ich so eine art scanner:


Das gibt sie aus:

```
uk.co.mmscomputing.device.twain.TwainScanner@7d8483
```

mit meinem zuhause lief es mit diesem hier nicht mehr


----------



## Ariol (13. Jul 2011)

Das Object hat nicht evtl. ein 
	
	
	
	





```
getName()
```
 oder 
	
	
	
	





```
getDeviceIdentifier()
```
 o.s.ä.


----------



## headnut (13. Jul 2011)

Irgendiwe nicht nein hat nur zwei getter...

naja nun läuft der scanner wieder... unglaublich, jetzt muss ich mir einfach mal das vorgehen durch den kopf gehen lassen...

Das projekt bringt mich noch um Wiso der s******e Scanner plötzlich geht weiss ich übrigens nicht, aber nach dem dritten mal treiber installieren lief er...


----------



## headnut (13. Jul 2011)

Es kommt langsam

Nun fehlt mir nur noch ein anpassen des Gammawertes des bildes...

Hat da wer noch eine idee?


----------



## Ariol (13. Jul 2011)

Nach einigen Anläufen:


```
public BufferedImage setGamma(BufferedImage image, double gammaFactor)
	{
		double gammaPotency = 1.0 / gammaFactor;
		int w = image.getWidth(), h = image.getHeight();

		for (int x = 0; x < w; x++)
		{
			for (int y = 0; y < h; y++)
			{
				int argb = image.getRGB(x, y);
				int nargb = ((argb >> 24) & 0xFF) << 24; // set alpha
				for (int i = 0; i < 24; i += 8)
				{
					int value = (int) (Math.pow((argb >> i) & 0xFF, gammaPotency));
					nargb += (int) ((value > 0xFF) ? (0xFF << i) : (value << i));
				}
				image.setRGB(x, y, nargb);
			}
		}

		return image;
	}
```


----------



## headnut (14. Jul 2011)

hmm

ich begreiff den programm teil nicht ganz...

kann es sein dass ich so das Bild nur einmal mit einem Faktor bearbeiten kann und nachher nie mehr auf den Standart zurückkomme? 

Weil plötzlich seh ich auf dem bild nichts mehr, und wegen dem Faktor 1 gehts dann nicht mehr auf standart zurück:-(


Edit:   AAaaaaaaaaaaaaaaaaaah ich depp! sag noch nichts ich hbae eine idee...


----------



## headnut (14. Jul 2011)

Perfekt ich dank dir viel viel mal für diese genialen Erklätungen! Du musst ein wahrer spezialist sein!!!

Danke danke danke danke danke!


----------



## headnut (14. Jul 2011)

jetzt hab ich doch nochmal ne frage

Ich habe zwei Bild Objekte, die Src mit dem Originalbild das ich veräneder und
nach der Gamma aktualisierung ind die Dest speichere. Um die Anzeige richtig zu machen
rescale ich das bild mit dem eingestellten Kontrast und Helligkeit. 

Wenn ich nun jedoch mit den Buttons den Gammawert senken möchte macht er das nur beim ersten klick und dann fertig! wisoooo? 

// Edit: So funktioniert dies im Grundstatz nicht, wie muss ich die beiden Korrekturen (Helligkeit, Kontrast und Gamma wert) kombinieren?



```
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.awt.image.*;
import java.io.File;
import java.io.IOException;


/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
@SuppressWarnings("serial")
public class Berabeiten extends JFrame {
    DisplayPanel displayPanel;
    JButton brightenButton, darkenButton,
            contIncButton, contDecButton,
    		jBspeichern, jBGammaPos,
    		jBGammaNeg;

    @SuppressWarnings("deprecation")
	public Berabeiten() throws IOException {
        super();
        Container container = getContentPane();

        displayPanel = new DisplayPanel();
        container.add(displayPanel);

        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(2, 3));
        panel.setBorder(new TitledBorder(
            "Klicke ein Button um Kontrast und helligkeit zu ändern"));

        brightenButton = new JButton("Helligkeit >>");
        brightenButton.addActionListener(new ButtonListener());
        darkenButton = new JButton("Helligkeit <<");
        darkenButton.addActionListener(new ButtonListener());

        contIncButton = new JButton("Kontrast >>");
        contIncButton.addActionListener(new ButtonListener());
        contDecButton = new JButton("Kontrast <<");
        contDecButton.addActionListener(new ButtonListener());
        
        jBspeichern = new JButton("Speichern");
        jBspeichern.addActionListener(new ButtonListener());
        
        jBGammaPos = new JButton("Gamma >>");
        jBGammaPos.addActionListener(new ButtonListener());

        jBGammaNeg = new JButton("Gamma <<");
        jBGammaNeg.addActionListener(new ButtonListener());
        
        panel.add(brightenButton);
        panel.add(darkenButton);
        panel.add(contIncButton);
        panel.add(contDecButton);
        panel.add(jBspeichern);
        panel.add(jBGammaPos);
        panel.add(jBGammaNeg);

        container.add(BorderLayout.SOUTH, panel);

        addWindowListener(new WindowEventHandler());
        setSize(displayPanel.getWidth(), displayPanel.getHeight() + 10);
        show(); // Display the frame
    }

    class WindowEventHandler extends WindowAdapter {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    }

    public static void main(String arg[]) throws IOException {
        new Berabeiten();
    }

    class ButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            JButton temp = (JButton) e.getSource();

            if (temp.equals(brightenButton)) {
                displayPanel.brighten = true;
                displayPanel.changeOffSet();
                System.out.println(displayPanel.offset + "=offset");
                displayPanel.rescale();
                displayPanel.repaint();
            }
            else if (temp.equals(darkenButton)) {
                displayPanel.brighten = false;
                displayPanel.changeOffSet();
                System.out.println(displayPanel.offset + "=offset");
                displayPanel.rescale();
                displayPanel.repaint();
            }
            else if (temp.equals(contIncButton)) {
                displayPanel.contrastInc = true;
                displayPanel.changeScaleFactor();
                System.out.println(displayPanel.scaleFactor + "=scaleF");
                displayPanel.rescale();
                displayPanel.repaint();
            }
            else if (temp.equals(contDecButton)) {
                displayPanel.contrastInc = false;
                displayPanel.changeScaleFactor();
                System.out.println(displayPanel.scaleFactor + "=scaleF");
                displayPanel.rescale();
                displayPanel.repaint();
            }
            else if (temp.equals(jBspeichern)) {
            	try {
					displayPanel.speichern();
				} catch (IOException e1) {
					System.out.println("Fehler beim speichern");
				}
            }
            else if(temp.equals(jBGammaPos)) {
            	displayPanel.gammaButton = true;
            	displayPanel.setGamma(displayPanel.changeGamma());
            	displayPanel.rescale();
            	displayPanel.repaint();
            }
            else if(temp.equals(jBGammaNeg)) {
            	displayPanel.gammaButton = false;
            	displayPanel.setGamma(displayPanel.changeGamma());
            	displayPanel.rescale();
            	displayPanel.repaint();
            }
        }
    }
}
@SuppressWarnings("serial")
class DisplayPanel extends JPanel {
    Image displayImage;
    BufferedImage biSrc, biDest, bi; 
    Graphics2D big;
    RescaleOp rescale;
    float scaleFactor = 1.0f;
    float offset = 10;
    float gammaFaktor = 0.0f;
    boolean brighten, contrastInc, gammaButton;

    DisplayPanel() throws IOException {
        setBackground(Color.black); 
        loadImage();
        setSize(displayImage.getWidth(this),
                displayImage.getWidth(this));
        createBufferedImages();
    }

    public void loadImage() throws IOException {
    	
    	// Bild einlesen
		BufferedImage imgIn = ImageIO.read(new File("C:/Dokumente und Einstellungen/rs.KE/workspace/Bachmann Forming/Kamera Bild/image.jpg"));
		
		// Um 90% verkleinern
		AffineTransformOp atop = new AffineTransformOp(AffineTransform.getScaleInstance(0.18, 0.18), AffineTransformOp.TYPE_BICUBIC);
		
		// Ausgabe
		BufferedImage imgOut = atop.createCompatibleDestImage(imgIn, ColorModel.getRGBdefault());
		
		// Bild verkleinern
		atop.filter(imgIn, imgOut);
    	
    	
    	
        displayImage = imgOut;
        MediaTracker mt = new MediaTracker(this);
        mt.addImage(displayImage, 1);
        try {
            mt.waitForAll();
        } catch (Exception e) {
            System.out.println("Exception while loading.");
        }
 
        if (displayImage.getWidth(this) == -1) {
            System.out.println("No jpg file");
            System.exit(0);
        }
    }

    public void createBufferedImages() {
        biSrc = new BufferedImage(displayImage.getWidth(this),
                                  displayImage.getHeight(this),
                                  BufferedImage.TYPE_INT_RGB);

        big = biSrc.createGraphics();
        big.drawImage(displayImage, 0, 0, this);

        biDest = new BufferedImage(displayImage.getWidth(this),
                                   displayImage.getHeight(this),
                                   BufferedImage.TYPE_INT_RGB);
        bi = biSrc;
    }

    public void changeOffSet() {
        if (brighten) {
            if (offset < 255)
               offset = offset+5.0f;
        }
        else {
            if (offset > -255)
               offset = offset-5.0f;
        }
    }

    public void changeScaleFactor() {
        if (contrastInc) {
            if (scaleFactor < 2)
                scaleFactor = scaleFactor+0.1f;
        }
        else {
            if (scaleFactor > -2)
                scaleFactor = scaleFactor-0.1f;
        }
    }
    
    public double changeGamma() {
        if (gammaButton) {
            if (gammaFaktor < 500)
                gammaFaktor = gammaFaktor+0.1f;
        }
        else {
            if (gammaFaktor > 0)
                gammaFaktor = gammaFaktor-0.1f;
        }
        System.out.println(gammaFaktor);
        return gammaFaktor;
    }
    
    public void rescale() {
        rescale = new RescaleOp(scaleFactor, offset, null);
        rescale.filter(biSrc, biDest);
        bi = biDest;
    }

    public void update(Graphics g) {
        g.clearRect(0, 0, getWidth(), getHeight());
        paintComponent(g);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2D = (Graphics2D) g;

        g2D.drawImage(bi, 0, 0, this);
    }
    
    public void speichern() throws IOException {
    	ImageIO.write(bi, "BMP", new File("C:/Dokumente und Einstellungen/rs.KE/workspace/Bachmann Forming/Kamera Bild/image.jpg"));
    }
    
    public void setGamma(double gammaFactor)
    {    	
        double gammaPotency = 1.0 / gammaFactor;
        System.out.println(gammaPotency);
        int w = biSrc.getWidth(), h = biSrc.getHeight();
 
        for (int x = 0; x < w; x++)
        {
            for (int y = 0; y < h; y++)
            {
                int argb = biSrc.getRGB(x, y);
                int nargb = ((argb >> 24) & 0xFF) << 24; // set alpha
                for (int i = 0; i < 24; i += 8)
                {
                    int value = (int) (Math.pow((argb >> i) & 0xFF, gammaPotency));
                    nargb += (int) ((value > 0xFF) ? (0xFF << i) : (value << i));
                }
                biDest.setRGB(x, y, nargb);
                bi = biDest;
            }
        }

    }
}
```


----------



## headnut (14. Jul 2011)

Sooooo jetzt hab ich mal meinen kompletten gehirnschmalz zusammengeholt, kurz geschüttelt und tatsächlich! ich habs geschaft!!

Für alle dies interresiert:


```
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.awt.image.*;
import java.io.File;
import java.io.IOException;


/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
@SuppressWarnings("serial")
public class Berabeiten extends JFrame {
    DisplayPanel displayPanel;
    JButton brightenButton, darkenButton,
            contIncButton, contDecButton,
    		jBspeichern, jBGammaPos,
    		jBGammaNeg;

    @SuppressWarnings("deprecation")
	public Berabeiten() throws IOException {
        super();
        Container container = getContentPane();

        displayPanel = new DisplayPanel();
        container.add(displayPanel);

        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(2, 3));
        panel.setBorder(new TitledBorder(
            "Klicke ein Button um Kontrast und helligkeit zu ändern"));

        brightenButton = new JButton("Helligkeit >>");
        brightenButton.addActionListener(new ButtonListener());
        darkenButton = new JButton("Helligkeit <<");
        darkenButton.addActionListener(new ButtonListener());

        contIncButton = new JButton("Kontrast >>");
        contIncButton.addActionListener(new ButtonListener());
        contDecButton = new JButton("Kontrast <<");
        contDecButton.addActionListener(new ButtonListener());
        
        jBspeichern = new JButton("Speichern");
        jBspeichern.addActionListener(new ButtonListener());
        
        jBGammaPos = new JButton("Gamma >>");
        jBGammaPos.addActionListener(new ButtonListener());

        jBGammaNeg = new JButton("Gamma <<");
        jBGammaNeg.addActionListener(new ButtonListener());
        
        panel.add(brightenButton);
        panel.add(darkenButton);
        panel.add(contIncButton);
        panel.add(contDecButton);
        panel.add(jBspeichern);
        panel.add(jBGammaPos);
        panel.add(jBGammaNeg);

        container.add(BorderLayout.SOUTH, panel);

        addWindowListener(new WindowEventHandler());
        setSize(displayPanel.getWidth(), displayPanel.getHeight() + 10);
        show(); // Display the frame
    }

    class WindowEventHandler extends WindowAdapter {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    }

    public static void main(String arg[]) throws IOException {
        new Berabeiten();
    }

    class ButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            JButton temp = (JButton) e.getSource();

            if (temp.equals(brightenButton)) {
                displayPanel.brighten = true;
                displayPanel.changeOffSet();
                System.out.println(displayPanel.offset + "=offset");
                //displayPanel.rescale();
                displayPanel.bildAktual();
                displayPanel.repaint();
                
            }
            else if (temp.equals(darkenButton)) {
                displayPanel.brighten = false;
                displayPanel.changeOffSet();
                System.out.println(displayPanel.offset + "=offset");
                //displayPanel.rescale();
                displayPanel.bildAktual();
                displayPanel.repaint();
            }
            else if (temp.equals(contIncButton)) {
                displayPanel.contrastInc = true;
                displayPanel.changeScaleFactor();
                System.out.println(displayPanel.scaleFactor + "=scaleF");
                //displayPanel.rescale();
                displayPanel.bildAktual();
                displayPanel.repaint();
            }
            else if (temp.equals(contDecButton)) {
                displayPanel.contrastInc = false;
                displayPanel.changeScaleFactor();
                System.out.println(displayPanel.scaleFactor + "=scaleF");
                //displayPanel.rescale();
                displayPanel.bildAktual();
                displayPanel.repaint();
            }
            else if (temp.equals(jBspeichern)) {
            	try {
					displayPanel.speichern();
				} catch (IOException e1) {
					System.out.println("Fehler beim speichern");
				}
            }
            else if(temp.equals(jBGammaPos)) {
            	displayPanel.gammaButton = true;
            	//displayPanel.setGamma(displayPanel.changeGamma());
            	//displayPanel.rescale();
            	displayPanel.changeGamma();
            	displayPanel.bildAktual();
            	displayPanel.repaint();
            }
            else if(temp.equals(jBGammaNeg)) {
            	displayPanel.gammaButton = false;
            	//displayPanel.setGamma(displayPanel.changeGamma());
            	//displayPanel.rescale();
            	displayPanel.changeGamma();
            	displayPanel.bildAktual();
            	displayPanel.repaint();
            	
            }
        }
    }
}
@SuppressWarnings("serial")
class DisplayPanel extends JPanel {
    Image displayImage;
    BufferedImage biSrc, biDest, bi, temp; 
    Graphics2D big;
    RescaleOp rescale;
    RescaleOp rescale2;
    float scaleFactor = 1.0f;
    float offset = 10;
    float gammaFaktor = 1.0f;
    boolean brighten, contrastInc, gammaButton;

    DisplayPanel() throws IOException {
        setBackground(Color.black); 
        loadImage();
        setSize(displayImage.getWidth(this),
                displayImage.getWidth(this));
        createBufferedImages();
    }

    public void loadImage() throws IOException {
    	
    	// Bild einlesen
		BufferedImage imgIn = ImageIO.read(new File("C:/Dokumente und Einstellungen/rs.KE/workspace/Bachmann Forming/Kamera Bild/image.jpg"));
		
		// Um 90% verkleinern
		AffineTransformOp atop = new AffineTransformOp(AffineTransform.getScaleInstance(0.18, 0.18), AffineTransformOp.TYPE_BICUBIC);
		
		// Ausgabe
		BufferedImage imgOut = atop.createCompatibleDestImage(imgIn, ColorModel.getRGBdefault());
		
		// Bild verkleinern
		atop.filter(imgIn, imgOut);
    	
    	
    	
        displayImage = imgOut;
        MediaTracker mt = new MediaTracker(this);
        mt.addImage(displayImage, 1);
        try {
            mt.waitForAll();
        } catch (Exception e) {
            System.out.println("Exception while loading.");
        }
 
        if (displayImage.getWidth(this) == -1) {
            System.out.println("No jpg file");
            System.exit(0);
        }
    }

    public void createBufferedImages() {
        biSrc = new BufferedImage(displayImage.getWidth(this),
                                  displayImage.getHeight(this),
                                  BufferedImage.TYPE_INT_RGB);

        big = biSrc.createGraphics();
        big.drawImage(displayImage, 0, 0, this);

        biDest = new BufferedImage(displayImage.getWidth(this),
                                   displayImage.getHeight(this),
                                   BufferedImage.TYPE_INT_RGB);
        bi = biSrc;
    }

    public void changeOffSet() {
        if (brighten) {
            if (offset < 255)
               offset = offset+5.0f;
        }
        else {
            if (offset > -255)
               offset = offset-5.0f;
        }
    }

    public void changeScaleFactor() {
        if (contrastInc) {
            if (scaleFactor < 2)
                scaleFactor = scaleFactor+0.1f;
        }
        else {
            if (scaleFactor > -2)
                scaleFactor = scaleFactor-0.1f;
        }
    }
    
    public void changeGamma() {
        if (gammaButton) {
            if (gammaFaktor < 500)
                gammaFaktor = gammaFaktor-0.02f;
        }
        else {
            if (gammaFaktor > 0)
                gammaFaktor = gammaFaktor+0.02f;
        }
        System.out.println(gammaFaktor);
    }
    
    public void bildAktual() {
        // aufruf Methode
        temp = rescale2();
        biDest = setGamma(temp, gammaFaktor);
        bi = biDest;
    }
    
    public void rescale() {
    	rescale = new RescaleOp(scaleFactor, offset, null);
        rescale.filter(biSrc, biDest);
        bi = biDest;
    }
    
    public BufferedImage rescale2() {
    	rescale2 = new RescaleOp(scaleFactor, offset, null);
        rescale2.filter(biSrc, biDest);
        return biDest;
    }

    public void update(Graphics g) {
        g.clearRect(0, 0, getWidth(), getHeight());
        paintComponent(g);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2D = (Graphics2D) g;

        g2D.drawImage(bi, 0, 0, this);
    }
    
    public void speichern() throws IOException {
    	ImageIO.write(bi, "BMP", new File("C:/Dokumente und Einstellungen/rs.KE/workspace/Bachmann Forming/Kamera Bild/image.jpg"));
    }
    
    public BufferedImage setGamma(BufferedImage image, double gammaFactor)
    {
        double gammaPotency = 1.0 / gammaFactor;
        int w = image.getWidth(), h = image.getHeight();
 
        for (int x = 0; x < w; x++)
        {
            for (int y = 0; y < h; y++)
            {
                int argb = image.getRGB(x, y);
                int nargb = ((argb >> 24) & 0xFF) << 24; // set alpha
                for (int i = 0; i < 24; i += 8)
                {
                    int value = (int) (Math.pow((argb >> i) & 0xFF, gammaPotency));
                    nargb += (int) ((value > 0xFF) ? (0xFF << i) : (value << i));
                }
                image.setRGB(x, y, nargb);
            }
        }
 
        return image;
    }
}
```


----------



## headnut (28. Sep 2011)

Damit das thema endgültig fertig ist

die lib mmscomputing hat irgendwelche fehler, ich habe nun die Morena lib genommen, diese ist halt nicht gratis dafür macht sie genau das was ich will!

vielen Dank


----------

