PSファイルでの透明度の設定 | Java
PS ドキュメントに透明度を追加する
PostScript は、ベクター グラフィック オブジェクトの描画において透明度をサポートしていません。ただし、半透明(半透明)画像は、完全に透明なピクセルと完全に不透明なピクセルのセットとしてレンダリングできます。 このような画像は マスク と呼ばれます。
Aspose.Page for Java ライブラリには、PS ドキュメントに透明画像を追加するメソッドが用意されています。ベクター グラフィック(図形やテキスト)の描画には、「擬似透明」 を使用できます。
「擬似透明」 とは、アルファ値が 255 未満の色を薄くする処理です。これは、赤、緑、青の要素をアルファ値 1 と混合することで実現されます。
「擬似透明」 では、もちろん、上の透明レイヤーの下にある下の色のレイヤーは見えませんが、下のレイヤーが白の場合に透明であるような錯覚を生み出します。
PSドキュメントに透明画像を追加する
前述の通り、透明画像はマスクとしてPSドキュメントに追加できます。Aspose.Page for Javaライブラリには、この目的のために**addTransparentImage()**メソッドが用意されています。
このメソッドは、画像が完全に不透明か、完全に透明か、あるいは半透明かを認識します。完全に不透明な場合はaddImage()メソッドで不透明画像として追加され、完全に透明な場合はドキュメントに追加されません。半透明画像の場合はPostScript画像マスクとして追加されます。
以下の例では、addImage() と addTransparentImage() を使用して PS ドキュメントに透明な画像を追加する場合の違いを示します。 白い半透明画像が見えるように、画像の下に大きな赤い四角形を配置しています。
この例では、Aspose.Page for Java ライブラリを使用して新しい PsDocument に任意の画像を追加するには、次の手順を実行します。
- 結果の PS ファイルの出力ストリームを作成します。
- デフォルトのオプションで PsSaveOptions オブジェクトを作成します。
- 作成済みの出力ストリームと保存オプションを使用して、1 ページの PsDocument を作成します。
- 新しいグラフィックス状態を作成します。
- 画像ファイルから java.awt.BufferedImage を作成します。
- 画像に必要な変換を作成します。
- 画像が不透明であることが確実な場合は、完全に不透明な画像として PsDocument に追加します (addImage() メソッドを使用)。不透明であることが確実でない場合は、透明な画像として追加します (addTransparentImage() メソッドを使用)。
- 現在のグラフィックス状態から上位レベルのグラフィックス状態に移行します。
- ページを閉じます。
- ドキュメントを保存します。
1//Create an output stream for PostScript document
2FileOutputStream outPsStream = new FileOutputStream(dataDir + "AddTransparentImage_outPS.ps");
3//Create save options with A4 size
4PsSaveOptions options = new PsSaveOptions();
5
6//Create new PS Document with the page opened
7PsDocument document = new PsDocument(outPsStream, options, false);
8
9//Add big red rectangle under images to see the difference between addImage() and addTransparentImage() methods
10document.setPaint(new Color(211, 8, 48));
11document.fill(new Rectangle2D.Float(0, 0, (int) options.getPageSize().getWidth(), 300));
12
13document.writeGraphicsSave();
14document.translate(20, 100);
15
16//Create an image from translucent image file
17BufferedImage image = ImageIO.read(new File(dataDir + "mask1.png"));
18
19//Add this image to document as usual opaque RGB image
20document.drawImage(image, new AffineTransform(1, 0, 0, 1, 100, 0), null);
21
22//Add this image to document as transparent image
23document.drawTransparentImage(image, new AffineTransform(1, 0, 0, 1, 350, 0), 255);
24
25document.writeGraphicsRestore();
26
27//Close current page
28document.closePage();
29//Save the document
30document.save();
PSドキュメントの透明部分の操作については、 .NET をご覧ください。
このコードを実行した結果は次のとおりです。
透明なベクターグラフィックオブジェクトの追加
Aspose.Page for Java ライブラリは、透明な図形とテキストに「疑似透明」と呼ばれる淡色化アルゴリズムを使用することを先ほど説明しました。
以下の例では、同じ色で塗りつぶされた 2 つの図形の違いを示しています。ただし、最初の図形はアルファコンポーネントなし、2 番目の図形はアルファコンポーネントありです。
1//Create an output stream for PostScript document
2FileOutputStream outPsStream = new FileOutputStream(dataDir + "ShowPseudoTransparency_outPS.ps");
3//Create save options with A4 size
4PsSaveOptions options = new PsSaveOptions();
5
6//Create new PS Document with the page opened
7PsDocument document = new PsDocument(outPsStream, options, false);
8
9float offsetX = 50;
10float offsetY = 100;
11float width = 200;
12float height = 100;
13
14///////////////////////////////// Create rectangle with opaque gradient fill ////////////////////////////////////////////////////////
15Rectangle2D.Float rectangle = new Rectangle2D.Float(offsetX, offsetY, width, height);
16
17LinearGradientPaint paint = new LinearGradientPaint(new Point2D.Float(0, 0), new Point2D.Float(200, 100),
18 new float [] {0, 1}, new Color [] {new Color(0, 0, 0), new Color(40, 128, 70)},
19 MultipleGradientPaint.CycleMethod.NO_CYCLE, MultipleGradientPaint.ColorSpaceType.SRGB,
20 new AffineTransform(width, 0, 0, height, offsetX, offsetY));
21
22//Set paint
23document.setPaint(paint);
24//Fill the rectangle
25document.fill(rectangle);
26/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
27
28offsetX = 350;
29
30///////////////////////////////// Create rectangle with translucent gradient fill ///////////////////////////////////////////////////
31rectangle = new Rectangle2D.Float(offsetX, offsetY, width, height);
32
33paint = new LinearGradientPaint(new Point2D.Float(0, 0), new Point2D.Float(200, 100),
34new float [] {0, 1}, new Color [] {new Color(0, 0, 0, 150), new Color(40, 128, 70, 50)},
35MultipleGradientPaint.CycleMethod.NO_CYCLE, MultipleGradientPaint.ColorSpaceType.SRGB,
36new AffineTransform(width, 0, 0, height, offsetX, offsetY));
37
38//Set paint
39document.setPaint(paint);
40//Fill the rectangle
41document.fill(rectangle);
42/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
43
44//Close current page
45document.closePage();
46//Save the document
47document.save();
このコードを実行した結果は次のように表示されます。
サンプルとデータファイルは以下からダウンロードできます。 GitHub.