以亚像素精度在 Java 中绘制图像
Drawing an Image in Java with Sub Pixel Accuracy
如何在 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)
以亚像素精度绘制图像时,它不起作用。和用整数位置画图完全一样
为什么这不起作用?我用 double 值翻译了图形,但我没有看到像素之间有任何插值。
这可能取决于 OS 或 Java 版本,但对我来说*,使用 TexturePaint
(我认为有点 hack)有效:
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
) 中,您会看到橙色矩形没有完美重叠,并且图像的边缘是实心的。在第二张图片(TexturePaint
和 fillRect
)中,您会看到图片的边缘是半透明的,橙色矩形完美重叠。
我的 MacBooks 内部 "retina" 屏幕上有相同的应用程序 运行:
如何在 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)
以亚像素精度绘制图像时,它不起作用。和用整数位置画图完全一样
为什么这不起作用?我用 double 值翻译了图形,但我没有看到像素之间有任何插值。
这可能取决于 OS 或 Java 版本,但对我来说*,使用 TexturePaint
(我认为有点 hack)有效:
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
) 中,您会看到橙色矩形没有完美重叠,并且图像的边缘是实心的。在第二张图片(TexturePaint
和 fillRect
)中,您会看到图片的边缘是半透明的,橙色矩形完美重叠。
我的 MacBooks 内部 "retina" 屏幕上有相同的应用程序 运行: