2012-04-28 4 views
1

ように私のパネルが見えます:私はイメージどのように品質の画像にJavaのスイングパネルを変換する

public BufferedImage createImage(JPanel panel) { 

int w = (int) PageSize.A4.getWidth();//panel.getWidth(); 
int h = (int) PageSize.A4.getHeight();//panel.getHeight(); 

BufferedImage originalImage = new BufferedImage(panel.getHeight(), panel.getWidth(), BufferedImage.TYPE_BYTE_INDEXED); 
Graphics2D gg = originalImage.createGraphics(); 
gg.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
     RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
gg.setRenderingHint(RenderingHints.KEY_RENDERING, 
     RenderingHints.VALUE_RENDER_QUALITY); 
gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
     RenderingHints.VALUE_ANTIALIAS_ON); 
panel.paint(gg); 

BufferedImage resizedImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
Graphics2D g = resizedImage.createGraphics(); 
g.drawImage(originalImage, 0, 0, w, h, null); 
g.dispose(); 
g.setComposite(AlphaComposite.Src); 

g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
     RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
g.setRenderingHint(RenderingHints.KEY_RENDERING, 
     RenderingHints.VALUE_RENDER_QUALITY); 
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
     RenderingHints.VALUE_ANTIALIAS_ON); 

return resizedImage; 
} 

に変換するとき、それはひどい見えます

enter image description here

- 大きく、より悪い品質

enter image description here

どのように私はチャーパネルの品質にこのイメージのquai​​tyをnge?

EDIT:あなたはこのコードをコンパイルする必要が

ライブラリ:

import com.itextpdf.text.PageSize; 
import java.awt.AlphaComposite; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.image.BufferedImage; 
import javax.swing.JPanel; 
+0

私はあなたの他のスレッドで私の提案を無視したと思います。あなたの選択。運が良かった。 –

+0

どういう意味ですか?私はちょうど私がこの画像のサイズを変更しているときにそれに触発されました – hudi

+1

すぐにより良いヘルプのために、[SSCCE](http://sscce.org/)を投稿してください。 私はこれまであなたにコメントしていません。 –

答えて

1

質問に答えるには

この画像の品質をどのようにパネルの品質に変更できますか?

シンプルに、画像のサイズを変更しないでください。これが品質の低下の原因であるため、全体を「A4サイズにイメージを伸ばす」ようにしてください。

public BufferedImage createImage(JPanel panel) { 
    BufferedImage originalImage = new BufferedImage(
     panel.getHeight(), panel.getWidth(), 
     BufferedImage.TYPE_BYTE_INDEXED); 
    Graphics2D gg = originalImage.createGraphics(); 
    gg.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
     RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
    gg.setRenderingHint(RenderingHints.KEY_RENDERING, 
     RenderingHints.VALUE_RENDER_QUALITY); 
    gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
     RenderingHints.VALUE_ANTIALIAS_ON); 
    panel.paint(gg); 
    gg.dispose(); 
    return originalImage; 
} 

これがあなたが探しているものであるかどうかはわかりませんが、イメージを実際にA4サイズにしたい場合は、パネルをイメージに変換する前にA4サイズでシャープにレンダリングすることをお勧めします。小さいイメージをより大きなバージョンに伸ばすと、常に品質が低下します。

+0

まだ画像の品質が悪いです – hudi

1

トランスフォームのGraphics2Dを使用することができますので、パネルの塗装はすぐところでスケーリングされた画像

BufferedImage resizedImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
Graphics2D g = resizedImage.createGraphics(); 
g.transform(AffineTransform.getScaleInstance((float)panel.getWidth()/w, 
      (float)panel.getHeight()/h));//this might need to be inverted I'm not sure... 
panel.paint(g); 
g.dispose(); 

に行きますGraphicsを配置した後にsetRenderingHintは何も役に立ちません

+0

hm thxしかし、これはちょうどサイズが変わりますが、品質はまだまだ非常に悪いです – hudi

関連する問題