Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog
20 décembre 2007 4 20 /12 /décembre /2007 11:00

Purpose

Here is a Java Bean that allows reading, displaying with scaling and writing images.

It allows scaling images to fit the target item size, and includes a FileChooser with image preview dialog.

In its third version, it does not need any JDBC connexion to handle images from/to the database
.

It uses the JRE 1.4 javax.imageio.ImageIO package, so it needs, at least the Sun Java plugin 1.4.
It won't run against JInitiator.



handleimage3



The Java code

     HandleImage.java      GetImageFileName.java



The implementation class of the Bean Item

     oracle.forms.fd.HandleImage


The methods you can call




Read an image from a file

Set_Custom_Property('BLOCK.ITEM',1,'READIMGFILE','the_complete_filename');

e.g.:
-- read image from the file system --
Set_Custom_Property( 'BLZ.BEAN', 1, 'READIMGFILE', 'D:/image.jpg' ) ;
 

-- read image from the JAR file --
Set_Custom_Property( 'BLZ.BEAN', 1, 'READIMGFILE', '/image.jpg' ) ;

-- read image from the Internet --
Set_Custom_Property( 'BLZ.BEAN', 1, 'READIMGFILE', 'http://the_url/image.jpg' ) ;




Read an image from the database table

The reading process is composed by three steps:

1. Select the Blob table's column
2. Read the image chunks and send them to the Java Bean
3. End the sending process


1. Select the Blob table's column:

Pkg_Read_Blob_Image.Select_Blob(LC$Clause); (*)

LC$Clause is a string that must contain the Select order to fetch the corresponding single row:

 LC$Clause := 'Select PHOTO_JAVA From PHOTOS Where IDENTIFIANT = 10'  ;
 -- Select the Blob column --
 If Pkg_Read_Blob_Image.Select_Blob(LC$Clause) Then
    ...


2. Read the image chunks from the database then send them to the Java Bean:

Pkg_Read_Blob_Image.Get_B64_Chunk() (*)

     -- Get the image chunks from the database --
     LC$Image := Pkg_Read_Blob_Image.Get_B64_Chunk ;
     If LC$Image Is Not Null Then
       -- Send the chunks to the Java Bean --
       Set_Custom_Property( 'BLZ.BEAN', 1, 'READIMGBASE', LC$Image ) ;

3. End the sending process:

     Else
       -- End the sending process --
       Set_Custom_Property( 'BLZ.BEAN', 1, 'READIMGBASE', '[END_IMAGE]' )
;


(*) the PKG_READ_BLOB_IMAGE database's package is provided with the zip file.


e.g.:

PROCEDURE Read_Image IS
  LB$Ok      boolean ;
  LC$Image   Varchar2(32767) ;
  LC$Clause  Varchar2(4000) ;
BEGIN
 
 --
 -- Read an image from the database
 --
 LC$Clause := 'Select PHOTO_JAVA From PHOTOS Where IDENTIFIANT = ' || :PHOTOS.IDENTIFIANT ;
 -- Select the Blob column --
 If Pkg_Read_Blob_Image.Select_Blob(LC$Clause) Then
   Loop
     -- Get the image chunks from the database --
     LC$Image := Pkg_Read_Blob_Image.Get_B64_Chunk ;
     If LC$Image Is Not Null Then
       -- Send the chunks to the Java Bean --
       Set_Custom_Property( 'BLZ.BEAN', 1, 'READIMGBASE', LC$Image ) ;
     Else
       -- End the sending process --
       Set_Custom_Property( 'BLZ.BEAN', 1, 'READIMGBASE', '[END_IMAGE]' ) ;
       Exit ;
     End if ; 
   End loop ;
 End if ; 
  
END;



Put this method into the When-New-Record-Instance block-level trigger


Write an image to the database table

The writing process is also composed by three steps:

1. Initialize the transfer
2. Read the image chunks from the Java Bean and send them to the database
3. Update the Blob column with the new content


1. Initialize the transfer:

Pkg_Read_Blob_Image.Init_Transfer() (*)

This will empty the current Blob column:

 Pkg_Read_Blob_Image.Init_Transfer ;

2. Read the image chunks from the Java Bean and send them to the database:

Get_Custom_Property('BLZ.BEAN',1,'GETIMAGE');

Pkg_Read_Blob_Image.Set_B64_Chunk(LC$Req) (*)

    Loop
      -- Get the image chunk from the Java Bean --
      LC$Req := Get_Custom_Property('BLZ.BEAN',1,'GETIMAGE');
      Exit When LC$Req is null ;
      ...   
      -- Send the image chunks to the Database --
      Pkg_Read_Blob_Image.Set_B64_Chunk(LC$Req);
    End loop;

3. Update the Blob column with the new content:

     LC$Res := Pkg_Read_Blob_Image.Save_Blob('PHOTOS','PHOTO_JAVA','IDENTIFIANT=' || :PHOTOS.IDENTIFIANT );

The Save_Blob() function takes the table name, the blob column name and the Where clause arguments.


(*) the PKG_READ_BLOB_IMAGE database's package is provided with the zip file.

Put this method into the Post-Insert and Post-Update block-level trigger

e.g.:

PROCEDURE Save_Image IS
    LC$Req  Varchar2(32000);
    LN$Cpt  Pls_integer := 0 ;
    LC$Res  Varchar2(2000) ;
BEGIN
    --
    -- Save the image to the database
    --
    Loop
      -- Get the image chunk from the Java Bean --
      LC$Req := Get_Custom_Property('BLZ.BEAN',1,'GETIMAGE');
      Exit When LC$Req is null ;
      LN$Cpt := LN$Cpt + 1 ;
      If Ln$Cpt = 1 Then
         Pkg_Read_Blob_Image.Init_Transfer ;
      End if ;  
      -- Send the image chunks to the Database --
      Pkg_Read_Blob_Image.Set_B64_Chunk(LC$Req);
    End loop;
    If LN$Cpt > 0 Then
      -- Update the Blob column with the new content --
      LC$Res := Pkg_Read_Blob_Image.Save_Blob('PHOTOS','PHOTO_JAVA','IDENTIFIANT=' || :PHOTOS.IDENTIFIANT );
    End if ;
    Clear_Message ;
    Message('Result:'|| LC$Res, no_acknowledge);
END;


Put this method into the Post-Insert and Post-Update block-level triggers


Clear the image

Set_Custom_Property( 'BL.BEAN', 1, '
CLEAR' , '' ) ;

This function has to be called in a When-New-Record-Instance trigger if the record does not exist:

When-New-Record-Instance trigger:
If :PHOTOS.IDENTIFIANT is not null Then
   Read_Image ;
Else
   Set_Custom_Property( 'BLZ.BEAN', 1, 'CLEAR', '' ) ;
End if ;
:BLZ.IMG_SIZE := Get_Custom_Property( 'BLZ.BEAN', 1, 'GETSIZE' ) ;


Set the display image scalling

This function concerns only the image displayed. The image stored with the WRITEIMGBASE method will be the initial image.

Set_Custom_Property( 'BL.BEAN', 1, '
SCALE_IMAGE
','Width=x,Height= y' ) ;

Both Width and Height parameters must be transmitted

x and y can take the following values:


Any value greater then 0 that express an absolute size in pixels
the special value: FIT that extends the image to fit the exact size of the image panel' size
-1 that to keep the corresponding aspect ratio
0 that indicates no scale at all



Examples:

-- Scale the image to fit horizontally and vertically the image item --

Set_Custom_Property('BLZ.BEAN',1,'SCALE_IMAGE', 'Width=FIT,Height=FIT' ) ;

-- Scale the image to 200x100 pixels --
Set_Custom_Property('BLZ.BEAN',1,'SCALE_IMAGE', 'Width=200,Height=100' ) ;

-- Scale the image to 200 horizontal pixels and keep vertical aspect ratio --
Set_Custom_Property('BLZ.BEAN',1,'SCALE_IMAGE', 'Width=200,Height=-1' ) ;





Display/hide the image panel' scrollbars

Set_Custom_Property('BLOCK.ITEM',1,'SETSCROLL','true|false');


e.g.:
Set_Custom_Property( 'BLZ.BEAN', 1, 'SETSCROLL', 'true' ) ; 





Set the item border

Set_Custom_Property('BLOCK.ITEM',1,'SETBORDER','thick[,color]');


e.g.:

-- set a null border --
Set_Custom_Property( 'BLZ.BEAN', 1, 'SETBORDER', '0' ) ; 

-- set a 4 pixel red border --
Set_Custom_Property( 'BLZ.BEAN', 1, 'SETBORDER', '4,r255g0b0' ) ; 



Set the JFileChooser title and starting directory

Set_Custom_Property('BLOCK.ITEM',1,'SET_FILECHOOSER_TITLE','title[,directory]');

e.g.:
Set_Custom_Property( 'BLZ.BEAN', 1, 'SET_FILECHOOSER_TITLE', 'Select a file,D:/' ) ; 

the directory argument is not mandatory



Set the JFileChooser Look and Feel


Set_Custom_Property('BLOCK.ITEM',1,'SET_FILECHOOSER_LAF','SYSTEM|other_value');


e.g.:
-- use the current O.S. L&F --
Set_Custom_Property( 'BLZ.BEAN', 1, 'SET_FILECHOOSER_LAF ', 'SYSTEM' ) ;
 

-- use the Metal L&F --
Set_Custom_Property( 'BLZ.BEAN', 1, 'SET_FILECHOOSER_LAF ', 'JAVA' ) ;
 


Set the log mode to output the Bean messages

Set_Custom_Property( 'BL
.BEAN', 1, 'SETLOG' , 'true|false' ) ;



In the sample dialog provided, here is the code used in the When-New-Form-Instance trigger:

PROCEDURE InitForm IS
BEGIN
  -- switch the log to true --
  Set_Custom_Property( 'BLZ.BEAN', 1, 'SETLOG', 'true' ) ;
  -- set the baen image bckground color --
  Set_Custom_Property( 'BLZ.BEAN', 1, 'SETBG', '255,255,255' ) ;
  -- Set the JFileChooser title --
  Set_Custom_Property( 'BLZ.BEAN', 1, 'SET_FILECHOOSER_TITLE',  'Select an image file' ) ;
  -- Set the JFileChooser L&F --
  Set_Custom_Property( 'BLZ.BEAN', 1, 'SET_FILECHOOSER_LAF', 'SYSTEM' ) ;
  -- scalling properties --

  Set_Custom_Property('BLZ.BEAN',1,'SCALE_IMAGE','Width=FIT,Height=FIT' ) ;
  -- display scrollbars policy --
  Set_Custom_Property( 'BLZ.BEAN', 1, 'SETSCROLL',  'false' ) ;
 
END;

Here is the description of the database table used:

CREATE TABLE PHOTOS
   (   
      "IDENTIFIANT" NUMBER(5,0) NOT NULL ENABLE,
      "NOM" VARCHAR2(50 BYTE),
      "PHOTO" BLOB,
      "PHOTO_JAVA" BLOB,
      CONSTRAINT "PHOTO_PK" PRIMARY KEY ("IDENTIFIANT") ENABLE
   )
/



The properties you can get from the JavaBean


Get the image size

Varchar2 :=
Get_Custom_Property( 'BL.BEAN', 1, 'GETSIZE'
) ;

The format returned (width,height) is like the following : 50,120



Get the
selected filename (JFileChooser)

Varchar2 :=
Get_Custom_Property( 'BL.BEAN', 1, 'GET_FILE_NAME' ) ;

this method both displays the JFileChooser and returns the selected file.



Get the current image chunks

Varchar2 :=
Get_Custom_Property( 'BL.BEAN', 1, 'GETIMAGE' ) ;

This method returns the last image read by the READIMGFILE() method..
It returns null when the image is completly read.

 


The events raised to Forms


Two events are raised by the Java Bean to Forms:

 

MOUSE_CLICKED and MOUSE_DOUBLECLICKED that you can trap through the When-Custom-Item-Event trigger:

 

DECLARE
    eventName varchar2(30) := :system.custom_item_event;
    eventValues ParamList;
    eventValueType number;
BEGIN
   IF (eventName='MOUSE_DOUBLECLICKED') THEN
      Message('Mouse double-click',no_acknowledge);
   ElsIF (eventName='MOUSE_CLICKED') THEN
      Message('Mouse click',no_acknowledge);
   END IF;
END;


 

The sample dialog


     . Download the handleimage3.zip file
     . Unzip the file
     . run the create_table.sql script under the Oracle user you want to test (It creates the sample image table).
     . run the PKG_READ_BLOB_IMAGE.sql script under the Oracle user you want to test (It creates the database package).
     . copy the handleimage3.jar file in the <ORACLE_HOME>/forms/java directory
     . Edit your /forms/server/formsweb.cfg file to add the handleimage3.jar .
     . Open the HANDLEIMAGE3.fmb module (Oracle Forms 9.0.2)
     . Compile all and run the module



Note : If you rebuild the jar file, it has to be signed. (the handleimage3.jar file provided in this article is already signed).
Partager cet article
Repost0

commentaires

D
HouseMaid Vacuuming Services has generated itself being leading residential house cleaning company through Dubai with the help of professional cleaning solutions to handle on an appropriate mode. We make an attempt to provide superior standard from home vacuuming services for the purpose of Villas through Dubai. A lot of our skilled, veteran and respectable maids give good results quickly & economically, making a lives much simpler.
Répondre
N
Hi,<br /> I tried to run this bean in Oracle eBusiness Suite 12.3 but I'm not successfully.<br /> I copied the jar file to /opt/oracle/tproi/apps/tech_st/10.1.2/forms/java<br /> I changed formsweb.cfg (/opt/oracle/tproi/apps/tech_st/10.1.2/forms/server)<br /> from<br /> archive_jini=frmall_jinit.jar<br /> archive=frmall.jar<br /> <br /> to<br /> archive_jini=frmall_jinit.jar,handleimage3.jar<br /> archive=frmall.jar,handleimage3.jar<br /> <br /> I compiled the a sample forms file and tried to start it. The forms opens but it does not works correctly.<br /> On Java Console we got an Exception:<br /> java.lang.ClassNotFoundException: oracle.forms.fd.HandleImage<br /> <br /> Even tried to add the handleimage3.jar to classpath. But no effect. Did I forgot something?<br /> <br /> No help from Oracle support via Metalink.<br /> <br /> Any idea
Répondre
O
Kondiloma akuminata atau yang sering disebut sebagai kutil kelamin, merupakan salah satu penyakit seksual menular (PMS) yang disebabkan oleh virus yang bernama Humanpapilloma virus (HPV). Terdapat lebih dari 40 jenis HPV yang dapat menginfeksi daerah kelamin laki-laki dan perempuan. Jenis HPV ini juga dapat menginfeksi mulut dan tenggorokan. Kebanyakan orang yang terinfeksi dengan HPV bahkan tidak tahu mereka memilikinya. HPV tidak sama dengan herpes atau HIV (AIDS).
Répondre
W
<br /> Hi,<br /> <br /> <br /> everything worked fine until I updated to 10.1.2.3.<br /> <br /> <br /> When I try  to open a form witch is using handleImage3.jar, the application freezes.<br /> <br /> <br />  <br /> <br /> <br /> Do you have any idea?<br /> <br /> <br />  <br /> <br /> <br /> Thank you,<br /> <br /> <br />  <br /> <br /> <br /> Werner<br /> <br /> <br /> <br /> <br />
Répondre
O
<br /> Re-load the zip file from the site to get the new JAR file.<br /> <br /> <br />
A
<br /> Hi,<br />  <br /> I have try the PJC Project for view Images in Forms (handleimage3.zip) on the Oracle Forms Community PJC Library. <br /> I have a question about this PJC.<br /> Is it possible to view other files on instead of Images? I.e. an Office Document (doc.xls) ?<br /> I try to make a preview about this Office Document inside of the Canvas not on an separate Window.<br />  <br />  <br /> thanks <br /> <br /> Alfred<br /> <br />  <br />  
Répondre
A
Dear i have a problem when run it on the application no thing happen any help plz
O
<br /> <br /> This one is made to display images only.<br /> <br /> <br /> If you want to display other kind of documents, see the following article instead:<br /> http://forms.pjc.bean.over-blog.com/article-5029633.html<br /> <br /> <br /> <br />