问题描述
我想压缩一个 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();
}
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)