想要使用 blob 和图像作为输入和输出参数来压缩 jpeg

我想压缩一个 jpeg 图像,从 th oracle 数据库中的 pl/sql 过程运行一个 java 程序。

我想从带有 blob(jpeg 图像)的 pl/sql 过程调用 java 类,java 程序应该返回 blob 中的压缩图像。 我从 https://examples.javacodegeeks.com/desktop-java/imageio/compress-a-jpeg-file/ 找到了这段代码,它工作正常并且 jpeg 图像被压缩。但是这个程序在文件系统中使用了jpeg-Files,我需要原始图像和压缩图像作为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 = "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_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();
    }

  }
} 
iCMS 回答:想要使用 blob 和图像作为输入和输出参数来压缩 jpeg

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/464132.html

大家都在问