Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Estou com problema com o redimensionamento da imagem na coluna blob no oracle 12c


O Ordimage foi removido do 19c (eu sei que você está usando o 12c), mas aqui está uma maneira de fazer isso sem o Ordimage. Levei cerca de uma semana para juntar várias fontes e muita leitura, pesquisa no Google e tentativa e erro.

Espero que isso ajude alguém que precise redimensionar uma imagem no 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';
/