了解图像文件的内存要求


9

我想了解要在240x400分辨率的显示器上显示的图像资源文件的内存要求。

显示器具有以下规格:

眼镜

它支持高达18位的色彩深度,并使用ILI9327显示驱动器。

假设我需要显示50个不同的图标,每个图标的大小为10毫米X 10毫米,那么需要的存储空间是多少?

这是我的计算:

每毫米像素= 400 / 61.2 = 6.536

一幅图像中的像素数= 65.36 x 65.36 = 4272像素

每个像素将需要18位X 3(对于R,G和B)= 54位

所需的总位= 4272 x 54 = 230688位= 28.16千字节

对于50张图像,我将需要1.375 MB的存储空间。

我的计算正确吗?


2
您正在计算高层存储需求。通常,图像是经过压缩的,并且动态读取和解压缩(例如从SD卡)通常比从非压缩文件中读取多余的字节更快。这通常是因为设备I / O是瓶颈。
金斯利

Answers:


17

每毫米像素= 400 / 61.2 = 6.536

对。

一幅图像中的像素数= 65.36 x 65.36 = 4272像素

好吧,您的意思是每个图标的像素数。但是即使如此,您也无法产生小数像素,因此您的数字应为65 x 65或66 x66。这将导致进一步的简化。为什么不将图标设置为64 x 64?这将简化内存的地址计算,并且只会产生大约2%的“收缩”。相信我,这么大的规模没人会注意到。然后,您的图标大小将为4096像素。

每个像素将需要18位X 3(对于R,G和B)= 54位

不。就像jms回答的那样,每个像素总计18位,或者每种颜色6位。同样,尽管如此,您应该考虑不必太担心比特级别。将您的颜色值存储为部分字节(每字节6位),每种颜色使用单独的字节。从内存转移到屏幕时,这将占用33%的内存,但将大大减少您的处理负荷。

所需的总位= 4272 x 54 = 230688位= 28.16千字节

总位为4096 x 24或98304位或12288字节。

对于50张图像,我将需要1.375 MB的存储空间。

12288乘以50得到614400字节。


1
但是可以肯定的是,如果我们谈论的是持久性存储,那么您会存储压缩为PNG或JPEG的图标吗?或者,如果我们在谈论帧缓冲区,那么它仅仅是(display_width * display_height * bpp) / 8字节?
aroth

@aroth-这将使您直接进入权衡领域。更重要的是,内存大小或处理需求?使用未压缩的图像,可以以大文件为代价,从根本上轻松转移到屏幕上。无需从较大的单词中解压缩颜色数据,甚至更加容易。解压缩压缩图像和/或应用颜色表可以使用更小的数据文件,但是对于新手来说,处理工作可能会令人生畏。这都是优先事项和品味的问题。
WhatRoughBeast

11

通过将图标设置为64×64像素,使生活变得简单。如果希望它们看起来更大,请在它们周围绘制边框。

使用16位颜色格式时,每个图标仅需要8 kB,对于50个一组,则只需400 kB。

一种简单的压缩形式是使用颜色表,而不是直接存储每个像素的颜色。对于一个图标,通常16种颜色绰绰有余,尤其是当您应用一些创造性的抖动时。这样可以将每个图标的存储空间减少到2 kB,再加上颜色表的32个字节。如果每个图标都有其自己的颜色表,则总存储量将超过101 kB。


为了满足自己的好奇心,我抓取了以下“最坏情况”图片(从此处开始):

颜色的力量

此ImageMagick命令行

convert image.jpg -crop 267x267+66+0 -resize 64x64 -colors 16 final.png

变成这样:

在此处输入图片说明

不错,当然,色彩范围更有限的源图像会变得更好。例如,以下是Olin,其处理方式相同:

在此处输入图片说明 在此处输入图片说明


2
关键字:索引颜色。如果每个位图16种颜色不足,则可以将图标划分为几个较小的位图,每个位图具有不同的调色板。应用抖动可能也有帮助。
jms

9

有关颜色深度的更多信息

扩展Dave Tweed的答案,您可以做得比他展示的还要好。

这是他使用的相同的大尺寸原稿:

裁剪为正方形并缩小为64 x 64像素,但使用完整的颜色(每个红色,grn和blu 8位)产生以下颜色:

将颜色信息从每通道8位舍入到6位会导致:

这就是您的显示器可以执行的操作,因为您说它支持18位色深。

将颜色信息进一步舍入为红色的5位,绿色的6位和蓝色的5位,总共16位/像素:

对于图标,这确实应该足够好。

即使不进行任何压缩,此格式的图标也仅占用64 x 64 x 2 = 8192字节。50个此类图像将需要409,600字节。


2
我的图像被压缩为每个像素4位(16种颜色)-每个图标2k字节,外加一个32字节的查找表。我想展示一下有限颜色的抖动效果。
戴夫·特威德

由于我们正在比较不同的颜色深度,因此要添加一个8位色图吗?在我们已经有了的4位和16位变体之间,这将是一半(对数)。
ilkkachu

@Dave:您的答案尚不清楚,但这确实解释了抖动的伪像。
Olin Lathrop

8

每个像素将需要18位X 3(对于R,G和B)= 54位

您的估计不正确。“ 18位”值是每个像素而不是每种颜色。红色,绿色和蓝色通道各自的最大位深度为6位(64个不同值),总共18位。
该显示控制器还支持16位模式(像素数据中只有红色的5位,绿色的6位和蓝色5位),这使得将每个像素打包为两个字节变得容易。这使得更容易有效地存储位图,并增加了每秒可写入显示器的像素数量。

在此处输入图片说明

一幅图像中的像素数= 65.36 x 65.36 = 4272像素

您实际上无法存储小数像素,因此您的实际位图(图像/子画面/字符/其他)可能为65 2 = 4225像素。

走简单的路线(16位R5G6B5像素格式),4225 * 16位将等于每个位图67600位,或每个位图8450字节。50张图像需要423 kB(无压缩)。

如果您确实需要完整的色彩深度,则每个像素需要2个字节以上。在那个阶段,您最好为每种颜色分配一个字节(正如WhatRoughBeast所建议的那样),这将使存储需求进一步提高3/2(对于50个65x65位图来说,为634 kB)。

您还可以将18位像素紧挨着打包在内存中(子像素位未与字节边界对齐),而不会浪费任何位。对于50个65x65的18位位图,您只需要476 kB,但是这很麻烦,而且编程起来很慢。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.