1

following problem:

I´m using an Oracle database and Apex. In one of the websites, it is possible to upload Images to the database.

This images shoud be converted to jpeg and compressed after upload.

Until now, we used ordimage, but this database package is not longer supported in den next versions of the database.

My idea:

Create a java class which do the converting and compressing from images. This class i will upload to the oracle database. I create a wrapper procedure which and call it with the blob, which includes the image to be converted. The jave class give back the converted image as blob. I don´t want to save the converted files temporary in filesystem!

I found a solution t convert blob to jpg. Will this program convert every image Format ?

Convert Blob to JPG and update blob

On an other side I find a solution for compress jpeg, but not with blob as input / output: https://examples.javacodegeeks.com/desktop-java/imageio/compress-a-jpeg-file/

I'm an absolut Java Beginner, I'm a database developer.

Do you have any tips for me?

Greetings, Holger

Hey,

the code from https://examples.javacodegeeks.com/desktop-java/imageio/compress-a-jpeg-file/ works fine and the jpeg images are compressed.

Unfortunaly i need the class with blob as in and out parameter.

I get a jpg image from my database as blob via odbc an then call compressJPEG (myBlobCopy) with the blob. To show what happend, i do some output in the classes. The size of the blob before an after calling the compressJPEG is the same.

Here the output: 126 23190 myimage.jpg Length of retrieved Blob: 4284416 Length of copy Blob: 4284416 Call compressJPEG (myBlobCopy) now in compressJPEG Back from compressJPEG: Length of retrieved Blob: 4284416

Here the class. It seems, that the compressed image (blob) is not returned. Please can you help me!!!!!!

    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.io.OutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
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 = "jdbc:oracle:thin:@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = xxxx)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = xxxx) ) )";
String strUserID = "xxxx";
String strPassword = "xxxx";
//step2 create  the connection object  

Connection con=DriverManager.getConnection(dbURL,strUserID,strPassword);
  
//HOSTNAME:PORT/SERVICENAME     
//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 = 126  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(compressedImageFile);
    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();
    }

}
} 
  • Step 1: Check the `javax.imageio.ImageIO` documentation and see what it says. Step 2: Test, test and test again. (Find as many image file formats as you can and convert images into those formats and test the procedure). Step 3: The answer is almost certainly no, it cannot convert **ALL** image formats; however you might find that it will convert *enough* image formats for it to be useable. – MT0 Apr 30 '21 at 13:34

1 Answers1

1

The javax.imageio.ImageIO class has the methods:

  • getWriterFormatNames: Returns an array of Strings listing all of the informal format names understood by the current set of registered writers.
  • getWriterMIMETypes: Returns an array of Strings listing all of the MIME types understood by the current set of registered writers.

Write a small Java program to run those and return the names/type and then load it into the Oracle database and then run it there (do NOT run it in any JVM installed into the operating system as it will almost certainly not be the same version JVM as the database uses and you may find they support different files).

Then you will know exactly what image formats are supported.

MT0
  • 143,790
  • 11
  • 59
  • 117