Image aus MS Access anzeigen lassen

MarDaiBre

Aktives Mitglied
Hallo,

ich habe zu (fast) jedem Datensatz ein Bild im Format JPG in MS Access in einer Spalte als OLE-Objekt abgespeichert. Dies soll nach Angabe mehrerer Parameter angezeigt werden. Sage ich meinem Programm, es soll den absoluten Pfad auf der Festplatte nehmen, funktioniert das ohne Probleme. Daher denke ich, dass meine Anzeigefunktion gar nicht soooo verkehrt ist 🙂

Ich habe mir im Netz den Hinweis geholt, das Bild von der MS Access DB in einen byte-Array abzuspeichern und dann in ein ImageIcon bzw. ein BufferedImage umzuwandeln. Leider zeigt mir das Programm kein Bild an, eine Fehlermeldung bekomme ich jedoch auch nicht. Die Testausgaben "JA" und "FERTIG" werden auch ausgegeben. Hat jmd. einen Hinweis?

Hier mal das Coding:
Java:
public BufferedImage getBild(String oid, String bid)
	{
		Connection con;
		Statement st;
		ResultSet rs;
		String query;
		
		ImageIcon ico = null;
		BufferedImage image = null;
				    	
		try
		{
			query = "SELECT O_Bild_" + bid + " FROM Fehlerort WHERE O_ID = '" + oid + "'";
			
			con = DriverManager.getConnection(db);
			st = con.createStatement();
			rs = st.executeQuery(query);
		   	
			if(rs.next())
			{
				System.out.print("JA");
				byte[] imagedata = rs.getBytes(1);
				ico = new ImageIcon(imagedata);
				image = new BufferedImage(999, 761, BufferedImage.TYPE_INT_ARGB); // 999 Bildbreite, 761 Bildhöhe
				System.out.print("FERTIG");
			}
			
			else
				System.out.print("NEIN");

		   	rs.close();
	                st.close();
	                con.close();
		}
				
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
	   	return image;
	}

Hier die Anzeigemethode der anderen Klasse
Java:
        Datenbankschnittstelle db = new Datenbankschnittstelle();
        Image img = db.getBild(oid, bid);
        
        imageResized = img.getScaledInstance((int) bildBreite, (int) bildHoehe, Image.SCALE_SMOOTH); // Bild wird nicht angezeigt
        bufferedImageOptimized = new BufferedImage((int) bildBreite, (int) bildHoehe, BufferedImage.TYPE_INT_ARGB);
        bufferedImageOptimized.getGraphics().drawImage(imageResized, 0, 0, null);
    	g = (Graphics2D) bufferedImageOptimized.getGraphics();

Vielen Dank schonmal!
 
Wie wäre es du machst mal eine Debugausgabe was in und wieviel in rs.getBytes überhaupt drin steht?

Ein JPEG Image sollte immer mit 0xFFD8 beginnen.

Dann bist du schon einmal einen Schritt weiter.

Gruß

Claus
 
Hmmm, ich bekomme leider kein JPEG Image :-(

Für den Code:
Java:
if(rs.next())
{
	System.out.println("JA");
	byte[] imagedata = rs.getBytes(1); // get image data to byte array
				
	System.out.println(rs.getBytes(1).toString());

Gibt er mit in der Console
Code:
JA
[B@419ebce8

aus. Nun, ich sage doch aber, dass er aus der Spalte mit den JPEGs laden und dies in ein byte-Array speichern soll. Warum speichert er dies nicht als JPEG ab?
 
Zuletzt bearbeitet:
Deine Ausgabe gibt nur die Speicheradresse des Arrays wieder nicht den Inhalt von diesem Array.
Ich gehe davon aus das du eine IDE benutzt, setze einen Breakpoint an dieser Stelle und schau dir an mit welchen Bytes dieses Arrays beginnt.
 
Ja, ich arbeite mit eclipse luna version. Okay, wenn ich System.out.println(Arrays.toString(imagedata)); angebe, dann erhalte ich ein sehr großes Array:

Code:
[21, 28, 55, 0, 2, 0, 0, 0, 27, 0, 8, 0, 20, 0, 47, 0, -1, -1, -1, -1, 79, 98, 106, 101, 107, 116, 45, 77, 97, 110, 97, 103, 101, 114, 45, 83, 104, 101, 108, 108, 111, 98, 106, 101, 107, 116, 0, 80, 97, 99, 107, 97, 103, 101, 0, 1, 5, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 80, 97, 99, 107, 97, 103, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44, -63, 1, 0, 2, 0, 56, 56, 78, 48, 49, 95, 67, 50, 48, 55, 46, 106, 112, 103, 0, 72, 58, 92, 80, 50, 92, 73, 109, 112, 111, 114, 116, 92, 70, 101, 104, 108, 101, 114, 111, 114, 116, 101, 92, 67, 50, 48, 55, 92, 56, 56, 78, 48, 49, 95, 67, 50, 48, 55, 46, 106, 112, 103, 0, 0, 0, 3, 0, 48, 0, 0, 0, 67, 58, 92, 85, 115, 101, 114, 115, 92, 65, 116, 122, 101, 92, 65, 112, 

(...) // gekürzt, da mein Post sonst >500.000 Zeichen wäre O_O

0, 101, 0, 104, 0, 108, 0, 101, 0, 114, 0, 111, 0, 114, 0, 116, 0, 101, 0, 92, 0, 67, 0, 50, 0, 48, 0, 55, 0, 92, 0, 56, 0, 56, 0, 78, 0, 48, 0, 49, 0, 95, 0, 67, 0, 50, 0, 48, 0, 55, 0, 46, 0, 106, 0, 112, 0, 103, 0, 1, 5, 0, 0, 0, 0, 0, 0, -72, -83, 5, -2]
FERTIG

Warum auch immer erhalte ich nicht mehr die Ausgabe
Code:
JA
[B@419ebce8

vorher. Müsste ich nicht "einfach" die byte[] imagedata = rs.getBytes(1); Angabe abändern und sagen, er soll den Inhalt speichern und nicht die Speicheradresse?
 
Ja, ich arbeite mit eclipse luna version. Okay, wenn ich System.out.println(Arrays.toString(imagedata)); angebe, dann erhalte ich ein sehr großes Array:

Warum auch immer erhalte ich nicht mehr die Ausgabe

vorher. Müsste ich nicht "einfach" die byte[] imagedata = rs.getBytes(1); Angabe abändern und sagen, er soll den Inhalt speichern und nicht die Speicheradresse?

Nein das passt schon so! "rs.getBytes(1)" liefert dir das Arrays zurück.
Aber wenn du "imagedata.toString()" ausführst wird die "toString()" Methode der Klasse Object aufgerufen (da es keine eigene für Array gibt) und diese gibt halt nur die Speicheradresse zurück!
(Das sind aber Grundlagen 🙂)
 
Also ist ein FileInputStream notwendig oder ist das nur bei einem Lesen von Dateien sinnvoll? Stoße nämlich immer wieder auf einen FileInputStream-Hinweis wenn es um Bilder und byte-Arrays geht...
 
Selbst mit einem InputStream funktioniert es nicht.

Java:
public BufferedImage getBild(String oid, String bid)
{
	Connection con;
	Statement st;
	ResultSet rs;
	String query;
		
	ImageIcon ico = null;
	BufferedImage image = null;
				    	
	try
	{
		query = "SELECT O_Bild_" + bid + " FROM Fehlerort WHERE O_ID = '" + oid + "'";
			
		con = DriverManager.getConnection(db);
		st = con.createStatement();
		rs = st.executeQuery(query);
		   	
		if(rs.next())
		{
			byte[] imagedata = rs.getBytes(1);
				
			try
			{
				InputStream in = new ByteArrayInputStream(imagedata);
				image = ImageIO.read(in);
			}
				
			catch(Exception ex)
			{
				Toolkit.getDefaultToolkit().beep();
			}				
		}
			
		rs.close();
	        st.close();
	        con.close();
	}
				
	catch(Exception e)
	{
		e.printStackTrace();
	}
	
        return image;
}

Als Fehlermeldung erscheint in der nächsten Klasse für das Image ein NullPointerException. Alle Tipps und Fragmente im Netz konnten dazu keine weiteren Infos geben.
 
So, also mit diesem abgeänderten Coding bekomme ich wenigstens keine Fehlermeldung mehr und das neue Fenster, wo das Bild erscheinen soll, öffnet sich auch. Leider ist dort immer noch kein Bild zu sehen - nur die Hintergrundfläche des Frames.

Java:
public BufferedImage getBild(String oid, String bid)
{
	Connection con;
	Statement st;
	ResultSet rs;
	String query;
		
	Image image = null;
	ImageIcon icon = null;
	BufferedImage buffImage = null;
	    	
	try
	{
		query = "SELECT O_Bild_" + bid + " FROM Fehlerort WHERE O_ID = '" + oid + "'";
			
		con = DriverManager.getConnection(db);
		st = con.createStatement();
		rs = st.executeQuery(query);
		   	
		if(rs.next())
		{
			byte[] imageData = rs.getBytes("O_Bild_" + bid);
				
			try
			{
				image = Toolkit.getDefaultToolkit().createImage(imageData);
		                icon = new ImageIcon(image);
		                buffImage = new BufferedImage(999, 761, BufferedImage.TYPE_INT_ARGB); 
		                buffImage.getGraphics().drawImage(icon.getImage(), 0,0, icon.getImageObserver());
					
		                //InputStream in = new ByteArrayInputStream(imagedata);
				//image = ImageIO.read(in);
					
				//ico = new ImageIcon(imagedata);
				//image = new BufferedImage(999, 761, BufferedImage.TYPE_INT_ARGB);
				//image.getGraphics().drawImage(ico.getImage(), 0, 0, ico.getImageObserver());
				//System.out.println(image);
			}
				
			catch(Exception ex)
			{
				ex.printStackTrace();
				Toolkit.getDefaultToolkit().beep();
				JOptionPane.showMessageDialog(new JFrame(), "Kein Bild für diese Fehlerort/Baureihen-Kombination vorhanden.\nBitte wenden Sie sich an den Administrator über 'Hilfe' -> 'Kontakt'.", "Fehler", JOptionPane.ERROR_MESSAGE);
			}				
		}
			
		rs.close();
	        st.close();
	        con.close();
	}
				
	catch(Exception e)
	{
		e.printStackTrace();
	}
		
	return buffImage;
}

Hat jemand einen Hinweis, warum das Bild nicht auf dem Frame angezeigt wird?
 

Neue Themen


Zurück
Oben