venerdì 13 dicembre 2013

Oracle Tip: Image Processing in Oracle 11g

There are many ways to store images in Oracle DB. The most common manner is to store images as binary content in BLOB columns.
Starting from version 11g, Oracle introduced Oracle Multimedia (previously known as Oracle interMedia), a feature for storing images, audio, video and other multimedia data.
Oracle Multimedia introduced ORDAudio, ORDDoc, ORDImage, ORDVideo, and SI_StillImage data types and method for:
  • extracting metadata and attributes from multimedia content
  • embedding metadata generated for other application into images
  • embedding multimedia data from Oracle Multimedia, Web servers, file systems, and other servers
  • editing and transforming images
In this post, I will focus on the transformations you can apply to image data.
We start creating a table for storing a TIFF image.

CREATE TABLE AVT_IMG
(
ID NUMBER,
TIFF_IMG ORDSYS.ORDImage
);
 
We also create a database directory to the path where we store the images to be loaded into the DB.

CREATE OR REPLACE DIRECTORY avt_img_dir as 'C:\Imagenes_Blog';
 
 

We instanciate an object ORDImage and we load the TIFF image in the table AVT_IMG.

-- ORDImage.init()
INSERT INTO AVT_IMG VALUES(1,ORDImage.init());
COMMIT;
-- Load the image
DECLARE
  obj ORDSYS.ORDImage;
  ctx RAW(64) := NULL;
BEGIN
-- The import() method  also sets the object properties by reading the image blob.
  select TIFF_IMG into obj 
  from AVT_IMG 
  where ID = 1 for update;
  
  obj.setSource('FILE', 'AVT_IMG_DIR', 'flowers.tif');
  obj.import(ctx);
  update AVT_IMG set TIFF_IMG = obj where id = 1;
commit;
END;
/
 
Using ORDSYS.ORDImage methods, we can read image properties:

DECLARE
image ORDSYS.ORDImage;
compression_format VARCHAR2(4000);
img_height NUMBER;
img_width NUMBER;
content_size NUMBER;
metav XMLSequenceType;
properties_match BOOLEAN;
BEGIN
-- Load the image into a variable
SELECT TIFF_IMG INTO image FROM AVT_IMG
WHERE ID=1;
-- Check if properties are readable
properties_match := image.checkProperties();
IF properties_match THEN
DBMS_OUTPUT.PUT_LINE('Check Properties succeeded');
ELSE
DBMS_OUTPUT.PUT_LINE('Check Properties failed');
END IF;
-- Read image properties
compression_format := image.getCompressionFormat();
img_height := image.getHeight();
img_width := image.getWidth();
content_size := image.getContentLength();
DBMS_OUTPUT.PUT_LINE('Compression Format: ' || compression_format);
DBMS_OUTPUT.PUT_LINE('Height: ' || img_height);
DBMS_OUTPUT.PUT_LINE('Width: ' || img_width);
DBMS_OUTPUT.PUT_LINE('Size: ' || content_size);
COMMIT;
END;
/
 
The result is:


and it matches with the image we are using as an example.



Let's alter the table as follows:
ALTER TABLE AVT_IMG ADD (JPEG_IMG ORDSYS.ORDImage, TIFF_BLOB BLOB, JPEG_BLOB BLOB);
for storing TIFF_IMG BLOB content (without metadata) and its copy in JPEG format.
The method getContent() extracts the image BLOB content.

UPDATE AVT_IMG
SET TIFF_BLOB =  ordsys.ordimage.getContent(TIFF_IMG);
COMMIT;
 
To change the image format, for instance from TIFF to JPEG, we can use the method processCopy().
DECLARE
imgTiff blob;
imgJpeg blob;
BEGIN
UPDATE AVT_IMG SET JPEG_BLOB = empty_blob()
RETURNING TIFF_BLOB, JPEG_BLOB
INTO imgTiff, imgJpeg;
-- processCopy() method gets the following parameters: 
-- * Source file
-- * Parameter string
-- * Destination file
ordsys.ordimage.processCopy(imgTiff, 'fileformat=jpeg', imgJpeg);
UPDATE AVT_IMG SET JPEG_BLOB = imgJpeg;
COMMIT;
END;
/
 
 

We can convert between the following formats: BMPF, CALS, GIFF, JFIF, PBMF, PGMF, PICT, PNGF, PNMF, PPMF, RASF, RPIX, TGAF, TIFF, WBMP.

If we want to create an ORDImage object from the JPEG_IMG BLO, this is the code:

UPDATE AVT_IMG
SET JPEG_IMG = ordsys.ordimage(
ordsys.ordsource(
JPEG_BLOB, null, null, null, sysdate, 1 ),
null, null, null, null, null, null, null );
  
The methods process() (that overwrites the source file) and processCopy() can perform more complex operations, as adjusting image contrast, scale or rotating the image. The following code performs a 90 degrees rotation.

DECLARE
imgTiff blob;
imgJpeg blob;
BEGIN
UPDATE AVT_IMG  set JPEG_BLOB=JPEG_BLOB
RETURNING  JPEG_BLOB
INTO  imgJpeg;
ordsys.ordimage.process(imgJpeg, 'rotate=90');
UPDATE AVT_IMG SET JPEG_BLOB = imgJpeg;
COMMIT;
END;
 
 
This is just a short demo of what Oracle Multimedia can do. For more info, see http://www.oracle.com/pls/db112/portal.portal_db?selected=7&frame=#oracle_multimedia.

domenica 8 dicembre 2013

Beauty Tip: mi experiencia con la henna

Hace un par de años que empecé a teñirme el pelo con la henna. Todo comenzó con una muestra que me dieron en Lush en Londres. Llevaba tiempo dudando en si probar este producto y fue así que me animé.
Siempre me he teñido el pelo. A los 18 años me los hice de color violeta y desde entonces he probado todos los colores más comunes (incluso el rubio que me queda fatal y tengo clarisimo que nunca seré rubia, a pesar de tener el pelo de color castaño muy clarito).
La aplicación de la henna lleva algo de trabajo. La henna Lush viene en cuadraditos tipo barra de chocolate.
Hay de cuatros colores disponibles:
  • Henna Marron
  • Henna Marron Oscuro
  • Henna Negra
  • Henna Roja
Yo siempre he utilizado la Henna Roja, porque después de mi etapa dark (con cabello negro como la noche), he abandonado los tonos muy oscuros para un tono cobrizo.
Las hennas marron y negras se utilizan más como un tratamiento nutritivo para el pelo y para dar reflejos más intensos a un cabello ya castaño o negro. La Henna Roja es la única que realmente puede cambiar el color del pelo de manera significativa.
Para aplicar la henna Lush, primero hay que triturar los cuadraditos para quedarse con un polvo muy fino. He intentado varias técnicas, pero la que me da mejores resultados es poner los cuadraditos en una tabla para cortar y con un cuchillo ir pulverizando la henna.


 
En unos blogs he leido que para ablandar la henna se la puede poner unos segundos en el microondas. Personalmente no lo he hecho nunca porque no he encontrado grandes dificultades con el solo cuchillo. 
Cuando tengo el polvo, lo echo en un cuenco (ese de la foto lo venden en Mercadona por unos euritos) y le echo agua caliente (pero no hirviendo) hasta que tengo una mistura símil al barro, ni demasiado solido ni demasiado liquido. 
Si es muy caliente, lo dejo enfriar y después lo aplico sobre el pelo seco, no lavado. Para la aplicación utilizo:
  • un pincel para la tintura de pelo (comprado en el Mercadona junto con el cuenco)
  • guantes de latex (son realmente imprescindibles porque en seguida por el color que van adquiriendo os dareis cuenta de las propiedades colorantes de la henna)
  • papel de periodico para cubrir el suelo 
  • una camiseta y una toalla viejas que no me importa manchar
Para mi cabello que es medio/largo, pero muy fino a la vez, suelo utilizar dos cuadraditos pulverizado mesclados con una taza de agua caliente.

Empiezo por las raíces, como si fuera un tinte normal, y después paso al resto del pelo. El color que deja la henna suele ser muy duradero, así de una vez a otra lo único que necesita color son las raíces.

Al terminar, me envuelvo la cabeza con film plastico y lo dejo actuar mínimo dos horas. El plastico asegura calor y permite un mejor resultado. Recomiendan dejar actuar más tiempo para un color más intenso (incluso toda la noche), pero nunca he tenido tanta paciencia (ni ganas de manchar mis sabanas). Lo que recomiendo yo es que lo hagais cuando no hay nadie en casa porque no vais a estar muy sexy con un casco de plastico en la cabeza. 
Después de dos horas, me ducho y me lavo el pelo con mi champú hasta que el agua quede transparente y termino aplicando mi acondicionador.
El resultado es un color cobrizo intenso que me encanta y dura muchisimo más que cualquier tinte químico. 
Puntos positivos: 
  • el color es verdaderamente duradero
  • es un tratamiento nutritivo natural para el pelo
  • es económico (6 cuadraditos valen alrededor de 13 euros y sirven para dos/tres aplicaciones)
Puntos negativos: 
  • el olor que deja la henna en el pelo (algo similar al olor a madera, bastante fuerte) dura al menos un par de lavados 
  • puede resecar el pelo, especialmente si se utilizan champus no naturales y agresivos
  • la aplicación es muy laboriosa y requiere mucho cuidado para no manchar toda la casa de henna
Además de la henna Lush he probado la de la tienda Henna Morena (http://www.hennamorena.com/es/index) que abrió hace aproximadamente un año en el Born, Barcelona. Por lo que afirman, se trata de una henna totalmente pura, sin ingredientes añadidos (la henna de Lush viene enriquecida de mantecas entre otros ingredientes http://www.lush.es/shop/product/product/path/147_153/id/390/cabello-henna-henna-marr%C3%B3n). 
Para dar a mi pelo el tono cobrizo que busco, suelo comprar la henna que viene con una infusión de Canela, Te Negro y Ibisco. 
Los pasos para aplicar la henna son los siguientes: 

  • como la henna viene en una bolsita ya en polvo, no hace falta triturarla y la hecho directamente en un cuenco (suelo usar midad de la bolsita para una aplicación)
  • a parte preparo la infusion con la midad de la bolsita que viene en la caja (hiervo una taza de agua con
  • mezclo la henna con la infusión para obtener una mezcla simil al barro (tal como con la henna Lush). A veces añado un "chupito" de aceite para el pelo (lo más posible natural) como me aconsejaron en la tienda
  • aplico la mezcla, envuelvo mi cabeza en papel de plastico y espero entre una y dos horas porque el poder colorante es mucho mayor que el de la henna Lush
Entonces... Henna Lush o Henna Morena?
A nivel de precio, se equivalen (una caja de Henna Morena vale alrededor de 13€). A nivel de laboriosidad de preparación y aplicación, también.  No puedo decidirme entre las dos opciones. Henna Morena actua más rapido, pero también me deja un color más anaranjado (cuanto más intenso cuanto más tiempo se deja actuar). Creo que seguiré alternando las dos opciones e investigando por otros productos similares en el mercado. 

P.D. Todos los productos han sido adquiridos por mi y este post refleja mis opiniones personales.


martedì 3 dicembre 2013

Oracle Tip: OBI .rpd File path

The customer is thinking of migrating to OBIEE 11g on Exalytics. I need to migrate the .rpd file but the current installation has undergone some crazy update so it is impossible to connect and see the .rpd online in the OBIEE Client. 
The only way I had to recover the latest version of the .rpd file was locating it in the OBIEE Installation. 
The path for accessing to the current .rpd file (and previous versions of it) is: 

<OBI Root>/Middleware/instances/instance1/bifoundation/OracleBIServerComponent/coreapplication_obis1/repository