java - java - 在 Graphics2D 上绘画时图像变得锯齿状
问题描述
我正在尝试在 Graphics2D 上绘制一个简单的图像。但是,当我旋转图像时,它会显示一些边缘,并忽略渲染提示。
它的解决方案是什么?对于 45 度等,它工作正常。但对其他人来说,它搞砸了!
谢谢
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.net.URL;
import javax.imageio.ImageIO;
public class Canvas {
public static void main(String args[]) {
try {
BufferedImage file = ImageIO.read(new URL("https://live.staticflickr.com/8710/28233783223_2387e00f93_b.jpg"));
BufferedImage bi = new BufferedImage(1000, 500, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2 = (Graphics2D) bi.getGraphics();
g2.addRenderingHints(new RenderingHints(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR));
g2.addRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
g2.setColor(Color.WHITE);
g2.fillRect(0, 0, 1000, 500);
AffineTransform ax = new AffineTransform();
ax.translate(200, 200);
ax.rotate(Math.PI * (-318) / 180, 500, 250);
g2.drawImage(file, ax, null);
g2.dispose();
ImageIO.write(bi, "png", new File("text.png"));
} catch (Exception ex) {
// error
}
}
}
解决方案
图像绘画似乎不受抗锯齿的影响。然而,绘制矩形是。通过使用TexturePaint
withfile
作为底层图像,我们可以简单地绘制一个与图像大小相同的矩形。生成的图像不会有任何锯齿状边缘。
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.net.URL;
import javax.imageio.ImageIO;
class Canvas {
public static void main(String args[]) {
try {
BufferedImage file = ImageIO.read(new URL("https://live.staticflickr.com/8710/28233783223_2387e00f93_b.jpg"));
BufferedImage bi = new BufferedImage(1000, 500, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2 = (Graphics2D) bi.getGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2.setColor(Color.WHITE);
g2.fillRect(0, 0, 1000, 500);
AffineTransform ax = new AffineTransform();
ax.translate(200, 200);
ax.rotate(Math.PI * (-318) / 180, 500, 250);
// g2.drawImage(file, ax, null);
g2.setPaint(new TexturePaint(file, new Rectangle(0,0, file.getWidth(), file.getHeight())));
g2.transform(ax);
g2.fillRect(0,0 , 1000, 500);
g2.dispose();
ImageIO.write(bi, "png", new File("text.png"));
} catch (Exception ex) {
// error
}
}
}
推荐阅读
- sql - 如何使用 count 和 group by 作为另一个表的条件
- php - 如何通过 Twilio 可编程彩信发送多个图像?(PHP)
- java - 在 Airflow 中设置 DB2
- node.js - Node.js 护照在登录时未进行身份验证
- subtitle - 为什么 SSA/ASS 不接受大于 9:59:59.99 的时间码
- html - 如何使元素在悬停时可见?
- selenium - GOCD 管道,Selenium ChromeDriver 窗口大小未设置
- amazon-web-services - ECS 使用 ECR 自动部署
- php - 如何在 Apache2 中使用 php 执行 shell 脚本?
- intellij-idea - Intellij 插件 - 我可以访问打开的编辑器窗口的内容吗?