スイングコンポーネントをさまざまなプリンタに印刷しています。これらのプリンタの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;
}
}
}
[SSCCE](http://sscce.org/)を投稿するとすぐに役立ちます。 –
@AndrewThompson、上記は私がサンプルコードを作ることができるほど短いです。まあ、私はおそらく印刷サポートを必要としませんでした。しかし、グラフィックスオブジェクトに透明なラスタを送らずに、どのように楕円を縦線で塗りつぶすことができますか? –
「サンプルコード」を掲載するのではなく、SSCCEを投稿することをお勧めしました。 ***はSSCCEではありません。 –