Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp...

21
Java Advanced Java Advanced Image Image
  • date post

    20-Dec-2015
  • Category

    Documents

  • view

    282
  • download

    3

Transcript of Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp...

Page 1: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp

Java Advanced Java Advanced ImageImage

Page 2: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp

類別圖類別圖

PlanarImage

RenderOP

Java.awt.image.RenderedImage介面Java.awt.image.BufferedImage

Page 3: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp

ParameterBlock ParameterBlock 介紹介紹• 用來儲存 用來儲存 RenderableImageOpRenderableImageOp 或處理或處理

影像專用影像專用 class class 所需要的 所需要的 sources sources 與 參與 參數資訊數資訊

• 雖然你可以放置任意的雖然你可以放置任意的 objcet objcet 到他的 到他的 sousource vector, rce vector, 但是一般都只是放置 但是一般都只是放置 RenderRenderedImages edImages 與 與 RenderableImage object.RenderableImage object.

• 所有放在 所有放在 ParameterBlock ParameterBlock 中的中的參數都以 參數都以 object object 方式表示方式表示

short s;add(s);

short s;add(s);

short s;add( new Short(s));

short s;add( new Short(s));

意思是一樣的

Page 4: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp

ParameterBlock ParameterBlock 介紹 介紹

Side EffectSide Effect• ParameterBlock ParameterBlock 中的 中的 get get 與 與 set methset meth

ods ods 都是使用 都是使用 referencereference

ParameterBlock addSource(ParameterBlock pb, RenderableImage im) { ParameterBlock pb1 = new ParameterBlock(pb.getSources()); pb1.addSource(im); return pb1; }

ParameterBlock addSource(ParameterBlock pb, RenderableImage im) { ParameterBlock pb1 = new ParameterBlock(pb.getSources()); pb1.addSource(im); return pb1; }

例如 :

pb1 與 pb share 相同的 source Vector(a change in either is visible to both)

pb1 與 pb share 相同的 source Vector(a change in either is visible to both)

如果要真正的複製一份資料 , 你應該使用 clone

ParameterBlock pb1 = new ParameterBlock( pb.getSources().clone() );ParameterBlock pb1 = new ParameterBlock( pb.getSources().clone() );

把 source Vector clone 起來 ,把 source Vector clone 起來 ,

Page 5: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp

ParameterBlock ParameterBlock 介紹介紹cloneclone method method 與 與 shadowCloneshadowClone me me

thodthod• clone method clone method 提供 提供 ParameterBlock ParameterBlock 中中

的 的 source source 與 參數 與 參數 Vectors Vectors 的的內容內容複製複製• 所以你可以藉此更改 所以你可以藉此更改 Sources Sources 的順序的順序 , , 當改變內容當改變內容

時時 , , 會有 會有 Side EffectSide Effect

• shadowClone shadowClone 複製 複製 vectors vectors 本身的 本身的 referreferenceence

即只有 references 的複製即只有 references 的複製

Source VectorSource Vector Parameter VectorParameter VectorSource VectorSource Vector Parameter VectorParameter Vector

ObjectsObjects

Source VectorSource Vector Parameter VectorParameter VectorSource VectorSource Vector Parameter VectorParameter Vector

ObjectsObjects

Page 6: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp

ParameterBlock ParameterBlock 介紹介紹

• add method add method 傳回的是 傳回的是 thisthis• 所以我們可以方便增加 所以我們可以方便增加 objectsobjects

ParameterBlock pb = new ParameterBlock(); op = new RenderableImageOp("operation", pb.add(arg1).add(arg2) );ParameterBlock pb = new ParameterBlock(); op = new RenderableImageOp("operation", pb.add(arg1).add(arg2) );

連續增加新的 objects連續增加新的 objects

Page 7: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp

最簡單的例子最簡單的例子

import java.awt.Frame;import java.awt.image.renderable.ParameterBlock;import java.io.IOException;import javax.media.jai.Interpolation; // bilinear operator usageimport javax.media.jai.JAI;import javax.media.jai.RenderedOp; // operatorimport com.sun.media.jai.codec.FileSeekableStream; // 影像解碼使用import javax.media.jai.widget.ScrollingImagePanel;

這個程式可以 decode 所有 JAI 支援的圖形檔案格式(GIF,JPEG,TIFF,BMP,PNM,PNG) 到 RenderedImage.並且將影像利用 bilinear interpolation 的方式放大 2 倍

Page 8: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp

讀取任意檔案格式的影像讀取任意檔案格式的影像public class JAISampleProgram { public static void main(String[] args) { // Step 1: 建立相對應的 filestream FileSeekableStream stream = null; try { stream = new FileSeekableStream("as01.jpg"); } catch (IOException e) { e.printStackTrace(); System.exit(0); }

// Step 2: 建立一個 operator 用來 decode 影像檔 RenderedOp image1 = JAI.create("stream", stream);

public class JAISampleProgram { public static void main(String[] args) { // Step 1: 建立相對應的 filestream FileSeekableStream stream = null; try { stream = new FileSeekableStream("as01.jpg"); } catch (IOException e) { e.printStackTrace(); System.exit(0); }

// Step 2: 建立一個 operator 用來 decode 影像檔 RenderedOp image1 = JAI.create("stream", stream);

利用 FileSeekableStream 建立影像檔案串流

利用 FileSeekableStream 建立影像檔案串流

Page 9: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp

執行 執行 scale operatorscale operator // Step 3: 建立一個標準的 bilinear interpolation 物件 // 搭配 scale operator Interpolation interp = Interpolation.getInstance( Interpolation.INTERP_BILINEAR);

// Step 4: 利用 ParameterBlock 物件儲存必要的 input Source 與 參數 ParameterBlock params = new ParameterBlock(); params.addSource(image1); params.add(2.0F); // x scale factor params.add(2.0F); // y scale factor params.add(0.0F); // x translate params.add(0.0F); // y translate params.add(interp); // interpolation method

// Step 5: 建立一個 operator 來 scale 影像 RenderedOp image2 = JAI.create("scale", params);

// Step 3: 建立一個標準的 bilinear interpolation 物件 // 搭配 scale operator Interpolation interp = Interpolation.getInstance( Interpolation.INTERP_BILINEAR);

// Step 4: 利用 ParameterBlock 物件儲存必要的 input Source 與 參數 ParameterBlock params = new ParameterBlock(); params.addSource(image1); params.add(2.0F); // x scale factor params.add(2.0F); // y scale factor params.add(0.0F); // x translate params.add(0.0F); // y translate params.add(interp); // interpolation method

// Step 5: 建立一個 operator 來 scale 影像 RenderedOp image2 = JAI.create("scale", params);

Interpolation 物件使用 bilinear 演算法作 scale

Interpolation 物件使用 bilinear 演算法作 scale

執行 scale operator執行 scale operator

指定 scale 處理目標物指定 scale 處理目標物

Page 10: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp

顯示結果顯示結果 // 取出 Scale 後的影像寬高 int width = image2.getWidth(); int height = image2.getHeight();

// 把影像 attach 到 scrolling panel 上 // 以便顯示出來 ScrollingImagePanel panel = new ScrollingImagePanel( image2, width, height);

/* Create a frame to contain the panel. */ Frame window = new Frame("JAI Sample Program"); window.add(panel); window.pack(); window.show(); }}

// 取出 Scale 後的影像寬高 int width = image2.getWidth(); int height = image2.getHeight();

// 把影像 attach 到 scrolling panel 上 // 以便顯示出來 ScrollingImagePanel panel = new ScrollingImagePanel( image2, width, height);

/* Create a frame to contain the panel. */ Frame window = new Frame("JAI Sample Program"); window.add(panel); window.pack(); window.show(); }}

利用 ScallingImagePanel 秀結果利用 ScallingImagePanel 秀結果

JAISampleProgram.jpx

Page 11: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp

JAI JAI 支援的三種影像處理 支援的三種影像處理 modmodelsels

• The pruducer/consumer modelThe pruducer/consumer model– 基本的 基本的 AWT AWT 影像 影像 modelmodel

• The immediate mode modelThe immediate mode model– 進階的 進階的 AWT AWT 影像 影像 modelmodel

• The The pipelinepipeline model model– The JAI The JAI 所使用的影像 所使用的影像 modelmodel

Push modelPush model

Pull modelPull model

AWT Push modelAWT Push model Java 2D Immediate modeJava 2D Immediate mode Pull ModePull Mode

ImageImageImageProducerImageProducerImageConsumerImageConsumerImageObserver ImageObserver

BufferedImageBufferedImageRasterRasterBufferedImageOpBufferedImageOpRasterOpRasterOp

RenderableImagRenderableImageeRenderableImagRenderableImageOpeOpRenderedOpRenderedOpRenderableOpRenderableOpTiledImageTiledImage

Page 12: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp
Page 13: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp

Rendered GraphicsRendered Graphics

• the simplest form of rendering in JAI the simplest form of rendering in JAI • Rendered graphs are useful when it Rendered graphs are useful when it

is necessary to is necessary to work directly with work directly with the pixelsthe pixels

• ImmediateImmediate– the image source:the image source:

• have been have been evaluatedevaluated at the moment it is at the moment it is instantiated and added to the graph instantiated and added to the graph

– a new operation is added to the chain:a new operation is added to the chain:• compute its resultscompute its results immediately. immediately.

Page 14: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp

Rendered GraphicsRendered Graphics

• A Rendered graphA Rendered graph– nodesnodes are usually instances of the are usually instances of the RenderRender

edOpedOp (any subclass of PlanarImage )(any subclass of PlanarImage )• Image sources Image sources

– objects that implement the objects that implement the RenderedImagRenderedImagee interface interface

Page 15: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp

import javax.jai.*; import javax.jai.widget.*; import java.awt.Frame;

public class AddExample extends Frame { ScrollingImagePanel imagePanel1;

public AddExample(ParameterBlock param1, ParameterBlock param2) { RenderedOp im0 = JAI.create("constant", param1);. RenderedOp im1 = JAI.create("constant", param2); RenderedOp im2 = JAI.create("add", im0, im1);

// Display the original in a scrolling window imagePanel1 = new ScrollingImagePanel(im2, 100, 100); // Add the display widget to our frame. add(imagePanel1); } }

Create a constant image

Create another constant image

Add the two images together.

ExampleExample

Page 16: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp

Renderable GraphsRenderable Graphs• A A renderable graphrenderable graph is a graph that is is a graph that is nn

ot evaluated at the time it is specified ot evaluated at the time it is specified • The evaluation is deferred until there i

s a specific request for a rendering

• Pull model :Pull model :– a source image should changea source image should change before ther before ther

e is a request for rendering e is a request for rendering

deferred execution .

Page 17: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp

Renderable GraphsRenderable Graphs• A Renderable graphA Renderable graph

– is made up of is made up of nodesnodes implementing the implementing the ReRenderableImagenderableImage interface interface Instance of RenderableOP

Page 18: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp

ExampleExample

• reads a TIFF file, inverts its pixel reads a TIFF file, inverts its pixel values, then adds a constant value to values, then adds a constant value to the pixels the pixels

Page 19: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp

RenderedOp sourceImg = JAI.create("TIFF",”Jing01.tiff”);

ParameterBlock pb = new ParameterBlock(); pb.addSource(sourceImg); pb.add(null).add(null).add(null).add(null).add(null); RenderableImage ren = JAI.createRenderable("renderable", pb);

ParameterBlock pb1 = new ParameterBlock();pb1.addSource(ren);RenderableOp Op1 = JAI.createRenderable("invert", pb1);

ParameterBlock pb2 = new ParameterBlock();pb2.addSource(Op1); // Op1 as the sourcepb2.add(2.0f); // 2.0f as the constantRenderableOp Op2 = JAI.createRenderable("addconst", pb2);

AffineTransform screenResolution = ...;RenderContext rc = new RenderContext(screenResolution);RenderedImage rndImg1 = Op2.createRendering(rc);

// Display the rendering onscreen using screenResolution. imagePanel1 = new ScrollingImagePanel(rndImg1, 100, 100);

將 Rendered Image 轉換成 RenderableImage 將 Rendered Image 轉換成 RenderableImage

建立反相 operator 建立反相 operator

建立 addconst operator 建立 addconst operator

Get a rendering Get a rendering

Page 20: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp

// 取出 Scale 後的影像寬高 int width = image2.getWidth(); int height = image2.getHeight(); // Create the rotation angle (45 degrees) and convert to // radians. int value = 45; float angle = (float) (value * (Math.PI / 180.0F)); // Create a ParameterBlock and specify the source and // parameters ParameterBlock pb = new ParameterBlock(); pb.addSource(image2); // The source image pb.add(0.0F); // The x origin pb.add(0.0F); // The y origin pb.add(angle); // The rotation angle pb.add(interp); // The interpolation // Create the rotate operation RenderedOp RotatedImage = JAI.create("Rotate", pb, null);

Geometric TransformationGeometric TransformationRotationRotation

指定 rotate 處理目標物指定 rotate 處理目標物

Rotation

Page 21: Java Advanced Image. 類別圖 ParameterBlock 介紹 用來儲存 RenderableImageOp 或處理影像專 用 class 所需要的 sources 與 參數資訊 用來儲存 RenderableImageOp