我在学物理引擎花栗鼠。在源代码中,示例演示"LogoSmash“使用char
数组存储image_data
,但我不明白如何做到这一点,太棒了!
有疑问的这是LogoSmash代码:
static const unsigned char image_bitmap[] = {
15, -16, 0, 0, ...
}
有人能解释一下这是怎么回事吗?我是怎么做到的?
发布于 2014-02-24 17:15:38
在C++中,char
是一个完整的数据类型。它保存数字,在您可能遇到的大多数实现中,它将能够保存8位数据。
24位RGB颜色表示(最常见的不编码透明信息的颜色表示)对每个红、蓝和绿通道使用8位。因此,一个char
可以容纳单个颜色通道的数据,三个char
对象可以容纳一个完整的RGB像素。如果您通过alpha通道(RGBA)包括透明度,那么四个char
对象可以完全定义一个像素。
因此,4 x width x height
char
对象数组可以由height
像素保存width
图像的像素信息。注意,人们通常在实践中使用unsigned char
s,因为签名的char
s允许负值,这对于颜色值来说通常是语义上的无稽之谈。
由于char
s只是数字,所以完全可以将图像数据直接编码到源代码中,如下所示:
unsigned char image[] = {
255, 0, 0, 0, // 1st RGBA pixel, completely red.
0, 255, 0, 0, // 2nd RGBA pixel, completely blue.
// and so on
};
对于任何复杂的图像来说,这都是不实际的,因为它要求您编写或找到一些工具来保存或将位图转换为源代码,并且需要重新编译来更改图像的任何部分(这对迭代不是很好),但是对于非常简单的演示来说,这是一种常见的技术,它不希望将演示的问题与大量的文件IO和图像读取代码等混淆起来。
但是,我不建议在生产代码中使用这种技术(或者实际上,只是从文件中加载映像,有大量的库可以帮助您这样做)。
发布于 2014-02-25 04:41:02
在花栗鼠演示的情况下,我真的试图将图像位图塞到源代码中尽可能少的空间中。
有些事情:
正如Josh所说,这并不是一种使用位图的推荐方法。通常,您会从一个单独的文件加载它们。我只是在花栗鼠演示中这样做的,因为图像非常小,我想避免使用图像加载库来进行一个原本简单的物理演示。
发布于 2014-02-25 05:04:03
我可以建议一种图像的替代表示吗?
创建一个类/结构来用您想要的任何范例(32位RGBA、24位RGB或其他任何东西)来表示您的颜色。例如:
类颜色{ uint8红色、绿色、蓝色、α;}
现在,请确保使用动态数组,并且由于它有大量数据,所以更喜欢堆而不是堆栈。完美的容器可能是std::vector。所以:
传播媒介image_data;
现在您可以管理容器,使其具有NxM像素,并且它的每个元素都表示该图像中的一个像素。现在您有了一个动态解决方案,可以扩展到任何情况,您可以很容易地在表示之间进行安全转换(原始数组与std::vector)。
无符号字符* image_data_raw = reinterpret_cast(&image_data0);
希望能帮上忙。你只需要找出你的颜色有什么样的表示,你就可以设置:)
https://gamedev.stackexchange.com/questions/70925
复制相似问题