当前位置: 首页 > 知识库问答 >
问题:

将图像拆分为可点击区域

郁吉星
2023-03-14

有没有办法将图像分割到区域(现在是JLabel,但如果需要我可以更改它)?
我在我的程序中使用swing,我有一个图像(这个例子是正方形),里面有一些三角形、星星和梯形(它可以是JPG、PNG等)。
这个想法是用户将点击这些形状中的一个,然后我将在用户点击的区域顶部放置另一个小图标。用户可以点击多个区域,但在一天结束时,我需要知道哪些形状被点击。

共有1个答案

楚宏胜
2023-03-14

看看我做了什么:

这是我用来测试的图像:

拆分图像后:

import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class Test {

    private JFrame frame;
    private JLabel[] labels;
    private static String imagePath = "c:/test.jpg";
    private final int rows = 3; //You should decide the values for rows and cols variables
    private final int cols = 3;
    private final int chunks = rows * cols;
    private final int SPACING = 10;//spacing between split images

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().createAndShowUI();
            }
        });
    }

    private void createAndShowUI() {
        frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        initComponents();
        frame.setResizable(false);
        frame.pack();
        frame.setVisible(true);
    }

    private void initComponents() {

        BufferedImage[] imgs = getImages();

        //set contentpane layout for grid
        frame.getContentPane().setLayout(new GridLayout(rows, cols, SPACING, SPACING));

        labels = new JLabel[imgs.length];

        //create JLabels with split images and add to frame contentPane
        for (int i = 0; i < imgs.length; i++) {
            labels[i] = new JLabel(new ImageIcon(Toolkit.getDefaultToolkit().createImage(imgs[i].getSource())));
            frame.getContentPane().add(labels[i]);
        }
    }

    private BufferedImage[] getImages() {
        File file = new File(imagePath); // I have bear.jpg in my working directory
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(file);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
        BufferedImage image = null;
        try {
            image = ImageIO.read(fis); //reading the image file
        } catch (IOException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
        int chunkWidth = image.getWidth() / cols; // determines the chunk width and height
        int chunkHeight = image.getHeight() / rows;
        int count = 0;
        BufferedImage imgs[] = new BufferedImage[chunks]; //Image array to hold image chunks
        for (int x = 0; x < rows; x++) {
            for (int y = 0; y < cols; y++) {
                //Initialize the image array with image chunks
                imgs[count] = new BufferedImage(chunkWidth, chunkHeight, image.getType());

                // draws the image chunk
                Graphics2D gr = imgs[count++].createGraphics();
                gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null);
                gr.dispose();
            }
        }
        return imgs;
    }
}

参考资料:

  • 如何将图像分割成块-Java ImageIO
 类似资料:
  • 我正在设计一个Gridview,其中每个项目都有一个TextView和ImageView。我试图找到关于如何使ImageView可点击以及GridView项目本身(两者都会触发不同的方法())的教程(逐步更新和清晰的教程)。 这就是我目前掌握的: Activity.java GV适配器.java 结果: 当Item1(Textview)被点击时,它应该点击整个Item并触发GridView的OnI

  • 我有一个问题使我的图像可点击。它是一张推车风格的照片,带有一点数字气泡,告诉你在推车里有多少件物品。div是可点击的,但照片本身是不可点击的。 下面是我的代码: 我还尝试过用一个函数将click事件添加到图像中(“clicking”),我还尝试过将“routerlink='/cart'”添加到图像标记中,但这两种方法都不奏效。 我错过了什么? 提前谢谢!!

  • 我正在尝试在文本字符串中制作可点击的链接,当单击时启动活动。我使用Linkify()来检测文本中的链接。此函数能够向文本添加链接,但只能添加Web URL。我需要将我的输出转换为ClickableSpan,以便我可以实现此技术。 如何使Linkify()的已标识链接成为可点击链接,并指向某个活动? 以下是我在Linkify中使用的代码:

  • 正如标题所示,我正在尝试创建一个有几个按钮的程序,每个按钮在单击时都会显示一张图片。但是,我想知道,如果不使用此处所示的graphic类,也不使容器全球化,这是否可能。我尝试了这个,但是,我的程序似乎没有将图像添加到我的面板中。 代码如下:

  • 使用google maps API,我有一个带有一些自定义图标的近距离标记的地图。每个标记是41px×50px,但每个标记的可点击区域是200px×200px。带标记的地图截图及其可点击区域 有什么办法可以缩小可点击区域的大小吗?

  • 现在我的问题是如何使这个图像(在网格已经被强加)可点击。 [换句话说,应用网格后图像的各个子部分必须成为可点击的按钮]。