Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Saya memiliki masalah dengan pengubahan ukuran gambar di kolom gumpalan di Oracle 12c

Ordimage telah dihapus dari 19c (saya tahu Anda menggunakan 12c) tetapi di sini ada cara untuk melakukannya tanpa Ordimage. Saya membutuhkan waktu sekitar satu minggu untuk mengumpulkan dari berbagai sumber dan banyak membaca, googling, dan coba-coba.

Semoga ini akan membantu orang lain yang perlu mengubah ukuran gambar di Oracle 19c.

Oracle Functions:
function BLOB_THUMBNAIL(P_BLOB in Blob, P_MAX_SIZE in Number, P_ATTACH_SID in varchar2 := null) return Blob is

        V_DST              Blob;

    begin

        V_DST := resizeBLOB(P_BLOB, P_MAX_SIZE, P_MAX_SIZE);

    end BLOB_THUMBNAIL;

    function BLOB_THUMBNAIL_OLD(P_BLOB in Blob, P_MAX_SIZE in Number) return Blob is

        V_DST   Blob;

    begin
        DBMS_LOB.CREATETEMPORARY(V_DST, true);

        DBMS_LOB.OPEN(V_DST, DBMS_LOB.LOB_READWRITE);

        ORDSYS.ORDIMAGE.PROCESSCOPY(P_BLOB, 'maxScale=' || P_MAX_SIZE || ' ' || P_MAX_SIZE, V_DST);

        DBMS_LOB.CLOSE(V_DST);

        return V_DST;

end BLOB_THUMBNAIL_OLD;


Java Class:
SET DEFINE OFF;
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "ResizeImage" as 
import java.lang.*;
import java.sql.*;
import java.io.*;
import oracle.sql.*;
import java.awt.image.BufferedImage;
import java.awt.Image;
import java.awt.Color;
import javax.imageio.ImageIO;
import oracle.jdbc.driver.*;

public class ResizeImage extends Object
{
 public static java.sql.Blob resizeBLOB(java.sql.Blob img, int newW, int newH)
 {
  try
     {
      byte [] newdata = img.getBytes(1L, (int)img.length());
      newdata = scale(newdata, newW, newH);

      oracle.jdbc.OracleConnection conn = (oracle.jdbc.OracleConnection)new OracleDriver().defaultConnection();
      java.sql.Blob retBlob = conn.createBlob();

      try
         {
          java.io.OutputStream outStr = retBlob.setBinaryStream(0);
          outStr.write(newdata, 0, newdata.length);
          outStr.flush();
          outStr.close();
         }
      catch (IOException ioe)
           {
            System.out.println("IO Error trying to write the outputstream.");  
            ioe.printStackTrace();
           } 
           
      return retBlob;
     }
  catch (SQLException ex)
       {
        System.out.println("SQLException Error.");  
        ex.printStackTrace();
       }  

  return img;
 }

 public static byte[] scale(byte[] fileData, int width, int height) 
 {
  double newW;
  double newH;
 
  ByteArrayInputStream in = new ByteArrayInputStream(fileData);
  try 
     {
      BufferedImage img = ImageIO.read(in);

      if(height == 0) 
        height = 100; 

      if(width == 0)
        width = 100;

      //Figure new Width and Height with Aspect Ratio
      double imgW = img.getWidth();
      double imgH = img.getHeight();

      if(imgH>imgW)
        {
         newW = (imgW/imgH)*width;
         newH = height;
        }
      else
        {
         newH = (imgH/imgW)*height;
         newW = width;
        }

      Image scaledImage = img.getScaledInstance((int)newW, (int)newH, Image.SCALE_SMOOTH);
      BufferedImage imageBuff = new BufferedImage((int)newW, (int)newH, BufferedImage.TYPE_INT_RGB);
      imageBuff.getGraphics().drawImage(scaledImage, 0, 0, new Color(0,0,0), null);

      ByteArrayOutputStream buffer = new ByteArrayOutputStream();

      ImageIO.write(imageBuff, "jpg", buffer);
      return buffer.toByteArray();
     } 
   catch (IOException e)
        {
         //throw new ApplicationException("IOException in scale");
         e.printStackTrace();       
        }
  return fileData;
 }
}

Oracle Function to call Java:
CREATE OR REPLACE function resizeBLOB( p_img in blob, newW in number, newH in number) return blob
as
language java
name 'ResizeImage.resizeBLOB(java.sql.Blob, int, int) return java.sql.Blob';
/





  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL:mengurutkan baris dengan string yang dibatasi

  2. Di MySQL apakah ada fungsi seperti level di Oracle?

  3. Bagaimana cara menulis XML ke file (PL/SQL)?

  4. Dapatkan panjang nilai kolom, bukan panjang nilai maksimum kolom

  5. Database Oracle untuk mengirim pemberitahuan / Memanggil metode java untuk mencapai Waktu yang ditentukan dalam kolom