问题描述
以下问题:
我正在使用 Oracle 数据库和 Apex。 在其中一个网站中,可以将图像上传到数据库。
直到现在,我们都使用 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 版本相同,您可能会发现它们支持不同的文件)。
然后您将确切知道支持哪些图像格式。