"ImageIO.read()" liest Bild nicht richtig ein

mac21

Aktives Mitglied
Hallo zusammen,

heute habe ich mal eine Methode, das interessanterweise in einer Java-Klasse funktioniert, in einer anderen nicht.

In meiner GUI.java wird ein Bild als BufferedImage eingelesen:

Java:
package de.systeccomputer.ocr;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.WindowConstants;

public class GUI {
	
	JFrame mainFrame;
	ImagePanel scanPanel;
	Dimension d;
	BufferedImage scan;
	File inputFile;
	
//######### Constructor ###################################		
	public GUI(){

		initComponents();
		addComponents();
				
		try{
			inputFile = new File("c://a.tif");
			scan = ImageIO.read(inputFile);
			
		}catch(Exception e){System.out.println("Problem beim Einlesen");}
		scanPanel.setImage(scan);
	}
//######### Methods #######################################
public void initComponents() {
		
	d = Toolkit.getDefaultToolkit().getScreenSize();
	
	mainFrame = new JFrame(Strings.APPNAME);
	mainFrame.setSize(Settings.FRAMEWIDTH, Settings.FRAMEHEIGHT);		
	mainFrame.setLayout(null);
	mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	mainFrame.setResizable(false);
	mainFrame.setLocation((int) ((d.getWidth() - mainFrame.getWidth()) / 2),(int) ((d.getHeight() - mainFrame.getHeight()) / 2));
	mainFrame.setVisible(true);
		
	scanPanel = new ImagePanel(null, this);
	scanPanel.setSize(mainFrame.getContentPane().getWidth(), mainFrame.getContentPane().getHeight());
	scanPanel.setLocation(0,0); 
	scanPanel.setVisible(false);
}
//#########################################################
public void addComponents() {
	
	mainFrame.add(scanPanel);
}

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

Die Konsole wirft mir KEIN "Problem beim Einlesen" hin.
--> ImageIO.read(inputFile) sollte wohl erfolgreich gewesen sein?

beim Ausführen von
Java:
scanPanel.setImage(scan)
wirft er mir eine
"Exception in thread "main" java.lang.NullPointerException
at de.systeccomputer.ocr.ImagePanel.resizeThumb(ImagePanel.java:45)
at de.systeccomputer.ocr.ImagePanel.setImage(ImagePanel.java:76)
at de.systeccomputer.ocr.GUI.<init>(GUI.java:31)
at de.systeccomputer.ocr.GUI.main(GUI.java:72)"

Hier der Code meiner Klasse ImagePanel:

Java:
package de.systeccomputer.ocr;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.util.Arrays;

import javax.swing.JPanel;


public class ImagePanel extends JPanel {
	private static final long serialVersionUID = 1L;
	private BufferedImage image = null;
	double fakX;
	double fakY;
	int diffX;
	int diffY;
	int factor;
	Point curLoc;
	Rectangle[] rectangles;	
        Rectangle curRect;

       GUI gui;

	public ImagePanel(BufferedImage image, GUI gui) {
		
		if(image != null) {setImage(image);}
	        this.gui = gui;
		
		if(image != null) {
			fakX = (double) image.getWidth() / (double) this.getWidth();
			fakY = (double) image.getHeight() / (double) this.getHeight();
		}
	}
	
	public BufferedImage resizeThumb(BufferedImage orig) {
		factor = 1;
		System.out.println(orig);
		if(orig.getWidth() <= 2000) { }
		if(orig.getWidth() > 2000 && orig.getWidth() <= 4000 ) { factor = 2; }
		if(orig.getWidth() > 4000 && orig.getWidth() <= 6000 ) { factor = 4; }
		if(orig.getWidth() > 6000 ) { factor = 6; }
		BufferedImage resizedImage = new BufferedImage(orig.getWidth()/factor, orig.getHeight()/factor, BufferedImage.TYPE_INT_ARGB);
		  Graphics2D g = resizedImage.createGraphics();
		  g.drawImage(orig, 0, 0, orig.getWidth()/factor, orig.getHeight()/factor, null);
		  g.dispose();
		  return resizedImage;
	}
	
	public void setImage(BufferedImage orig) {
		this.image = resizeThumb(orig);
	}
	
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		if (image != null) {
			g.setColor(Settings.CELLCOLOR);
			g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), this);
			}
		}
	}
	
}
 
Zuletzt bearbeitet:

mac21

Aktives Mitglied
Sry für die Formatierung, habe es direkt aus Eclipse kopiert...?!

Nachtrag: Ich habe eine paar "println()" reingehauen, die Methode "resizeThumb()" in der Klasse "ImagePanel"
wird nur bis zu folgender Zeile bearbeitet, dann kommt der Fehler:
"if(orig.getWidth() <= 2000) { }"

Die NullPointerException sagt wohl aus, dass das BufferedImage "orig" null ist, daher kann er auch die Breite nicht auslesen.
Aber wieso ist das so?

Das Einlesen mit "ImageIO.read()" habe ich in einer anderen Klasse genau so drinstehen,
ich fange im try-catch sogar alle Exceptions ab. Es wird jedoch keine geworfen...
 

mac21

Aktives Mitglied
Hi EasyEagle,

vielen Dank für den Link,
die Verwendung von einem JPG klappt.
Was mich ein wenig wundert:

Ich arbeite nun seit mehreren Wochen an einem OCR-Programm für Fahrzeugscheine, evtl. bist du ja schon über einen meiner diversen Threads gestoßen.
Und ich habe bisher fast nur mit ".tif" gearbeitet.
Ich habe neben dem aktuellen Projekt noch ein zweites, das Ähnlich funktioniert.
Und siehe da, er liest das .tif ein und zeigt es richtig an...
ich verstehe die welt nicht mehr...
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben