1
  1. 生成的图像必须有空间限制,不能太大。
  2. 我的意思是类比,它应该被打印出来。就像二维码的工作原理一样,除了存储更大的尺寸!
  3. 黑白图像
  4. 可以压缩(显然因为它更好,解压缩所花费的时间也不应该太多,所以压缩可以最小化)
  5. 您可以假设任何较低的打印密度,并且每像素位数将与您提出的解决方案直接相关。请继续假设:)
4

3 回答 3

3

我不确定您如何将其精确编码以适合纸质...我认为最好的方法是将您的数字信息转换为更紧凑的模拟表示。澄清一下……已经提出的是获取数字信息并在模拟介质上以数字方式(用位)表示它。我想说的是获取数字信息,将其转换并在模拟媒体上以模拟形式表示。这个怎么做?我不知道,但我有一个线索给你。

还记得航海者金唱片吗?它们将 116(115?)个图像放入磁盘上,包括简单的黑白图像和具有高分辨率(ish)的全尺寸彩色图像。他们使用代表 512 (2^9) 行上的数字位的模拟波长框来做到这一点。

不确定这是否有帮助,但也许它给你(或其他人)一个想法?

于 2012-11-03T17:08:04.323 回答
1

假设没有纠错开销和 1 毫米分辨率,您将看到 1 x 1 米的图像。这假设没有压缩(您的数据的可压缩程度实际上取决于)并且没有真正的编码方案。这是不切实际的。

我会将您的数据分解为约 5kb 的块,将它们编码为 QR 码及其序列号,并使用 QR 码的集合。每个图像都有内置的纠错功能。您最终可能会得到两百张 15*15 厘米的图像。至少你可以使用普通的纸张和打印机。

我建议使用二维码的原因是它们内置了纠错功能,因此您对墨迹模糊、纸张起皱或撕裂,或者相机/扫描仪不够完美的容忍度更高。另外,纠错的开销也不错,而且你的论文使用率达到了 90%。假设您愿意为像素使用某个最大分辨率,而不管编码方案如何。另外,它们的解码速度很快,因此得名。

于 2012-04-10T08:42:37.563 回答
0

如何将您的 1 MB 编码为图像并以足够高的分辨率颜色深度打印,这是一种简单直接的方法。

数据的恢复很大程度上取决于您的扫描仪/相机或“模拟”阅读器的功能(光学分辨率等)

在这个例子中没有纠错,冗余可以包含在数据本身中。

这里有 1 MB 的图片

这是一个存储这个 1.1 MB 图像的容器:

此处为图片 1.1 MB 数据

图片托管在ipfs

其他方法:将数据存储在纸上

创建图像的 Perl 脚本如下(它使用convertimageMagick):

#!/usr/bin/perl

# this script take any data and make an image with it (format .png)

# deps
#  convert from ImageMagick
our $dbug=0;
#--------------------------------
# -- Options parsing ...
#
my $if = undef;
my $of = undef;
while (@ARGV && $ARGV[0] =~ m/^-/)
{
  $_ = shift;
  #/^-(l|r|i|s)(\d+)/ && (eval "\$$1 = \$2", next);
  if (/^-v(?:erbose)?/) { $verbose= 1; }
  elsif (/^-?if?=?([\w.]+)?/) { $if= $1?$1:shift; }
  elsif (/^-?of?=?([\w.]+)?/) { $of= $1?$1:shift; }
  else                  { die "Unrecognized switch: $_\n"; }

}
#understand variable=value on the command line...
eval "\$$1='$2'"while $ARGV[0] =~ /^(\w+)=(.*)/ && shift;

my $data;
if (! defined $of) {
 if (@ARGV) { $of = pop @ARGV }
 else { $of = '-' }
}
if (defined $if) {
   local *IN; 
   local $/ = undef;
   open IN,'<',$if;
   $data = <IN>;
   close IN;
} else {
   if ($ARGV > 0) { $if = '<>'; }
     elsif ($#ARGV == 0) { $if = $ARGV[0]; }
     else { $if = '-'; }
   local $/ = undef;
   $data = <>;
   close STDIN;

}
my $size = length($data);

my $pi = atan2(0,-1);
#my $iratio = 4/3; # y/x
my $iratio = $pi; # x/y

my $xy = $size/3 * ($iratio);
my $x = sqrt($xy);
if ($verbose) {
   printf STDERR "if: %s\n",$if;
   printf STDERR "of: %s\n",$of;
   printf STDERR "size: %s\n",$size;
   printf STDERR "x: %.3f\n",$x;
   printf STDERR "y: %.3f\n",$x / $iratio;
}
my $y = int($x / $iratio + $iratio);
   $x = int( ( $size / 3 + $y - 1) / $y ); 
my $n = $x*$y*3;
my $delta = $n - $size;
if ($delta < 0) {
   $x++; 
   $n = $x*$y*3;
   $delta = $n - $size;
}
my $pad = "\x00" x $delta;
if ($verbose) {
   printf STDERR "playload: %sx%s = %s\n",$x,$y,$n;
   printf STDERR "delta: %s\n", $delta;
}

my $hdr = <<"EOS";
P6
$x $y
255
EOS

#my $fname = $file; $fname =~ s,.*/,,;
#my $bname = $fname; $bname =~ s/\.[^\.]*$//;
#printf STDERR "fname: %s\n",$fname;
#printf STDERR "fname: %s.png\n",$bname;

local *PPM; open PPM,"| convert -compress LZW -strip -quality 90 ppm:- png:$of";
print PPM $hdr;
binmode(PPM);
print PPM $data;
print PPM $pad;
close PPM;

exit $?;

1; # $Source: /my/perl/scripts/dat2png.pl$
于 2021-04-11T10:32:09.080 回答