我将数据存储在图像中,其中每个像素代表一个数据点(键:值对)。像素的位置表示“键”,像素的颜色表示数字“值”。数据示例如下:
| key | value |
| ---- | ----- |
| A | 255 |
| B | 1000 |
| C | 20000 |
| D | 15 |
数据将按以下方式转换为像素数据:
| pixel location | r,g,b |
| -------------- | ------- |
| 0,0 | 0,0,255 |
| 0,1 | 0,3,232 |
| 1,0 | 0,78,32 |
| 1,1 | 0,0,15 |
点到像素位置的映射由a formula完成,某些数据点“键”始终映射到相同的像素位置。 通过将数字转换为24位,然后将其划分为8位块并将其转换回具有r,g,b值的数字,可以将数值转换为r,g,b。 下面是包含655x256px的65536个数据点的实际图像
如果我准备另一个数据集,其中对“键”进行了排序,并且其等级被分配为“值”,那么我将得到一个这样的表(仅显示4行):
| key | value(**rank**) | r,g,b |
| ---- | --------------- | ----- |
| A | 0 | 0,0,0 |
| B | 1 | 0,0,1 |
| C | 2 | 0,0,2 |
| D | 3 | 0,0,3 |
如果我为65536个数据点准备等级表并转换为图像,那就是我得到的
现在,有趣的是,第二张图像具有相同数量的像素,并且包含更多的颜色值,但占用的空间更少(第一张图像为158k,第二张图像为 1.2k )。我猜这是因为我使用的公式与PNG压缩算法一致。
所以,我的问题是,通过将第二张图像用作遮罩,底漆等,我们可以使第一张图像占用更少的空间吗?我在两个图像之间尝试了XOR [1],但没有帮助。我的总体目标是在图像中尽可能无损地存储key:value对图像。
[1]:为什么要XOR?因为我需要一种可逆的方式,所以我不想丢失原始数据