2014-11-14 146 views
1

假設我有一個JPanelpanel,並且已經有一個paintComponent,我畫了一些像矩形的形狀。我可以得到一個緩衝的圖像我的面板一樣的:從JPanel獲取高分辨率圖像

int w = panel.getWidth(); 
    int h = panel.getHeight(); 
    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
    Graphics2D g = bi.createGraphics(); 
    panel.paint(g); 
    ImageIO.write(bi1, "png", new File("test.png")); 

我怎樣才能獲得高分辨率圖像從我panel的? (當前輸出圖像僅基於我的顯示器中的我的JPanel的分辨率)

我試過AffineTransform,但它沒有做我所需要的。

請注意,我已經畫出了我的panel中的所有內容,並且不想在我的paintComponent方法中更改我的繪圖。

我真的在尋找一種實用的方法,並感謝任何幫助。

+1

首先,使用'print'或'printAll',而不是'paint' – MadProgrammer

+0

定義「高分辨率」 – MadProgrammer

+0

*「我試過'AffineTransform',但它不會做什麼 我需要。「*如果它沒有做你所需要的,那麼我不明白你需要什麼。 –

回答

8

有可能會實現這一目標的兩種可能的方式,你可以調整身體的組成部分,或者你可以申請一個AffineTransformGraphics背景下,也有既...

所以,從這個屏幕的問題。 ..

Default

背景圖像是相當大的下手,並已縮小(約),以適應當前組件內,這是什麼即將降臨重要...

我再由4調整它(這個應該,大概,讓你周圍300DPI)

Dimension original = tp.getSize(); 

System.out.println("Original = " + original); 

int width = tp.getWidth() * 4; 
int height = tp.getHeight() * 4; 

System.out.println("Target = " + width + "x" + height); 
tp.setSize(width, height); 
tp.doLayout(); 
BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
Graphics2D g2d = img.createGraphics(); 
g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); 
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); 
g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); 
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); 
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); 
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); 
tp.print(g2d); 
g2d.dispose(); 

tp.setSize(original); 
tp.doLayout(); 

try { 
    ImageIO.write(img, "png", new File("Test.png")); 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} 

這就造成了...

enter image description here

好吧,好吧,背景圖像看起來很酷,但文字是關閉...

好了,相反,我們可以使用一個AffineTransform ...

int width = tp.getWidth() * 4; 
int height = tp.getHeight() * 4; 

BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
Graphics2D g2d = img.createGraphics(); 
g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); 
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); 
g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); 
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); 
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); 
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); 
g2d.setTransform(AffineTransform.getScaleInstance(4, 4)); 
tp.print(g2d); 
g2d.dispose(); 

try { 
    ImageIO.write(img, "png", new File("Test.png")); 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} 

這就造成了...

enter image description here

好了,現在圖像看起來廢話,文字是好的...


以供參考,測試代碼.. 。

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagLayout; 
import java.awt.Image; 
import java.awt.RenderingHints; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.AffineTransform; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class HiRes { 

    public static void main(String[] args) { 
     new HiRes(); 
    } 

    public HiRes() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       final TestPane tp = new TestPane(); 
       JButton print = new JButton("Print"); 
       print.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 

         Dimension original = tp.getSize(); 

         System.out.println("Original = " + original); 

         int width = tp.getWidth() * 4; 
         int height = tp.getHeight() * 4; 

         System.out.println("Target = " + width + "x" + height); 
         tp.setSize(width, height); 
         tp.doLayout(); 
         BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
         Graphics2D g2d = img.createGraphics(); 
         g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); 
         g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
         g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); 
         g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); 
         g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); 
         g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
         g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); 
         g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); 
//      g2d.setTransform(AffineTransform.getScaleInstance(4, 4)); 
         tp.print(g2d); 
         g2d.dispose(); 
         tp.setSize(original); 
         tp.doLayout(); 

         try { 
          ImageIO.write(img, "png", new File("Test.png")); 
         } catch (IOException ex) { 
          ex.printStackTrace(); 
         } 
        } 
       }); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(tp); 
       frame.add(print, BorderLayout.SOUTH); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private BufferedImage background; 

     public TestPane() { 

      setLayout(new GridBagLayout()); 

      try { 
       background = ImageIO.read(new File("/some/image/some/where")); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 

      setLayout(new GridBagLayout()); 

      JLabel label = new JLabel("This is a test"); 
      label.setForeground(Color.WHITE); 
      label.setFont(label.getFont().deriveFont(24f)); 
      add(label); 

     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (background != null) { 
       Graphics2D g2d = (Graphics2D) g.create(); 
       Image scaled = background; 
       if (getWidth() < getHeight()) { 
        scaled = background.getScaledInstance(getWidth(), -1, Image.SCALE_SMOOTH); 
       } else { 
        scaled = background.getScaledInstance(-1, getHeight(), Image.SCALE_SMOOTH); 
       } 
       int x = (getWidth() - scaled.getWidth(this))/2; 
       int y = (getHeight() - scaled.getHeight(this))/2; 
       g2d.drawImage(scaled, x, y, this); 
       g2d.dispose(); 
      } 
     } 

    } 

} 
+0

你真是太棒了。第二種方法完全適用於我的情況。您能否向我解釋發生了什麼? – Mahdi

+0

這只是一個簡單的縮放比例。本質上,你創建了一個符合你想要的大小的BufferedImage(在這種情況下是4x),你可以通過對所需比例(4x)的縮放變換將'AffineTransform'應用到Graphics'上下文中,並將該組件繪製到' BufferedImage的''圖形',API負責其餘部分 – MadProgrammer

0
  1. 使用印刷用塗料
  2. 擴展你的組件,你的圖像尺寸,然後縮放圖像回目標尺寸
  3. 使用變換會讓你的圖像模糊,嘗試擴展您的圖像8倍,你會看到不同