首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用char数组存储图像数据?

如何使用char数组存储图像数据?
EN

Game Development用户
提问于 2014-02-24 17:04:12
回答 3查看 13.5K关注 0票数 1

我在学物理引擎花栗鼠。在源代码中,示例演示"LogoSmash“使用char数组存储image_data,但我不明白如何做到这一点,太棒了!

有疑问的这是LogoSmash代码

代码语言:javascript
运行
复制
static const unsigned char image_bitmap[] = {
  15, -16, 0, 0, ...
}

有人能解释一下这是怎么回事吗?我是怎么做到的?

EN

回答 3

Game Development用户

回答已采纳

发布于 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 chars,因为签名的chars允许负值,这对于颜色值来说通常是语义上的无稽之谈。

由于chars只是数字,所以完全可以将图像数据直接编码到源代码中,如下所示:

代码语言:javascript
运行
复制
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和图像读取代码等混淆起来。

但是,我不建议在生产代码中使用这种技术(或者实际上,只是从文件中加载映像,有大量的库可以帮助您这样做)。

票数 6
EN

Game Development用户

发布于 2014-02-25 04:41:02

在花栗鼠演示的情况下,我真的试图将图像位图塞到源代码中尽可能少的空间中。

有些事情:

  • 它是每像素1位位图,因此数组中的每个无符号字符实际上有8个像素。时髦的get_pixel()函数就是解压缩比特的方法。
  • image_bitmap数组是由一个Ruby生成的,我在其中加载了一个.png文件,打包了图像的位,并为这个数组生成了C源代码。
  • 负数的存在只是为了使源代码总体上略短一点。

正如Josh所说,这并不是一种使用位图的推荐方法。通常,您会从一个单独的文件加载它们。我只是在花栗鼠演示中这样做的,因为图像非常小,我想避免使用图像加载库来进行一个原本简单的物理演示。

票数 2
EN

Game Development用户

发布于 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);

希望能帮上忙。你只需要找出你的颜色有什么样的表示,你就可以设置:)

票数 1
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/70925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档