2012-04-28 28 views
1

我的面板看起来像:怎样的Java Swing面板转换为图像质量

enter image description here

当我转换为图像

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

我怎么能够这个图像的质量是否符合面板的质量?

编辑:

库,你需要编译此代码:

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

我想你只是在你的其他线程中忽略了我的建议。你的选择。祝你好运。 – 2012-04-28 19:16:20

+0

你是什么意思?当我改变这个图像的大小时,我只是从中获得灵感 – hudi 2012-04-28 19:18:39

+1

为了更快地获得更好的帮助,请发布[SSCCE](http://sscce.org/)。 不是我以前没有评论过,对你。 – 2012-04-28 19:45:45

回答

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

nope仍然是图像质量差 – hudi 2012-04-28 20:53:37

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(); 

BTW setRenderingHint在处理图形后不会做任何有用的事情

+0

hm thx但这只是改变尺寸,但质量仍然非常差 – hudi 2012-04-28 19:43:54