- 生成される画像は、大きすぎず、スペースを制限する必要があります。
- アナログとは、つまり、印刷する必要があるということです。はるかに大きなサイズを保存することを除いて、QR コードの仕組みによく似ています。
- 白黒画像
- 圧縮することができます(明らかに、その方が良いため、解凍にかかる時間もそれほど長くないため、圧縮を最小限に抑えることができます)
- 印刷密度が低いと想定でき、ピクセルあたりのビット数は、提案するソリューションに直接関係します。先に進んでください:)
3 に答える
紙に収まるようにこれを正確にエンコードする方法がわかりません...デジタル情報をよりコンパクトなアナログ表現に変換するのが最善の方法だと思います。明確にするために...提案されているのは、デジタル情報を取得し、それをアナログ媒体上でデジタル的に(ビットで)表現することです。私が言おうとしているのは、デジタル情報を取得し、それを変換して、アナログ媒体上でアナログ形式で表現することです。これを行う方法?わかりませんが、あなたをリードしています。
ボイジャーのゴールデンレコードを覚えていますか?シンプルな白黒画像とフルサイズの高解像度のカラー画像の両方で、116(115?)の画像をディスクに収めます。彼らは、512(2 ^ 9)ラインを超えるデジタルビットを表す波長のアナログボックスを使用してそれを行いました。
それが役立つかどうかはわかりませんが、おそらくそれはあなた(または他の誰か)にアイデアを与えますか?
エラー修正のオーバーヘッドがなく、解像度が 1mm であると仮定すると、1 x 1 メートルの画像が表示されます。これは、圧縮なし (データが実際にどの程度圧縮可能かによって異なります) であり、実際のエンコード スキームがないことを前提としています。これは実用的ではありません。
あなたのデータを最大 5kb のチャンクに分割し、それらをシーケンス番号と共に QR コードとしてエンコードし、QR コードのコレクションを使用します。各画像にはエラー修正が組み込まれています。おそらく200枚の15*15cmの画像になるでしょう。少なくとも、通常の紙とプリンターを使用できます。
私が QR コードを提案する理由は、エラー修正機能が組み込まれているため、インクのにじみ、紙のしわ、破れ、カメラやスキャナーが完璧とは言えないためです。さらに、エラー修正のオーバーヘッドは悪くなく、論文の 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$