2009-08-07 13 views
0

Ich habe ein bisschen eine seltsame Aufgabe gegeben, es gibt rund 1500-2000 JPEG-Bilder von etwa 1-50kb Größe. Sie werden derzeit in einer einfachen Datenbank gespeichert, die ich mit Postgres erstellt habe. Es ist schon lange her, dass ich Matlab und Postgres benutzt habe, so dass jede Hilfe oder Vorschläge wirklich geschätzt wird!Wie lade ich Bilder in Postgres mithilfe von Java in Matlab ein?

Ich brauche die Bilder, die in der Datenbank gespeichert sind, aus der Datenbank in Java. Der letzte Schritt ist das Abrufen des Bildes aus Java in Matlab, so dass das Bild auf dieselbe Weise gespeichert wird, auf der die Imread-Funktion in Matlab funktioniert. Die Imread-Funktion liest ein Bild ein und erzeugt ein n mal 3 Matrix-Array von uint8-Werten, die die Pixelintensitäten von RGB bezeichnen.

Atm Ich habe das Bild in und aus der Datenbank in Java, derzeit das Bild in einer Bytea Spalte Datentyp gespeichert. Ist der beste Datentyp zu verwenden?

Wie kann ich die Daten aus der Datenbank zurückholen, so dass es entweder das konstruierte JPEG-Bild ist, das ich einfüge oder in dem angeforderten Matrix-Array-Format ist?

Zur Zeit verstehe ich die abgerufenen Daten nicht. Es befindet sich in einem Byte-Array von etwa 70.000 Elementen mit Werten zwischen -128 und 128. Hilfe!?!

Hinweis: Die Datenbank Toolkit ist mir nicht verfügbar

ANOTHER UPDATE: Ich habe das Problem auf die post regarding'UTF-8' kodiert, Fehler im Zusammenhang gelöst haben.

Wenn jemand auf dieser Seite stolpert, wird jede mögliche Antwort versucht, sobald ich kann! Ich schätze deine Gedanken und Antworten sehr. Danke noch einmal.

Antwort

1

Problem gelöst :-)

ich es geschafft haben, die Bytes in der bytea Spalte innerhalb der Datenbank in ein Byte-Array gespeichert zu bekommen. Dann durch das Erstellen einer temporären Datei (mit ByteArrayInputStream und Reader-Objekt, um ein BufferedImage-Objekt zu erstellen, das ich in eine Datei schreibe), senden Sie diese in einem Array an Matlab zurück.

Dann verarbeiten Sie die Daten, die ich abgerufen und aus der temporären Datei in Matlab gelesen habe. Sobald die Daten in Matlab sind, werden alle temporären Dateien gelöscht.

Der Code das ResultSet zu verarbeiten, um eine temporäre Bild von einem Byte-Array aus der Datenbanken bytea Spalte empfangen wird weiter unten zu erstellen:

private static void processImageResultSet(ResultSet rs) throws SQLException, FileNotFoundException, IOException{ 

     int i = 0;     //used as a count and to name various temp files 
     while(rs.next()){   //loop through result sets 

     byte[] b = rs.getBytes(1);         //the bytea column result 
     String location = getFileName(rs.getString(2));   //the name of the jpg file 
     ByteArrayInputStream bis = new ByteArrayInputStream(b); //creates stream storing byts 

     //To make individual names of temporary files unique the current time and date is stored 
     SimpleDateFormat df = new SimpleDateFormat("'Date 'yyyy-MM-dd HH'H'-mm'M'-ss'secs'-SS'ms'"); //formats date string 
     Calendar cal = Calendar.getInstance();        //gets instance of calendar time 
     String fileDate = df.format(cal.getTime());       //gets the time and date as a String 

     Iterator<?> readers = ImageIO.getImageReadersByFormatName("jpg");  //creates a reader object, that will read jpg codec compression format 
     Object source = bis;             //object to store stream of bytes from database 
     ImageReader reader = (ImageReader) readers.next();      
     ImageInputStream iis = ImageIO.createImageInputStream(source);  //creates image input stream from object source which stores byte stream 

     reader.setInput(iis, true);    //sets the reader object to read image input stream 

     ImageReadParam param = reader.getDefaultReadParam(); 
     Image image = reader.read(0, param); 

     BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB); //creates buffered image 

     Graphics2D g2 = bufferedImage.createGraphics(); 
     g2.drawImage(image, null, null); 
     File imageFile = new File(location + " " + fileDate + " " + i + ".jpg"); //creates image file 
     ImageIO.write(bufferedImage, "jpg", imageFile);       //writes buffered image object to created file 

     i++;  //counts number of results from query within the ResultSet 
     } 

    } 
0

Haben Sie Zugriff auf die Database Toolbox in MATLAB? Wenn dies der Fall ist, sollten Sie in der Lage sein, mit der Funktion DATABASE direkt eine Verbindung zu einer PostgreSQL-Datenbank herzustellen und dann Daten über die FETCH-Funktion oder die QUERYBUILDER-GUI zu importieren und zu exportieren. Dies ist möglicherweise einfacher als zuerst Java zu durchlaufen.

+0

Nein, der Datenbank-Toolbox nicht verfügbar ist für mich und ich bin leider nicht in der Lage um die Bilder auch auf einem Dateisystem zu speichern. Dinge etwas knifflig machen! – binarycreations

1

Wenn Sie sagen, dass Sie das Bild in einer Bytea-Spalte haben, wie genau wird es gespeichert? Speichern Sie die Bytes des Inhalts der JPEG-Datei oder ein Array von RGB-Pixelwerten oder etwas anderes? "Bytea" ist nur eine binäre Zeichenfolge, die Daten in fast jedem Format speichern kann.

Ich nehme an, es ist der Inhalt von JPEG. In diesem Fall können Sie die JPEG-Inhalte über Java abrufen, sie in einer temporären Datei speichern und imread() in der temporären Datei aufrufen.

Diese [-128,127] -Werte sind Werte von vorzeichenbehafteten Java-Bytes. Auch ohne die Database Toolbox können Sie reguläre JDBC- oder anderen Java-Code aufrufen, der sie verwendet. Die Java-Methode, die Sie verwendet haben, um diese Werte zu erhalten - rufen Sie sie von Matlab (mit Ihrer JAR auf dem Klassenpfad) ab und sie sollte dieses Array als ein int8-Array oder etwas, das Sie in eins konvertieren können, zurückgeben.

Da in einer Matlab-Variablen mit dem Namen "Bytes", können Sie es in eine temporäre Datei mit etwas wie dies schreiben.

file = [tempname() '.jpg']; 
fid = fopen(file, 'wb'); 
fwrite(fid, bytes, 'int8'); 
fclose(fid); 

von ‚int8‘ Präzision Angabe, ich glaube, Sie den Schritt der Umwandlung sie in unsigned Bytes überspringen kann, die eine gemeinsame Konvention ist. Das Schreiben von int8s als 'int8' oder von uint8s als 'uint8' erzeugt dieselbe Datei. Wenn Sie sie in unsigned konvertieren müssen, verwenden Sie die typecast() -Funktion von Matlab.

An diesem Punkt können Sie imread auf der temporären Datei aufrufen und dann löschen.

img = imread(file); 
delete(file); 
+0

Ich erstelle ein File-Objekt des Bildes und sende die Bytes des Bildes. Zur Klarstellung speichert das Bytea den Inhalt der JPEG-Datei. – binarycreations

+0

Ich habe versucht, was Sie durch die Java-App vorgeschlagen, ein Byte-Array erstellen und füllen Sie es aus dem Bytea-Array, das das Bild speichert. Dann habe ich einen FileOutputStream und die Datei erstellt, aber es scheint, dass das Ergebnis nicht in einem JPEG-Format ist, da Matlab und andere Programme die Datei als korruptes oder unbekanntes Format sehen. – binarycreations

Verwandte Themen