簡體   English   中英

如何使用 Java 中的 Graphics2D 繪制圖像的一部分

[英]How to Draw Portion of an Image Using Graphics2D in Java

所以我正在和一個朋友一起開發一個 Discord 機器人,它可以跟蹤玩家的等級,並在使用 rank 命令時。 使用顯示各種信息的 Graphics2D 一起編輯自定義“排名卡”:基本卡如下所示:

在此處輸入圖像描述

用戶可以使用各種命令進行自定義,例如更改顏色、強調色、不透明度和背景。 所有這些都很好,除了背景命令似乎太多地擠壓圖像。 本質上,當用戶執行“.rank background”時,機器人使用 URL 鏈接到 PNG 文件(在 IMGUR 或其他類似網站上)設置為背景,我現在設置它的方式,這個背景被剪輯到默認背景的大小。 但這似乎會縮放整個圖像以適應這些范圍。

原圖URL: 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM