类似于微软的HCCB在2015年停止使用之前,我试图制作一个2D条形码,它使用RGB像素来编码两种可能的状态(黑/白)。
理论上,在100%的数据容量下,一个像素可以容纳16,777,216个不同的整数。然而,这种级别的存储是不可行的。
考虑一下47,213,71和47,213,72这两种RGB颜色:

即使在不太理想的环境和照明条件下,也必须可靠地检测到这种不可察觉的差异。
这就是为什么微软公司的HCCB只使用8种预先确定的颜色,但我假设现代相机仍能更好地检测和准确。
我想要一个条形码,你可以改变颜色之间的差距,这样两个相邻的颜色都不会比指定的数量更远。
这样,像128这样的大间隙可以使每个像素代表8种颜色--就像微软最初的HCCB;而像1这样的小间隙会给你上面提到的16,777,216种颜色。
现在我已经解释了为什么有人会想要这样做,我可以向您展示我的C代码。我不确定我在这方面做得很好,我觉得我的方法或执行方式都应该完全改变,下面是我的方法
#include <stdio.h>
#include <stdint.h>
uint8_t* bind(uint32_t val, uint8_t bound){
static uint8_t rgb[3];
uint32_t buffer[3];
uint32_t max = bound*(256/bound);
buffer[0] = val * bound;
buffer[1] = (buffer[0]/max)*bound;
buffer[2] = (buffer[1]/max)*bound;
rgb[0] = buffer[0] % max;
rgb[1] = buffer[1] % max;
rgb[2] = buffer[2] % max;
return rgb;
}
uint32_t unbind(uint8_t* rgb, uint8_t bound){
uint32_t max = 256/bound;
return (rgb[0]/bound)+(rgb[1]/bound)*max+(rgb[2]/bound)*max*max;
}
int main(void) {
uint32_t data = 1;
uint8_t color_range = 128;
uint8_t* colors = bind(data, color_range);
uint32_t calculated = unbind(colors, color_range);
printf("expected value: %u\nreturned value: %u\n\n", data, calculated);
printf("rgb value: %u,%u,%u\n", colors[0], colors[1], colors[2]);
return 0;
}发布于 2021-04-30 16:02:51
这是:
static uint8_t rgb[3];
return rgb;是个问题。假设返回数组有两个不同副本的两个不同的调用方实际上只有一个,这会中断重新入口。在这种情况下,最好按值返回,而不是通过引用返回--特别是如果您创建了一个实用程序结构。一个常见的模式是对一个三元素数组和一个由红色、绿色和蓝色组件组成的嵌套结构进行union。为了确保这是有效的,您需要告诉您的编译器使用紧密的打包,通常是使用#pragma pack。如果您对这种方法的可移植性有疑虑,并且需要支持多个外来编译器,则需要放弃union,而编写一个转换函数。
bind和unbind都可以标记为static,因为它们位于同一个翻译单元中。
我在这里看到的唯一次要的事情是,两个空间的缩进是有点不标准的,而4个空间将更容易读懂。
https://codereview.stackexchange.com/questions/260194
复制相似问题