Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Graphics2D#drawString后如何正确存储坐标?_Java_Awt_Textures_Bufferedimage_Graphics2d - Fatal编程技术网

Java 使用Graphics2D#drawString后如何正确存储坐标?

Java 使用Graphics2D#drawString后如何正确存储坐标?,java,awt,textures,bufferedimage,graphics2d,Java,Awt,Textures,Bufferedimage,Graphics2d,我试图生成一个动态图像,上面印有字母表。我正在使用java.awt.Graphics2D来实现这一点。我创建我的图像如下: var alphabet=“abcdefghijklmnopqrstuvwxyz”; 最终var映像=新的BuffereImage(256,256,BuffereImage.TYPE_INT_ARGB); var graphics=image.createGraphics(); { 图形.设置颜色(颜色.白色); graphics.setFont(新字体(Font.SANS

我试图生成一个动态图像,上面印有字母表。我正在使用
java.awt.Graphics2D
来实现这一点。我创建我的图像如下:

var alphabet=“abcdefghijklmnopqrstuvwxyz”;
最终var映像=新的BuffereImage(256,256,BuffereImage.TYPE_INT_ARGB);
var graphics=image.createGraphics();
{
图形.设置颜色(颜色.白色);
graphics.setFont(新字体(Font.SANS_SERIF,Font.PLAIN,48));
var metrics=graphics.getFontMetrics();
对于(int i=0,x=image.getMinX(),y=metrics.getAscent()+image.getMinY();iimage.getWidth()){
y+=高度;
x=0;
}
图形.抽绳(字符串.值(alpha),x,y);
x+=宽度;
}
}
}
graphics.dispose();
write(image,“PNG”,新文件(System.getProperty(“java.io.tmpdir”),“image.PNG”);
这样,我就能够创建一个256x256图像,其中包含字母表的整个序列,如下所示:

正如前面所述,我希望能够针对每个单独的字符(在我的例子中,它是专门用于OpenGL纹理渲染的),因此拥有精确的x、y、宽度和高度坐标是绝对必要的。考虑到这一点,我试图测试我的坐标是否正确。为了做到这一点,我尝试将主图像中的每个字符分割成它们自己的子图像,然后使用ImageIO写出这些子图像。为了存储数据,我使用了一个名为Glyph的自定义类

公共类图示符{
私人最终整数x,y,宽度,高度;
公共图示符(最终整数x、最终整数y、最终整数宽度、最终整数高度){
这个.x=x;
这个。y=y;
这个。宽度=宽度;
高度=高度;
}
//吸气剂
}
为了存储关于每个字符的信息,我决定使用
java.util.Map
使我的生活更轻松

var-map=newhashmap();
//上一个代码,直到Graphics2D#拉丝部分
放置(alpha,新字形(x,y,宽度,高度);
填充此列表后,我尝试获取一个
BufferedImage#getSubimage
,然后使用
ImageIO#write
直观地查看它是否有效。这就是问题所在

map.forEach((c,g)->{
var sub=image.getSubimage(g.getX(),g.getY(),g.getWidth(),g.getHeight());
write(sub,新文件(System.getProperty(“java.io.tmpdir”)),c+“.png”);
});
问题似乎就在这里,或者我是如何得到我的坐标的,因为这些图像太离谱了。子图像甚至没有包含任何接近我期望的字符的地方,这让人困惑。我不确定这是否是因为我的坐标不正确,或者getSubimage的工作方式与我想象的有点不同希望如此

在我的电脑上,以下是所有这些代码呈现的片段:

这显然是不理想的,我根本不明白发生了什么。可能发生了什么


编辑:对于那些对
var
的用法感到困惑的人,我使用的是Java 13。

这个问题的答案将取决于您是打算使用固定宽度字体还是可变宽度字体。如果您使用的是固定宽度字体,那么只需知道文本的列/行数。如果不是,那么它就会变得复杂,就像您需要存储每封信的X/Y和宽度/高度,我可以考虑使用JSON或XML,这取决于您有哪些库支持可变宽度字体,这就是为什么我选择使用<代码> FontMetrics <代码>旁边的代码> MapI会说这是一个做的和测试的事情-看看这里来教育自己。