首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >制作适合扫描的RGB条形码像素

制作适合扫描的RGB条形码像素
EN

Code Review用户
提问于 2021-04-30 12:50:24
回答 1查看 48关注 0票数 3

类似于微软的HCCB在2015年停止使用之前,我试图制作一个2D条形码,它使用RGB像素来编码两种可能的状态(黑/白)。

理论上,在100%的数据容量下,一个像素可以容纳16,777,216个不同的整数。然而,这种级别的存储是不可行的。

考虑一下47,213,7147,213,72这两种RGB颜色:

即使在不太理想的环境和照明条件下,也必须可靠地检测到这种不可察觉的差异。

这就是为什么微软公司的HCCB只使用8种预先确定的颜色,但我假设现代相机仍能更好地检测和准确。

我想要一个条形码,你可以改变颜色之间的差距,这样两个相邻的颜色都不会比指定的数量更远。

这样,像128这样的大间隙可以使每个像素代表8种颜色--就像微软最初的HCCB;而像1这样的小间隙会给你上面提到的16,777,216种颜色。

现在我已经解释了为什么有人会想要这样做,我可以向您展示我的C代码。我不确定我在这方面做得很好,我觉得我的方法或执行方式都应该完全改变,下面是我的方法

代码语言:javascript
复制
#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;
}
EN

回答 1

Code Review用户

发布于 2021-04-30 16:02:51

这是:

代码语言:javascript
复制
static uint8_t rgb[3];
return rgb;

是个问题。假设返回数组有两个不同副本的两个不同的调用方实际上只有一个,这会中断重新入口。在这种情况下,最好按值返回,而不是通过引用返回--特别是如果您创建了一个实用程序结构。一个常见的模式是对一个三元素数组和一个由红色、绿色和蓝色组件组成的嵌套结构进行union。为了确保这是有效的,您需要告诉您的编译器使用紧密的打包,通常是使用#pragma pack。如果您对这种方法的可移植性有疑虑,并且需要支持多个外来编译器,则需要放弃union,而编写一个转换函数。

bindunbind都可以标记为static,因为它们位于同一个翻译单元中。

我在这里看到的唯一次要的事情是,两个空间的缩进是有点不标准的,而4个空间将更容易读懂。

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

https://codereview.stackexchange.com/questions/260194

复制
相关文章

相似问题

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