Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中以亚像素精度绘制图像_Java_Image_Graphics2d_Subpixel - Fatal编程技术网

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

在Java中以亚像素精度绘制图像,java,image,graphics2d,subpixel,Java,Image,Graphics2d,Subpixel,如何在java中以亚像素精度绘制图像 我在这里发现了类似的问题: 不幸的是,答案中提供的解决方案不适用于我 public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_

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

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

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

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(双x,双y)
以亚像素精度绘制图像时,它不起作用。这与使用整数位置绘制的结果完全相同


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

< P>这可能是OS或java版本依赖,但对我来说,使用<代码> TrutuFrase< /Cord>(我认为有点黑客)工作:

*)在MacOS10.15上,使用Java8和Java11进行了测试

您可能需要放大以查看差异,因为它有点微妙。。。但是在第一幅图像(
drawImage
)中,您将看到橙色矩形没有完全重叠,并且图像的边缘是实心的。在第二幅图像(
TexturePaint
fillRect
)中,您将看到图像的边缘是半透明的,橙色的rect完全重叠

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


我不确定您使用的是哪个版本的Java。
drawImage
的签名应该是
drawImage(buffereImage img,buffereImage op op,int x,int y)
afaik.-更正:两个签名似乎存在于不同的版本中。你在用什么JDK?我在用Java13。我也尝试了
drawImage(BuffereImage img,BuffereImage op op,int x,int y)
,但我仍然看不到像素之间的任何插值。一个可行的方法是使用图像设置
TexturePaint
,并使用它填充与原始图像相同大小的矩形(和第一个代码示例一样,使用半像素偏移量)抱歉,我仍然没有看到任何插值=(好的,对我来说很有用..MacOS上的Java 8u181。不确定你希望看到什么样的插值…它能工作AAAAAAA非常感谢你,我仍然很不确定当我最初从你的评论中尝试它时为什么不能工作,但现在它在Java 8和Java 13上都能工作,谢谢!
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);
}