sql >> データベース >  >> RDS >> Oracle

Oracle12cのblob列の画像サイズ変更に問題があります

    Ordimageは19cから削除されました(12cを使用していることは知っています)が、Ordimageなしでそれを行う方法は次のとおりです。複数の情報源とたくさんの読書、グーグル、試行錯誤をまとめるのに約1週間かかりました。

    うまくいけば、これはOracle19cで画像のサイズを変更する必要がある他の誰かに役立つでしょう。

    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. Mysqlは特定のテーブルの最後のIDを取得します

    2. コマンドラインからSQLServerデータベースを接続する方法

    3. Android Oracle Database JDBC6

    4. Laravelチャットでの長いポーリング:divが自分自身を更新しないのはなぜですか?