libGDX 2.3 Pixmap的升华——像素的艺术
2023-12-17 06:27:10
Pixmap的进阶
从Pixmap像素图到.png
通常我们使用Pixmap的第一个场景就是从一张图片中生成一个Pixmap对象。比如从纹理、从屏幕、从文件、从网络中读取的图像等。一旦我们得到了这个Pixmap对象,我们将能够对其进行很多种操作,这些操作被称为Pixmap的扩展操作,比如获取像素的颜色,设置像素的颜色,绘制各种基本形状、裁剪Pixmap的一部分、缩放Pixmap 等。
但作为程序员来说,除了通过Pixmap对像素进行操作之外,我们更加期待的是能够将Pixmap的数据提取出来,因为直接使用这些数据,将能进行一些Pixmap对象无法做到的操作。
libGDX中的Pixmap实现了Writable、Serializable接口,所以我们完全可以将Pixmap对象的数据以字节流 或者序列化 的方式保存起来,然后再次使用的时候直接从保存的字节流中或者序列化中恢复 这个对象,从而直接获取它的数据。
libGDX同样也提供了现成的从Pixmap创建图片文件的方法,通过下面的方式,我们可以将Pixmap对象转换成一张PNG格式的图片文件 :
pixmap.toPNG(OutputStream)
从.png到.cim
有时候我们将图像转换成Pixmap的对象来处理,可能不是为了修改这个对象,而是为了把这个对象转换成另外一种图像文件格式。
比如此时我们手中有一张.png格式的图像,但实际项目中我们希望以.cim格式的图像文件来保存,那么我们可以先通过libGDX提供的PixmapLoader从这张.png图像中得到一个Pixmap对象,然后再将其保存为.cim格式的图像文件。
同样我们还是使用toXXX的方法来保存Pixmap为.cim格式:
PixmapIO.writeCIM(OutputStream, pixmap)
RGBA与int的转换
Pixmap对象的一个重要特性就是它可以通过内部的像素数据直接创建一个BufferedImage对象。
BufferedImage可以使用整型值来表示一个像素的颜色,int类型能表示的颜色值空间称为ARGB,ARGB全称为Alpha、Red、Green、Blue,也就是alpha通道、红色通道、绿色通道、蓝色通道。在ARGB模型中,每个通道的取值范围都是0~255,255是最强的颜色值,而0是最弱的颜色值。ARGB值中0代表完全透明,255代表完全不透明。
而libGDX的Pixmap的每一个像素点是通过RGBA的值来表示颜色的,RGBA与ARGB是完全等价的。所以我们可以很方便的通过以下代码从Pixmap对象中得到一个BufferedImage对象:
BufferedImage bufferedImage = SwingFXUtils.fromLibGDXBufferedImage(pixmap)
这样我们就可以使用BufferedImage进行进一步的操作,比如创建一个BufferedImage对象,并往这个对象中绘制Pixmap,或者将这个BufferedImage对象保存成一个PNG文件。
绘制图案
Pixmap除了可以显示一张图片,同样它也能让我们绘制一个图案。因为Pixmap的本质就是一张像素的集合,所以我们只要直接修改集合中的每一个元素即可,比如要画一个实心的矩形,那么我们就可以用下面的方法:
pixmap.setColor(Color.BLACK);
pixmap.fillRectangle(0,0,100,100);
这行代码会填充一个黑色的实心矩形,左上角坐标为(0,0),宽100像素,高100像素。
像素的艺术
像素艺术也是一种很经典的艺术,这种艺术是通过方方正正的像素点绘制而成,我们无法直接使用Pixmap在JavaFX中直接绘制出一个像素,但是,我们可以通过Pixmap的fillRectangle方法来创建像素。
比如我们可以创建一个矩形(也就是一个像素),然后设置它的颜色,再将它画在舞台上。通过这种方式,我们就能够用Pixmap来绘制出许多有趣的作品。
如果想更进一步,我们甚至可以创建一个绘图小程序,让用户可以在画布上直接绘制像素,然后将绘制好的图像保存成一张PNG文件。
总结
通过本节的学习,我们已经对libGDX中的Pixmap有了更加深入的了解,我们知道了如何从Pixmap中得到像素的颜色,如何设置像素的颜色,如何绘制各种基本形状、裁剪Pixmap的一部分、缩放Pixmap,以及如何将Pixmap保存成PNG文件,如何将Pixmap转换为.cim格式的文件,如何将Pixmap的像素值转换成int值,如何将int值转换成Pixmap的像素值,以及如何使用Pixmap来绘制各种图案。