我想制作一个从图像中加载每个级别的游戏.我想在Photoshop中绘制整个关卡,然后将其设置为背景并允许玩家走过它.我希望另一个不可见的图像越过顶部,在我想要碰撞的所有地方都是黑色的.
我之所以不想使用瓷砖,这对于矩形碰撞更容易,因为会有复杂的角落而不是一切都是矩形的.
这是一个好主意,是否可以轻松完成?这会是一个大CPU占用还是有更好的方法来做到这一点?


我想知道是否有任何方法可以将图像/图形转换为Shape?例如,我可以将摩托车形状的轮廓转换为一个,Shape以便我可以在Java中使用它吗?我知道你可以用普通方块或圆角,多边形等来做.但有没有办法做自定义形状?
如何在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做的.
我做了什么
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 AWT的应用程序中实现一个简单的位图字体绘图.应用程序绘制一个Graphics对象,我想在其中实现一个简单的算法:
1)加载一个文件(可能正在使用ImageIO.read(new File(fileName))),它是1位PNG,看起来像这样:

即它是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个像素)和另外一个)?
我研究了几个解决方案,所有这些解决方案对我来说都不是最理想的:
Font似乎仅适用于基于矢量的字体,而不适用于基于位图的字体. …我有一个从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 Swing 编写一个程序,它将显示世界地图,用户可以在其中单击每个国家/地区(即每个国家/地区都是一个按钮)。我认为最方便的方法是将世界地图图像拆分为按钮,但我不知道如何做到这一点。
我看了这个问题:Split image into clickable region,那里给出的答案显示了如何将图像拆分为矩形,但我必须将其拆分为任意形状。