2012-01-24 7 views
2

スイングコンポーネントをさまざまなプリンタに印刷しています。これらのプリンタの1つは、アルファチャンネルに大きな問題があります。画面上にアルファチャンネルがあれば、結果としてスプールサイズが大きくなります。ほとんどの場合、私はアルファチャンネルを排除しました。しかし、Graphics2d.fill(Shape)を使ってシェイプをいくつかのハッシュ線で塗りつぶす要素があるので、ハッシュの背後にあるものを見ることができます。印刷中にGraphicsオブジェクトにアルファ情報をラスタ化しないでこれを実現する方法はありますか?ラスターなしのGraphics.fill(Shape)

の代わりにGraphics.drawLine()の呼び出しを使用してハッシュされた線が生成された場合、プリンタがもっと幸せになると思いますが、塗りつぶしている図形は非常に複雑です(折れ線グラフです)。描画された線で図形を塗りつぶす方法はありますか?これはプリンタをより幸せにするでしょうか?すべてのペイントの実装は本質的にラスタベースであるようです。

画像を完全に透明にするかどうかを判断する方法はありますか?それはプリンタのスプールサイズに役立つでしょうか?

ここでは、水平ハッシュ線が表示されるように、垂直ハッシュ線で円を塗りつぶすコードを示します。

public class BufferedImagePrint extends JComponent implements Runnable, Printable { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new BufferedImagePrint()); 
    } 

    public void run() { 
     setPreferredSize(new Dimension(128, 128)); 
     final JOptionPane optionPane = new JOptionPane(this, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION, null, new Object[]{ 
       "Print", 
       "Cancel"}); 
     final JDialog dialog = optionPane.createDialog("Painting Transparent Image"); 
     dialog.setResizable(true); 
     dialog.setVisible(true); 
     if ("Print".equals(optionPane.getValue())) { 
      doPrint(); 
     } 
    } 

    private void doPrint() { 
     try { 
      final PrinterJob printerJob = PrinterJob.getPrinterJob(); 
      printerJob.setPrintable(this); 
      if(printerJob.printDialog()) { 
      printerJob.print(); 
     } 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

    @Override 
    protected void paintComponent(final Graphics g) { 
     // draw horizontal lines 
     g.setColor(Color.BLACK); 
     for (int i=0; i<getWidth(); i+=3) { 
      g.drawLine(0, i, getWidth(), i); 
     } 

     final BufferedImage img = new BufferedImage(32, 32, BufferedImage.TYPE_INT_ARGB_PRE); 
     final Graphics2D textureGraphics = img.createGraphics(); 
     textureGraphics.setColor(Color.BLACK); 
     for (int i=0; i<32; i+=4) { 
      textureGraphics.drawLine(i, 0, i, 32); 
     } 
     textureGraphics.dispose(); 
     final TexturePaint paint = new TexturePaint(img, new Rectangle(32, 32)); 
     ((Graphics2D)g).setPaint(paint); 
     g.fillOval(0, 0, getWidth(), getHeight()); 
    } 

    public int print(final Graphics graphics, final PageFormat pageFormat, final int pageIndex) throws PrinterException { 
     if (pageIndex == 0) { 
      paintComponent(graphics); 
      return PAGE_EXISTS; 
     } else { 
      return NO_SUCH_PAGE; 
     } 
    } 
} 
+1

[SSCCE](http://sscce.org/)を投稿するとすぐに役立ちます。 –

+0

@AndrewThompson、上記は私がサンプルコードを作ることができるほど短いです。まあ、私はおそらく印刷サポートを必要としませんでした。しかし、グラフィックスオブジェクトに透明なラスタを送らずに、どのように楕円を縦線で塗りつぶすことができますか? –

+0

「サンプルコード」を掲載するのではなく、SSCCEを投稿することをお勧めしました。 ***はSSCCEではありません。 –

答えて

1

形状をテンポラリイメージにペイントして、(形状の代わりに)イメージをプリンタにペイントできますか?

+0

私がペイントする透明な画像は、スプールサイズがギガバイトの範囲まで膨張する原因となります。 –

+0

アルファで描くのではなく、アルファを使って絵を描こうとしましたか?これらが処理される方法には奇妙な違いがあるかもしれません。 – Charlie

0

複雑な図形をクリップとして使用してハッシュ線を描くことを検討しましたか?

関連する問題