如何将java swing面板转换为高质量图像

如何将java swing面板转换为高质量图像,java,swing,pdf,export,bufferedimage,Java,Swing,Pdf,Export,Bufferedimage,我的面板看起来像: 当我转换成图像时 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

我的面板看起来像:

当我转换成图像时

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;

可以使用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不会做任何有用的事情。

直接回答您的问题:

如何将此图像的质量更改为面板的质量

很简单,不要改变图像的大小。删除整个“将图像拉伸到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大小上快速渲染。将小图像拉伸到较大的版本总是会导致质量损失。

我想你只是忽略了我在其他帖子中的建议。你的选择。祝你好运,你什么意思?当我改变这张图片的尺寸时,我受到了启发。为了更快地得到更好的帮助,我发布了一篇文章。并不是说我以前没有对您发表过评论。请尝试在您的IDE中发布该代码,看看它是否可以编译并运行。或者更好,只需将其转储到一个空文件中,然后尝试使用命令行编译它。。。这段代码根本不编译。关于你的问题。。。当然,它看起来更大,因为你把它放大到A4,而不是使用你的面板大小。预期会发生什么?代码没有类,缺少导入。它根本不是有效的Java语法。此外,它还缺少一个主方法,允许我们运行代码并重现您的问题。您可能已经从IDE复制粘贴了此代码,但它只是完整Java file.hm thx的一部分,但这只是改变了大小,但质量仍然很差
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;
}