- 生成的图像必须有空间限制,不能太大。
- 我的意思是类比,它应该被打印出来。就像二维码的工作原理一样,除了存储更大的尺寸!
- 黑白图像
- 可以压缩(显然因为它更好,解压缩所花费的时间也不应该太多,所以压缩可以最小化)
- 您可以假设任何较低的打印密度,并且每像素位数将与您提出的解决方案直接相关。请继续假设:)
3 回答
我不确定您如何将其精确编码以适合纸质...我认为最好的方法是将您的数字信息转换为更紧凑的模拟表示。澄清一下……已经提出的是获取数字信息并在模拟介质上以数字方式(用位)表示它。我想说的是获取数字信息,将其转换并在模拟媒体上以模拟形式表示。这个怎么做?我不知道,但我有一个线索给你。
还记得航海者金唱片吗?它们将 116(115?)个图像放入磁盘上,包括简单的黑白图像和具有高分辨率(ish)的全尺寸彩色图像。他们使用代表 512 (2^9) 行上的数字位的模拟波长框来做到这一点。
不确定这是否有帮助,但也许它给你(或其他人)一个想法?
假设没有纠错开销和 1 毫米分辨率,您将看到 1 x 1 米的图像。这假设没有压缩(您的数据的可压缩程度实际上取决于)并且没有真正的编码方案。这是不切实际的。
我会将您的数据分解为约 5kb 的块,将它们编码为 QR 码及其序列号,并使用 QR 码的集合。每个图像都有内置的纠错功能。您最终可能会得到两百张 15*15 厘米的图像。至少你可以使用普通的纸张和打印机。
我建议使用二维码的原因是它们内置了纠错功能,因此您对墨迹模糊、纸张起皱或撕裂,或者相机/扫描仪不够完美的容忍度更高。另外,纠错的开销也不错,而且你的论文使用率达到了 90%。假设您愿意为像素使用某个最大分辨率,而不管编码方案如何。另外,它们的解码速度很快,因此得名。
如何将您的 1 MB 编码为图像并以足够高的分辨率和颜色深度打印,这是一种简单直接的方法。
数据的恢复很大程度上取决于您的扫描仪/相机或“模拟”阅读器的功能(光学分辨率等)
在这个例子中没有纠错,冗余可以包含在数据本身中。
这是一个存储这个 1.1 MB 图像的容器:
其他方法:将数据存储在纸上。
创建图像的 Perl 脚本如下(它使用convert
imageMagick):
#!/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$