1

I want to resize image came from blob column to maximize it. I make a FUNCTION for this but I get this error message

PLS-00201 - identifier ORDSYS.OrdImage must be declared

CREATE OR REPLACE FUNCTION "resize_img" (resize_img in BLOB) 
RETURN BLOB 
IS 
        vImageData BLOB; 
        vSizedImage BLOB; 
BEGIN 
   DBMS_Lob.createTemporary(vSizedImage, FALSE, DBMS_LOB.CALL); 
   ORDSYS.OrdImage.processCopy(vImageData, 'maxScale=75 75', vSizedImage); 
   RETURN vSizedImage; 
END;

enter image description here

APC
  • 144,005
  • 19
  • 170
  • 281
ramzi
  • 11
  • 3
  • For future reference please **edit your question** to include further information or clarifications. Code is especially hard to read in a comment due to the poor layout and lack of formatting. – APC Jul 14 '19 at 20:12
  • 1
    Anyway, sounds like `ordimage` may not be installed or configured in your database. You need to ask your DBA to verify that is installed and you have execute privileges on it. If not they need to [follow the documented installation process](https://docs.oracle.com/database/121/AIVUG/ch_imgref.htm#AIVUG6000). – APC Jul 14 '19 at 20:18

2 Answers2

2

Ordimage has been removed from 19c (I know you are using 12c) but here is a way to do it without Ordimage. It took me about a week to piece together from multiple sources and alot of reading, googling and trial and error.

Hopefully this will help someone else that needs to resize an image in 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';
/


  • Crap, now this stopped working. Getting a "Exception in thread "Root Thread" java.lang.NullPointerException: Could not initialize inverse tables" error at: imageBuff.getGraphics().drawImage(scaledImage, 0, 0, new Color(0,0,0), null); – Timothy Ward Mar 22 '21 at 12:51
1

Great Work Timothy !

I found some problems with ImageIO (see: Java ImageIO IIOException: Unsupported image type?), so I used the Oracle VM internal JPEG decoder instead.

Here is the java: (plsql remaines unchanged):

  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.*;
    import com.sun.image.codec.jpeg.JPEGCodec;
    
    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);  
        // weinberger 20220801 ImageIO can not handle all jpeg
          BufferedImage img = JPEGCodec.createJPEGDecoder(in).decodeAsBufferedImage();
          
          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;
     }
    }