Codarea imaginilor JAI
Sistemul
de codoare JAI suporta o mare varietate de formate de imagine pentru
scrierea imaginilor spre un fisier sau spre un obiect OutputStream
pentru urmatoarele procesari.
Pentru
scrierea unei imagini intr-un fisier specificat, in formatul si cu
parametrii de codare specificati, se foloseste operatia FileStore.
Formatele suportate de operatia FileStore sunt BMP, JPEG, PNG, PNM
si TIFF.
Pentru a
coda o imagine spre un OutputStream in formatul specificat utilizand
parametrii de codare furnizati de un parametru operatie ImageEncodeParam,
se foloseste operatia Encode.
Exemplul
26. este un fragment de cod care demonstreaza
utilizarea operatiilor Encode si FileStore.
Exemplul 26. Scrierea unui obiect OutputStream
si a unui File
|
// defineste numele
fisierelor sursa si destinatie
String inputFile = /img/p1.tif
String outputFile = /img/p2.bmp
// incarca imaginea de
intrare
RenderedOp src =
JAI.create('fileload', inputFile);
// codeaza fisierul ca
si imagine BMP
FileOutputStream stream = new FileOutputStream(outputFile);
JAI.create('encode', src,
stream, BMP, null);
// stocheaza imaginea in
format BMP.
JAI.create('filestore',
src, outputFile, BMP, null);
|
Pentru a
coda in format BMP se poate utiliza operatia BMP impreuna cu
alti parametrii de codare (versiune BMP, modul de asezare a datelor
in fisier), ceea ce se exemplifica in Exemplul 2
Exemplul 2 Codarea si scrierea in
format BMP
|
File f; // fisierul in care se va stoca imaginea PlanarImage img;// imaginea sursa // OutputStream-ul spre care se scrie FileOutputStream fos = new FileOutputStream(f); // clasa JAI, specifica diferiti parametrii de codare BMP BMPEncodeParam param = new BMPEncodeParam(); // specifica versiunea BMP param.setVersion(BMPEncodeParam.VERSION_3); // specifica formatul de scriere a datelor de sus in jos param.setTopDown(true); // specifica posibilitatea de compresie a datelor param.setCompressed(false); // creeaza un codor BMP ImageEncoder enc = ImageCodec.createImageEncoder( 'BMP', fos,param); // codeaza imaginea si o scrie la OutputStream enc.encode(img); fos.close(); |
La
codarea in formatul JPEG se pot specifica diferiti parametrii si
diferite optiuni de codare, cum ar fi posibilitatea de eliminare a
header-ului JFIF, modificarea parametrilor de codare DCT (Disrete Cosine
Transform), modificarea tabelei de cuantizare, subesantionare pe
orizontala si verticala, controlul compresiei si al
calitatii imaginii, etc. Fragmentul de cod urmator (Exemplul
28.) exemplifica codarea unei imagini in format JPEG.
Exemplul 28. Codare JPEG
|
// tabela de cuatizare private int[] qTable=new int[]= ; File f; // fisierul in care se va stoca imaginea PlanarImage img;// imaginea sursa // OutputStream-ul spre care se scrie FileOutputStream fos = new FileOutputStream(f); // clasa JAI, specifica diferiti parametrii de codare JPEG JPEGEncodeParam encodeParam = new JPEGEncodeParam(); // creeaza un nou tabel de cuantizare encodeParam.setQTable(0, 1, qTable); encodeParam.setQTable(1, 1, qTable); encodeParam.setQTable(2, 1, qTable); // tabelul de cuantizare pentru datele de luminanta encodeParam.setLumaQTable(qTable); // tabelul de cuantizare pentru datele de crominanta encodeParam.setChromaQTable(qTable); // creaza un nou tabel de cuantizare si il inlocuieste pe cel existent // si configureaza nivelul de calitate a imaginii encodeParam.setQuality(0.87F); // subesantionare pe orizontala aplicata pentru fiecare banda encodeParam.setHorizontalSubsampling(0, 1); encodeParam.setHorizontalSubsampling(1, 1); encodeParam.setHorizontalSubsampling(2, 2); // subesantionare pe verticala aplicata pentru fiecare banda encodeParam.setVerticalSubsampling(0, 1); encodeParam.setVerticalSubsampling(1, 1); encodeParam.setVerticalSubsampling(2, 2); // specifica intervalul de restart in Minimum Coded Units (MCU) encodeParam.setRestartInterval(res); // scrie doar imaginea si nu scrie tabelele (JPEG abreviat) encodeParam.setWriteTablesOnly(false); encodeParam.setWriteImageOnly(true); // scrie headerul JFIF encodeParam.setWriteJFIFHeader(true); // creeaza un codor JPEG ImageEncoder encoder = ImageCodec.createImageEncoder( 'JPEG', fos, encodeParam); encoder.encode(img); // codeaza JPEG si scrie spre OutputStream fos.close(); |
In Exemplul
29. se prezinta codarea unei imagini in format PNG folosind o
codare pe 16 biti si intretesere Adam
Exemplul 29. Codare PNG
|
File f; // fisierul in care se va stoca imaginea PlanarImage img;// imaginea sursa
// OutputStream-ul spre care se scrie
FileOutputStream fos = new FileOutputStream(f);
// clasa JAI, specifica diferiti
parametrii de codare PNG
PNGEncodeParam param =
PNGEncodeParam.getDefaultEncodeParam(img);
// specifica numarul de biti adancime
doriti
param.setBitDepth(16);
// codeaza folosind intretesere Adam7
param.setInterlacing(true);
// creeaza un codor PNG avand parametrii
specificati
ImageEncoder enc = ImageCodec.createImageEncoder(
'PNG',
fos, param);
// codare si scriere in fisier
enc.encode(img);
fos.close(); |
Exemplul
urmator (Exemplul 30.) ilustreaza modul de codare si
scriere intr-un fisier de format PNM, folosind un format ASCII de
reprezentare a datelor.
Exemplul 30. Codare in format PNM
|
File f; // fisierul in care se va stoca imaginea PlanarImage img;// imaginea sursa // OutputStream-ul spre care se scrie FileOutputStream fos = new FileOutputStream(f); // clasa JAI, specifica diferiti parametrii de codare PNM PNMEncodeParam param = new PNMEncodeParam(); // specifica modul de codare ASCII param.setRaw(true); // creeaza codorul ImageEncoder enc = ImageCodec.createImageEncoder( 'PNM', fos, param); // codeaza imaginea apoi o scrie in fisier enc.encode(img); fos.close(); |
Exemplul
31. reprezinta un fragment de cod care
codeaza o sursa Rendered in format TIFF.
Exemplul 31. Codare in format TIFF
|
File f; // fisierul in care se va stoca imaginea PlanarImage img;// imaginea sursa // OutputStream-ul spre care se scrie FileOutputStream fos = new FileOutputStream(f); // clasa JAI, specifica diferiti parametrii de codare TIFF TIFFEncodeParam param = new TIFFEncodeParam(); // scrie datele in format segmentat param.setWriteTiled(true); // creeaza codorul ImageEncoder enc = ImageCodec.createImageEncoder( 'TIFF', fos, param); // codeaza si scrie in fisier enc.encode(img); fos.close(); |