2012-01-24 3 views
2

다양한 프린터에 스윙 구성 요소를 인쇄하고 있습니다. 이 프린터 중 하나는 알파 채널에 큰 문제가 있습니다. 화면에 알파 채널이있는 경우 결과 스풀 크기가 커집니다. 대부분의 경우 알파 채널을 제거했습니다. 그러나 Graphics2d.fill(Shape)을 사용하여 모양을 일부 해시 된 선으로 채우는 요소가 있으므로 해시가 무엇인지 확인할 수 있습니다. 인쇄 중에 Graphics 객체에 알파 정보를 래스터 화하지 않고이 작업을 수행 할 수있는 방법이 있습니까?래스터 화하지 않고 Graphics.fill (Shape)

대신 Graphics.drawLine()으로 전화를 사용하여 해시 된 선을 생성하면 프린터가 더 행복해 지겠지만 필자가 작성하는 모양은 매우 복잡합니다 (선 그래프입니다). 그려진 선으로 도형을 채울 수있는 방법이 있나요? 그러면 프린터가 더 행복해 집니까? 모든 Paint 구현이 본질적으로 래스터 기반 인 것처럼 보입니다.

이미지가 완전 투명하거나 전혀 표시되지 않도록하는 방법이 있습니까? 프린터의 스풀 크기에 도움이 될까요?

다음은 수평 해시 라인이 보이도록 수직 해시 라인이있는 원을 채우는 코드입니다.

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

복잡한 모양을 클립으로 사용하여 해시 라인을 그렸다고 생각하십니까?

관련 문제