有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中以亚像素精度绘制图像

如何在java中以亚像素精度绘制图像

我在这里发现了类似的问题:

Drawing an image using sub-pixel level accuracy using Graphics2D

Sub-pixel Image rendering

不幸的是,答案中提供的解决方案并不适用于我

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    g2.translate(50.5, 50.5);
    g2.fillRect(0, 0, 15, 25);
}

使用g2.translate(50.5, 50.5);以亚像素精度填充简单矩形效果很好

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    g2.translate(50.5, 50.5);
    g2.drawImage(image, 0, 0, null);
}

然而,当我使用g2.translate(double x, double y)以亚像素精度绘制图像时,它不起作用。这与使用整数位置绘制的结果完全相同

为什么这不起作用?我用双值转换了图形,但我没有看到像素之间的任何插值


共 (1) 个答案

  1. # 1 楼答案

    这可能是OS或java版本依赖,但对我来说,使用^ {CD1>}(我认为有点黑客)工作:

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g2.translate(50.5, 50.5);
        // g2.drawImage(image, 0, 0, null); // Original code
        g2.setPaint(new TexturePaint(image, new Rectangle(image.getWidth(), image.getHeight())));
        g2.fillRect(0, 0, image.getWidth(), image.getHeight());
    
        // Added orange rect for reference, as the difference is hard to spot...
        g2.setPaint(Color.ORANGE);
        g2.fillRect(0, 0, 15, 25);
    }
    

    *)在MacOS 10.15上,使用Java 8和11进行了测试

    你可能需要放大才能看到差异,因为它有点微妙。。。但是在第一张图像(drawImage)中,你会看到橙色的矩形没有完全重叠,图像的边缘是实心的。在第二张图像(TexturePaintfillRect)中,你会看到图像的边缘是半透明的,橙色的矩形完全重叠

    screenshot of running program

    下面是在我的MacBooks内部“retina”屏幕上运行的同一个应用程序:

    screenshot of running program on high res screen