如何在Java中使用Graphics2D绘制图像的一部分

知识:

因此,我正在与一个朋友一起开发一个Discord机器人,该机器人可以跟踪玩家的等级,并且在使用!rank命令时,将使用显示各种信息的Graphics2D一起编辑自定义的“ Rank Card”。基本卡如下所示:

在此处输入图片说明

用户可以使用各种命令(例如更改颜色,强调颜色,不透明度和背景)来自定义此命令。所有这些都很好用,除了背景命令似乎过多地挤压图像。本质上,当用户执行“!rank background”时,机器人会使用该URL链接到PNG文件(在IMGUR或其他类似网站上)以设置为背景。我现在设置的方式是,将背景剪裁为默认背景的大小,但这似乎可以缩放整个图像以适合这些范围。

原始图片网址:https//cdn.discordapp.com/attachments/558371806655021108/733489277031153764/image0.jpg

在此处输入图片说明

如您所见,当我想要的只是新图像的一些随机部分的一小片时,即使整个图像都被压缩为适合整个背景的默认背景形状(即使图像的一部分被切掉) )。

我正在寻找的是一种方法,即只取一小张较大的图像,然后将其绘制为背景。我不需要将整个图像压缩到背景中,只需要默认背景大小的一小部分即可。

BufferedImage base = ImageIO.read(new File("data/images/rankCardBase.png"));
BufferedImage outline = ImageIO.read(new File("data/images/rankCardOutline.png"));
Graphics2D g = (Graphics2D) base.getGraphics();
 
//Add Custom Background
if (!player.getString("background").isEmpty()) {
    BufferedImage background = ImageIO.read(new URL(player.getString("background")));
    BufferedImage rectBuffer = new BufferedImage(base.getWidth(), base.getHeight(), BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2 = rectBuffer.createGraphics();
    g2.setClip(new Rectangle2D.Float(0, 0, base.getWidth(), base.getHeight()));
    g2.drawImage(background, 0, 0, base.getWidth(), base.getHeight(), 0, 0, background.getWidth(), background.getHeight(), null);
    g.drawImage(rectBuffer, 0, 0, base.getWidth(), base.getHeight(), null);
}
食品程序:

本质上,g2.drawImage(background, 0, 0, base.getWidth(), base.getHeight(), 0, 0, background.getWidth(), background.getHeight(), null);将尝试缩放图像以适合指定区域。

相反,您可以只在某个(可能是随机的)点上绘制图像,例如,以下内容将背景置于基本图像的中心...

例

BufferedImage baseImage = new BufferedImage(400, 121, BufferedImage.TYPE_INT_RGB);
BufferedImage background = ImageIO.read(new URL("https://cdn.discordapp.com/attachments/558371806655021108/733489277031153764/image0.jpg"));

Graphics2D g2d = baseImage.createGraphics();
g2d.setColor(Color.GRAY);
g2d.fillRect(0, 0, 400, 121);

g2d.setClip(new RoundRectangle2D.Float(20, 20, baseImage.getWidth() - 40, baseImage.getHeight() - 40, 20, 20));

Random rnd = new Random();

int x = baseImage.getWidth() - background.getWidth() / 2;
int y = baseImage.getHeight() - background.getHeight() / 2;

g2d.drawImage(background, x, y, null);

g2d.dispose();

JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(baseImage)));

另一个想法可能是看 BufferedImage#getSubImage

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章