2017-01-22 14 views
7

文字列を取り、文字列の各文字を色に変換し、画像を左から右に、上から下に向かって色を描くプログラムで作業しています。その後、元のメッセージを元に戻すために、同じプログラムを使用してイメージをデコードすることができます。例として、ここでは画像としてエンコードされ、clojure.coreです:文字列を画像としてエンコードすると圧縮が発生する

Clojure.core encoded as an image

私はおもちゃとしてこれを書いたが、私はそれが生成する画像の興味深い特性に気づいた:彼らは、元のメッセージがいたよりも小さくしていますテキストとして。 clojure.coreの場合、それはテキストとして259kbですが、上記の画像(上記の両方の値は「ディスク上のサイズ」)として88.9kbのみです。データが失われていないことを保証するために、私はイメージをデコードし、元のメッセージを戻しました。

これはどのように可能ですか?私は画像(png形式)には、サイズを膨らませるヘッダーやその他の追加情報があると思います。

clojure.coreは、265486文字(Notepad ++に従って)を含みます。つまり、各文字は基本的に1バイトを占めています。

BufferedImageクラス(Java)で作業していると、色は4バイトの整数として格納されているように見えます。

ここではそれがエンコードされます方法は次のとおりです。それはそれは、多数(を掛け、それのASCII値を取得することにより、色に翻訳されます、文字列の最初の文字が

  • からポップされ

    1. ので、可能な色の範囲をよりよくカバーする)、その数字は3桁の256の基数([123 100 200])に変換されます。

    2. 各桁は、BufferedImagesetRGBメソッドに割り当てられた赤、緑、青のチャンネルとして扱われます。

    3. 表示が進められ、次の文字がポップされ、メッセージ全体がエンコードされるまでプロセスが繰り返されます。

    アルゴリズムはちょっと複雑です。 @Thumbnailはコードレビューではるかに優れた方法を提案しましたが、まだ実装されていません。結果は同じですが、それは質問のために違いをもたらすべきではありません。

  • +2

    答えがやや明白だったにもかかわらず、私はあなたの発見について読んだことを楽しんだ。それはいつも楽しいです。 –

    答えて

    7

    ポータブルネットワークグラフィックス(PNG)は、無損失データ圧縮(https://en.wikipedia.org/wiki/Portable_Network_Graphics)、iowをサポートするラスターグラフィックスファイル形式です。画像データは.pngファイルとして保存されると圧縮されます。

    +0

    Doh。それは振り返って明らかです。ありがとう。 – Carcigenicate

    +0

    PNGがZlib/Deflate圧縮を使用していることを言及することはおそらく価値があります(また、テキストファイルでDeflateを使用してより良い結果が得られる可能性が高い)。 – haraldK

    +0

    @haraldKそれは私の期待でもあります。 deflateに加えて、pngは "実際の"画像(統計的にピクセルはその近傍ピクセルに非常によく似ています)の圧縮に役立つプレパスを行います。おそらく、お互いに近い色を選ぶことで、これを利用することができます(したがって、より良いPNG圧縮が得られます)。無関係に、1ピクセルあたり1文字以上の文字をエンコードすることで、より小さな次元の画像を作成することはおそらく実現可能です(truecolor + alpha png画像は64ビット/ピクセルを使用します)。 – thebjorn

    関連する問題