相关疑难解决方法(0)

具有复杂形状的碰撞检测

我想制作一个从图像中加载每个级别的游戏.我想在Photoshop中绘制整个关卡,然后将其设置为背景并允许玩家走过它.我希望另一个不可见的图像越过顶部,在我想要碰撞的所有地方都是黑色的.

我之所以不想使用瓷砖,这对于矩形碰撞更容易,因为会有复杂的角落而不是一切都是矩形的.

这是一个好主意,是否可以轻松完成?这会是一个大CPU占用还是有更好的方法来做到这一点?

水平图像

水平图像

障碍物以红色显示

红色的障碍

java image awt java-2d collision

22
推荐指数
1
解决办法
8763
查看次数

图像/图形成形状

我想知道是否有任何方法可以将图像/图形转换为Shape?例如,我可以将摩托车形状的轮廓转换为一个,Shape以便我可以在Java中使用它吗?我知道你可以用普通方块或圆角,多边形等来做.但有没有办法做自定义形状?

java image awt image-processing shape

13
推荐指数
1
解决办法
2万
查看次数

'填充'标签中的Unicode字符

如何在Swing中的标签中"填充"Unicode字符?

我正在尝试为我最近编程的国际象棋程序制作一个用户界面(国际象棋棋子就像上面所见).在其中我使用unicode字符来表示我的棋子(\u2654通过\u265F).

问题如下:

当我将我的棋子背景设置为JLabel白色时,整个标签都被填满(在我的情况下,它是一个50*50px的白色正方形,顶部是角色).这导致我的作品看起来像瓷砖而不仅仅是他们的照片.

当我将标签设置为不透明时,我只得到我的棋子的饼干版本,而不是填充内部的那个.例如

实际结果

有没有办法只填充角色?

如果不是,我想我会制作精灵表,但我喜欢这个,因为我可以使用国际象棋棋子toString()的标签方法.

import java.awt.*;
import javax.swing.*;
import java.util.Random;

class ChessBoard {

    static Font font = new Font("Sans-Serif", Font.PLAIN, 50);
    static Random rnd = new Random();

    public static void addUnicodeCharToContainer(
        String s, Container c, boolean randomColor) {

        JLabel l = new JLabel(s);
        l.setFont(font);
        if (randomColor) {
            int r = rnd.nextInt(255);
            int g = rnd.nextInt(255);
            int b = rnd.nextInt(255);

            l.setForeground(new Color(r,g,b));
            l.setBackground(new Color(255-r,255-g,255-b));
            l.setOpaque(true);
        }
        c.add(l);
    }

    public …
Run Code Online (Sandbox Code Playgroud)

java unicode swing background character

11
推荐指数
1
解决办法
6829
查看次数

是否有适当的算法来检测图形的背景颜色?

对于大学,我们已经给出了一个任务,在给定图像的情况下,我们必须识别"数字",它们的颜色以及它们内部的"像素组"的数量.让我解释:

在此输入图像描述

上面的图像有一个图形(在图像中可以有多个图形,但让我们暂时忘记它).

  • 画布的背景颜色是0,0处的像素(在本例中为黄色)
  • 图形的边框颜色为黑色(可以是除画布背景颜色以外的任何颜色).
  • 图的背景颜色为白色(也可以与画布的背景颜色相同).
  • 图形只能有一种背景颜色.
  • 图中有两个像素组.一个是蓝色像素池,另一个是红色池,里面有一些绿色.如您所见,像素组像素的颜色无关紧要(它与图形的背景颜色不同).重要的是他们有联系(甚至是对角线).因此,尽管有两种不同的颜色,但无论如何这种群体只被认为是一种.
  • 如您所见,边界可以像您希望的那样不规则.然而,它只有一种颜色.
  • 众所周知,像素组不会触及边界.
  • 有人告诉我,除了图的背景颜色外,像素组的颜色可以是任何颜色.我假设它可以与图的边框颜色(黑色)相同.

我们已经给出了一个能够拍摄图像并将它们转换为矩阵的类(每个元素是表示像素颜色的整数).

就是这样.我是用Java做的.

我做了什么

  • 遍历矩阵中的每个像素
  • 如果我发现一个与背景颜色不同的像素,我会认为它属于图的边界.initialPixel从现在开始我会调用这个像素.
  • 请注意,initialPixel我提供的图像中的黑色像素位于图的左上角.我有目的地在那里做了一个尖锐的切口来说明它.
  • 我现在的任务是找到图形的背景颜色(在这种情况下是白色).

但是我找到这样的背景颜色(白色)会遇到很多麻烦.这是我做的最接近的方法,适用于某些情况 - 但不适用于此图像:

  • 因为我知道边框的颜色,我能找到的第一个不同的颜色,是对南方initialPixel.听起来好像是个好主意 - 它确实有效,但它不适用于所提供的图像:在这种情况下它将返回黄色,因为initialPixel它远离图形的内容.

假设我确实找到了图形的背景颜色(白色),我的下一个任务就是要意识到图中存在两个像素组.这个似乎更容易:

  • 由于我现在知道图形的背景颜色(白色),我可以尝试遍历图中的每个像素,如果我发现一个不属于边框并且不是图形背景的一部分,我已经可以告诉它有一个像素组.我可以开始递归函数来找到与这样的组相关的所有像素并"标记"它们,以便在将来的迭代中我可以完全忽略这些像素.

我需要的

是的,我的问题是关于如何找到图形的背景颜色(请记住它可以与整个图像的背景颜色相同 - 现在它是黄色的,但它也可以是白色的)基于我之前描述的内容.

我不需要任何代码 - 我只是在为这样的代码思考一个合适的算法.边界可能有如此奇怪的不规则线条的事实正在扼杀我.

或者甚至更好:我一直都做错了吗?也许我根本不应该如此关注这一点initialPixel.也许一种不同的初始方法会起作用?有关于此类主题的文档/示例吗?我意识到有很多关于"计算机视觉"等的研究,但我对这个特殊问题找不到多少.

一些代码

我的函数检索带有所有数字的向量:*注意:Figure只是一个包含一些值的类,如背景颜色和元素数量.

public Figure[] getFiguresFromImage(Image image) {
    Figure[] tempFigures = new Figure[100];
    int numberOfFigures = 0;
    matrixOfImage = image.getMatrix();
    int imageBackgroundColor = matrixOfImage[0][0];
    int pixel = 0;

    for (int y = …
Run Code Online (Sandbox Code Playgroud)

java image

8
推荐指数
1
解决办法
4807
查看次数

Java位图字体:使用不同颜色的1位图像

我想在基于Java AWT的应用程序中实现一个简单的位图字体绘图.应用程序绘制一个Graphics对象,我想在其中实现一个简单的算法:

1)加载一个文件(可能正在使用ImageIO.read(new File(fileName))),它是1位PNG,看起来像这样:

8*8位图字体

即它是16*16(或16*多,如果我想支持Unicode)矩阵8*8字符.黑色对应于背景颜色,白色对应于前景.

2)逐个字符地绘制字符串,将该位图的相关部分blit到目标Graphics.到目前为止,我只是成功了:

    int posX = ch % 16;
    int posY = ch / 16;

    int fontX = posX * CHAR_WIDTH;
    int fontY = posY * CHAR_HEIGHT;

    g.drawImage(
            font,
            dx, dy, dx + CHAR_WIDTH, dy + CHAR_HEIGHT,
            fontX, fontY, fontX + CHAR_WIDTH, fontY + CHAR_HEIGHT,
            null
    );
Run Code Online (Sandbox Code Playgroud)

它可以工作,但是,唉,它按原样使文本快照,即我无法用所需的前景和背景颜色替换黑白,我甚至无法使背景透明.

所以,问题是:在Java中是否存在一种简单(快速!)的方式将一个1位位图的一部分与另一个位图相关联,在blitting过程中将其着色(即用一个给定颜色和所有1个像素替换所有0个像素)和另外一个)?

我研究了几个解决方案,所有这些解决方案对我来说都不是最理想的:

  • 使用自定义着色BufferedImageOp,如此解决方案中所述 - 它应该可以工作,但似乎在每个blit操作之前重新着色位图是非常低效的.
  • 使用多个32位RGBA PNG,Alpha通道设置为0表示黑色像素,最大值设置为前景.每个所需的前景色都应该有自己的预渲染位图.这样我可以使背景透明并在blitting之前单独绘制为矩形,然后用我的字体选择一个位图,使用所需颜色预先着色并在该矩形上绘制一部分.对我来说似乎是一个巨大的矫枉过正 - 以及使这个选项变得更糟的原因 - 它将前景色的数量限制到相对较小的数量(即我可以逼真地加载和保持数百或数千个位图,而不是数百万)
  • 捆绑和加载自定义字体,如此解决方案中所述,但就我在Font#createFont文档中看到的情况而言,AWT Font似乎仅适用于基于矢量的字体,而不适用于基于位图的字体. …

java fonts awt bitmap lwjgl

6
推荐指数
1
解决办法
2570
查看次数

Java - 从图像边框创建一个形状

我有一个从png图像中绘制形状的类,这样我就可以使用该形状绘制我项目所需的自定义按钮的边框.这是绘制图像形状的类的代码:

public class CreateShapeClass {
    public static Area createArea(BufferedImage image, int maxTransparency) {
        Area area = new Area();
        Rectangle rectangle = new Rectangle();
        for (int x = 0; x < image.getWidth(); x++) {
            for (int y = 0; y < image.getHeight(); y++) {
                int rgb = image.getRGB(x, y);
                rgb = rgb >>> 24;
                if (rgb >= maxTransparency) {
                    rectangle.setBounds(x, y, 1, 1);
                    area.add(new Area(rectangle));
                }
            }
        }
        return area;
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,这需要很长时间来处理,我认为通过在主应用程序中预先绘制形状然后将它们存储到数组并传递给其他类,它将减少渲染时间.但是,paintBorder()方法绘制按钮边框所花费的时间也需要相当长的时间(尽管比绘制形状所需的时间短),因为上面的类生成的形状是填充的而不是空.我曾尝试使用java2d绘制形状,例如,Ellipse2D,并且按钮的渲染只需要很短的时间.在这个领域有经验的人可以教我如何生成一个BufferedImage边界的形状?我使用上面的类从PNG图像创建具有透明背景的形状.

java image border awt shape

3
推荐指数
1
解决办法
4706
查看次数

如何在 Java Swing 中制作交互式世界地图?

我想用 Java Swing 编写一个程序,它将显示世界地图,用户可以在其中单击每个国家/地区(即每个国家/地区都是一个按钮)。我认为最方便的方法是将世界地图图像拆分为按钮,但我不知道如何做到这一点。

我看了这个问题:Split image into clickable region,那里给出的答案显示了如何将图像拆分为矩形,但我必须将其拆分为任意形状。

这是我想要处理的图像: 在此处输入图片说明

java swing

1
推荐指数
1
解决办法
254
查看次数