将图像转换为 jpeg 并对其进行压缩的 Java 类 - 输入和输出参数是一个包含图像本身的 blob

问题描述

以下问题:

我正在使用 Oracle 数据库和 Apex。 在其中一个网站中,可以将图像上传数据库

图片上传后需转jpeg并压缩。

直到现在,我们都使用 ordimage,但是 den 下一版本的数据库不再支持数据库包。

我的想法:

创建一个 java 类,用于从图像进行转换和压缩。这个类我将上传到oracle数据库。我创建了一个包装程序,并使用 blob 调用它,其中包括要转换的图像。 jave 类将转换后的图像作为 blob 返回。 我不想将转换后的文件临时保存在文件系统中!

我找到了将 blob 转换为 jpg 的解决方案。 这个程序会转换所有图像格式吗?

Convert Blob to JPG and update blob

另一方面,我找到了压缩 jpeg 的解决方案,但没有将 blob 作为输入/输出https://examples.javacodegeeks.com/desktop-java/imageio/compress-a-jpeg-file/

我是一名绝对的 Java 初学者,我是一名数据库开发人员。

你对我有什么建议吗?

您好, 霍尔格

嘿,

来自 https://examples.javacodegeeks.com/desktop-java/imageio/compress-a-jpeg-file/代码工作正常并且 jpeg 图像被压缩。

不幸的是,我需要使用 blob 作为输入和输出参数的类。

我通过 odbc 从我的数据库获取一个 jpg 图像作为 blob,然后使用 blob 调用 compressJPEG (myBlobcopy)。 为了说明发生了什么,我在类中做了一些输出调用compressJPEG之前和之后的blob大小是一样的。

这里的输出: 126 23190 myimage.jpg 检索到的 Blob 的长度:4284416 复制 Blob 的长度:4284416 调用 compressJPEG (myBlobcopy) 现在在压缩JPEG 从 compressJPEG 返回:检索到的 Blob 的长度:4284416

这里是课堂。似乎没有返回压缩图像(blob)。 请你能帮帮我吗!!!!!!

    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_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();
    }

}
} 

解决方法

The javax.imageio.ImageIO class 有方法:

  • getWriterFormatNames:返回一个字符串数组,其中列出了当前注册编写器集理解的所有非正式格式名称。
  • getWriterMIMETypes:返回一个字符串数组,其中列出了当前注册编写器集理解的所有 MIME 类型。

编写一个小的 Java 程序来运行它们并返回名称/类型,然后将其加载到 Oracle 数据库中,然后在那里运行(不要不要在安装到操作系统中的任何 JVM 中运行它因为它几乎肯定不会与数据库使用的 JVM 版本相同,您可能会发现它们支持不同的文件)。

然后您将确切知道支持哪些图像格式。