Hey,
erstmal vorweg: Ich bin Datenbankprogrammierer im Oracleumfeld und habe so gut wie keine Ahnung von Java (mal abgesehen von meinen Erkenntnissen der letzten 5 Tage ;-)
Hintergrund meiner Anliegens: Wir verwenden derzeit in der Oracle Datenbank (19.1) ein Programm von Oracle selber (ordimage), um Bilder zu konvertieren und und teils zu komprimieren.
Diese Programm wird in den neuen Versionen der Datenbank nicht mehr zu Verfügung stehen. Daher suchen wir nach Alternativen.
Da man Java in die Datenbank einbinden kann und dann keine weiteren Installationen oder kostenpflichtige Programme benötigen würde, ist unsere Wahl auf Java gefallen.
Ich habe auch schon rumgegoogled und auch schon ein Programm gefunden, was die die Konvertierung vornimmt und mit einem blob als Parameter(rein und raus) funktioniert.
Ich habe auch schon ein Programm gefunden (https://examples.javacodegeeks.com/desktop-java/imageio/compress-a-jpeg-file/) welches die komprimierung vornehmen kann. Dies setzt aber ein Bild auf dem Filesystem voraus und schreibt auch das komprimierte Bild wieder ins Filesystem. Das habe ich lokal bei mir auch ausprobiert und das erzeugte neue Bild ist auch kompremiert.
Ich habe versucht das Programm so anzupassen, das er mit blob zurecht kommt und auch einen blob mit dem komprimierten Image zurückgibt.
Um mein Programm lokal auf meinem Rechner Test zu können, hole ich ein jpg-Bild aus meiner Datenbank als Blob über odbc und rufe dann compressJPEG (myBlobCopy) mit dem Blob auf. Um zu zeigen, was passiert ist, mache ich einige Ausgaben in den Klassen. Die Größe des BLOBs vor und nach dem Aufruf von compressJPEG ist gleich.
Hier die Ausgabe: 126 23190 myimage.jpg Länge des abgerufenen Blob: 4284416
Länge des kopierten Blob: 4284416
Aufruf von compressJPEG (myBlobCopy)
jetzt in compressJPEG
Zurück von compressJPEG: Länge des abgerufenen Blob: 4284416
Hier die Klasse. Es scheint, dass das komprimierte Bild (Blob) nicht zurückgegeben wird. Bitte können Sie mir helfen!!!!!!
[CODE lang="java" title="Java Klasse"] import java.sql.*;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.sql.Blob;
import java.iutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.iutputStream;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
//import java.sql.SQLException;
class OracleConCompressBLOB{
public static void main(String args[]){
try{
//step1 load the driver class
Blob myBlob = null;
Blob myBlobCopy = null;
Class.forName("oracle.jdbc.driver.OracleDriver");
String dbURL = "jdbcracle:thin(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = xxxx)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = xxxx) ) )";
String strUserID = "xxxx";
String strPassword = "xxxxx";
//step2 create the connection object
Connection con=DriverManager.getConnection(dbURL,strUserID,strPassword);
//step3 create the statement object
Statement stmt=con.createStatement();
//step4 execute query
// fuer pbent ResultSet rs=stmt.executeQuery("select PRFO_ID, PRFO_PRAX_ID , PRFO_DATEINAME, PRFO_FOTO from T_PRAFOTO where PRFO_ID = 17");
ResultSet rs=stmt.executeQuery("select PRFO_ID, PRFO_PRAX_ID , PRFO_DATEINAME, PRFO_FOTO from T_PRAFOTO where PRFO_ID = 166 FOR UPDATE");
if (rs.next()) {
myBlob = rs.getBlob(4);
myBlobCopy = myBlob;
System.out.println(rs.getInt(1)+" "+rs.getInt(2)+" "+rs.getString(3)+" Length of retrieved Blob: " + myBlob.length());
System.out.println(" Length of copy Blob: " + myBlobCopy.length());
System.out.println("Call compressJPEG (myBlobCopy) ");
compressJPEG (myBlobCopy) ;
System.out.println("back from compressJPEG: Length of retrieved Blob: " + myBlobCopy.length());
}
//step5 close the connection object
con.close();
}catch(Exception e){ System.out.println(e);}
}
public static void compressJPEG(Blob blob) throws IOException {
// File imageFile = new File("myimage.jpg");
// File compressedImageFile = new File("myimage_compressed.jpg");
// InputStream is = new FileInputStream(imageFile);
// OutputStream os = new FileOutputStream(compressed ImageFile);
System.out.println("now in compressJPEG");
BufferedImage bufferedImage = null;
OutputStream outputStream = null;
float quality = 0.5f;
try {
// create a BufferedImage as the result of decoding the supplied InputStream
// BufferedImage image = ImageIO.read(is);
bufferedImage = ImageIO.read(blob.getBinaryStream());
outputStream = blob.setBinaryStream(0);
// test
// get all image writers for JPG format
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
if (!writers.hasNext())
throw new IllegalStateException("No writers found");
ImageWriter writer = (ImageWriter) writers.next();
ImageOutputStream ios = ImageIO.createImageOutputStream(outputStream);
writer.setOutput(ios);
ImageWriteParam param = writer.getDefaultWriteParam();
// compress to a given quality
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(quality);
// appends a complete image stream containing a single image and
//associated stream and image metadata and thumbnails to the output
writer.write(null, new IIOImage(bufferedImage, null, null), param);
// close all streams
// is.close();
// os.close();
// ios.close();
// writer.dispose();
outputStream.flush();
ios.close();
outputStream.close();
writer.dispose();
} catch (IOException e) {
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
catch(IllegalArgumentException e) {
e.printStackTrace();
}
}
} [/CODE]
erstmal vorweg: Ich bin Datenbankprogrammierer im Oracleumfeld und habe so gut wie keine Ahnung von Java (mal abgesehen von meinen Erkenntnissen der letzten 5 Tage ;-)
Hintergrund meiner Anliegens: Wir verwenden derzeit in der Oracle Datenbank (19.1) ein Programm von Oracle selber (ordimage), um Bilder zu konvertieren und und teils zu komprimieren.
Diese Programm wird in den neuen Versionen der Datenbank nicht mehr zu Verfügung stehen. Daher suchen wir nach Alternativen.
Da man Java in die Datenbank einbinden kann und dann keine weiteren Installationen oder kostenpflichtige Programme benötigen würde, ist unsere Wahl auf Java gefallen.
Ich habe auch schon rumgegoogled und auch schon ein Programm gefunden, was die die Konvertierung vornimmt und mit einem blob als Parameter(rein und raus) funktioniert.
Ich habe auch schon ein Programm gefunden (https://examples.javacodegeeks.com/desktop-java/imageio/compress-a-jpeg-file/) welches die komprimierung vornehmen kann. Dies setzt aber ein Bild auf dem Filesystem voraus und schreibt auch das komprimierte Bild wieder ins Filesystem. Das habe ich lokal bei mir auch ausprobiert und das erzeugte neue Bild ist auch kompremiert.
Ich habe versucht das Programm so anzupassen, das er mit blob zurecht kommt und auch einen blob mit dem komprimierten Image zurückgibt.
Um mein Programm lokal auf meinem Rechner Test zu können, hole ich ein jpg-Bild aus meiner Datenbank als Blob über odbc und rufe dann compressJPEG (myBlobCopy) mit dem Blob auf. Um zu zeigen, was passiert ist, mache ich einige Ausgaben in den Klassen. Die Größe des BLOBs vor und nach dem Aufruf von compressJPEG ist gleich.
Hier die Ausgabe: 126 23190 myimage.jpg Länge des abgerufenen Blob: 4284416
Länge des kopierten Blob: 4284416
Aufruf von compressJPEG (myBlobCopy)
jetzt in compressJPEG
Zurück von compressJPEG: Länge des abgerufenen Blob: 4284416
Hier die Klasse. Es scheint, dass das komprimierte Bild (Blob) nicht zurückgegeben wird. Bitte können Sie mir helfen!!!!!!
[CODE lang="java" title="Java Klasse"] import java.sql.*;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.sql.Blob;
import java.iutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.iutputStream;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
//import java.sql.SQLException;
class OracleConCompressBLOB{
public static void main(String args[]){
try{
//step1 load the driver class
Blob myBlob = null;
Blob myBlobCopy = null;
Class.forName("oracle.jdbc.driver.OracleDriver");
String dbURL = "jdbcracle:thin(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = xxxx)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = xxxx) ) )";
String strUserID = "xxxx";
String strPassword = "xxxxx";
//step2 create the connection object
Connection con=DriverManager.getConnection(dbURL,strUserID,strPassword);
//step3 create the statement object
Statement stmt=con.createStatement();
//step4 execute query
// fuer pbent ResultSet rs=stmt.executeQuery("select PRFO_ID, PRFO_PRAX_ID , PRFO_DATEINAME, PRFO_FOTO from T_PRAFOTO where PRFO_ID = 17");
ResultSet rs=stmt.executeQuery("select PRFO_ID, PRFO_PRAX_ID , PRFO_DATEINAME, PRFO_FOTO from T_PRAFOTO where PRFO_ID = 166 FOR UPDATE");
if (rs.next()) {
myBlob = rs.getBlob(4);
myBlobCopy = myBlob;
System.out.println(rs.getInt(1)+" "+rs.getInt(2)+" "+rs.getString(3)+" Length of retrieved Blob: " + myBlob.length());
System.out.println(" Length of copy Blob: " + myBlobCopy.length());
System.out.println("Call compressJPEG (myBlobCopy) ");
compressJPEG (myBlobCopy) ;
System.out.println("back from compressJPEG: Length of retrieved Blob: " + myBlobCopy.length());
}
//step5 close the connection object
con.close();
}catch(Exception e){ System.out.println(e);}
}
public static void compressJPEG(Blob blob) throws IOException {
// File imageFile = new File("myimage.jpg");
// File compressedImageFile = new File("myimage_compressed.jpg");
// InputStream is = new FileInputStream(imageFile);
// OutputStream os = new FileOutputStream(compressed ImageFile);
System.out.println("now in compressJPEG");
BufferedImage bufferedImage = null;
OutputStream outputStream = null;
float quality = 0.5f;
try {
// create a BufferedImage as the result of decoding the supplied InputStream
// BufferedImage image = ImageIO.read(is);
bufferedImage = ImageIO.read(blob.getBinaryStream());
outputStream = blob.setBinaryStream(0);
// test
// get all image writers for JPG format
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
if (!writers.hasNext())
throw new IllegalStateException("No writers found");
ImageWriter writer = (ImageWriter) writers.next();
ImageOutputStream ios = ImageIO.createImageOutputStream(outputStream);
writer.setOutput(ios);
ImageWriteParam param = writer.getDefaultWriteParam();
// compress to a given quality
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(quality);
// appends a complete image stream containing a single image and
//associated stream and image metadata and thumbnails to the output
writer.write(null, new IIOImage(bufferedImage, null, null), param);
// close all streams
// is.close();
// os.close();
// ios.close();
// writer.dispose();
outputStream.flush();
ios.close();
outputStream.close();
writer.dispose();
} catch (IOException e) {
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
catch(IllegalArgumentException e) {
e.printStackTrace();
}
}
} [/CODE]