我的小组看起来像:
当我转换为图片时
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;
}
它看起来很糟糕 - 质量更大,质量更差
如何将此图像的质量更改为面板质量?
编辑:
您需要编译此代码的库:
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 :(得分: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();
顺便说一句,在放置图形
后,setRenderingHint不会做任何有用的事情答案 1 :(得分: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尺寸上进行精确渲染,然后再将其转换为图像。将小图像拉伸到更大的版本将始终导致质量损失。