文字列を取り、文字列の各文字を色に変換し、画像を左から右に、上から下に向かって色を描くプログラムで作業しています。その後、元のメッセージを元に戻すために、同じプログラムを使用してイメージをデコードすることができます。例として、ここでは画像としてエンコードされ、clojure.core
です:文字列を画像としてエンコードすると圧縮が発生する
私はおもちゃとしてこれを書いたが、私はそれが生成する画像の興味深い特性に気づいた:彼らは、元のメッセージがいたよりも小さくしていますテキストとして。 clojure.core
の場合、それはテキストとして259kbですが、上記の画像(上記の両方の値は「ディスク上のサイズ」)として88.9kbのみです。データが失われていないことを保証するために、私はイメージをデコードし、元のメッセージを戻しました。
これはどのように可能ですか?私は画像(png
形式)には、サイズを膨らませるヘッダーやその他の追加情報があると思います。
clojure.core
は、265486文字(Notepad ++に従って)を含みます。つまり、各文字は基本的に1バイトを占めています。
BufferedImage
クラス(Java)で作業していると、色は4バイトの整数として格納されているように見えます。
ここではそれがエンコードされます方法は次のとおりです。それはそれは、多数(を掛け、それのASCII値を取得することにより、色に翻訳されます、文字列の最初の文字が
からポップされ
ので、可能な色の範囲をよりよくカバーする)、その数字は3桁の256の基数(
[123 100 200]
)に変換されます。各桁は、
BufferedImage
のsetRGB
メソッドに割り当てられた赤、緑、青のチャンネルとして扱われます。表示が進められ、次の文字がポップされ、メッセージ全体がエンコードされるまでプロセスが繰り返されます。
アルゴリズムはちょっと複雑です。 @Thumbnailはコードレビューではるかに優れた方法を提案しましたが、まだ実装されていません。結果は同じですが、それは質問のために違いをもたらすべきではありません。
答えがやや明白だったにもかかわらず、私はあなたの発見について読んだことを楽しんだ。それはいつも楽しいです。 –