2

私は現在、テキストをpngファイルにエンコードするプログラムを作成しようとしています。たとえば、画像でエンコードする各文字の最下位ビットのみを変更します。たとえば、65の「A」があり、8つの異なるバイトを使用してエンコードします。文字A。したがって、01010100 <-10101101 <-11011010 <-10101010 <-これらのそれぞれで最後のビットを変更し、10110110 <-01010100 <-01010100 <-01010101 <-それらを一緒にすると、65は各番号01000001になります。矢印は65に従って変更されます。

私がこれに別の方法でアプローチする必要がある場合、提案は素晴らしいでしょう:)。これは私がやりたかった楽しい小さなプロジェクトです。しかし、とにかく私の質問に戻ります。

たった4ピクセルの大きさの画像を読み取ると、680バイトのようになります。これはおかしなことですが、少なくともそうだと思いますが、おそらく間違っていますか?それぞれ8ビットのARGBを使用する4ピクセルは16バイトで、数バイトはオペレーティングシステムにpngであることとその処理方法を確実に伝える必要があります。だから私は多分30バイトのように期待していました。多分少ないです。私はこれを間違った方法で見ていますか?png画像を圧縮すると、小さい画像の場合、画像は大きくなりますか?また、それをハードドライブに保存し直していたとき、私はいつもより大きなファイルを手に入れました。元の画像は8,554kbでしたが、保存して戻すと16kbのようになりました。画像バイトを取得して画像を保存するためのコードは次のとおりです。たぶん私は何か間違ったことをしているのか、それを正しく理解していないのかもしれません。

これらは私が画像を取得する方法です(私は2つの異なることを試しました)

// BufferedImage img = ImageIO.read(new File( "image.png"));
BufferedImage img = robot.createScreenCapture(new Rectangle(1,2,2,2));

2つの異なる方法を再び保存した方法。

{
InputStream in = new ByteArrayInputStream(imgBytes);を試してください。
BufferedImage bImageFromConvert = ImageIO.read(in);
ImageIO.write(bImageFromConvert、 "png"、new File( "image.png"));

// FileOutputStream fos = new FileOutputStream( "image.png");
//fos.write(b);
//fos.close();
} catch(Exception e){}

画像からバイトを取得する方法、もう一度2つの方法を試しました。コメントアウトされた2番目の方法では、実際には希望どおりに16バイトが得られましたが、保存したときに、Windowsはそれが何であるかを知らなかったために開くことができませんでした。私は推測する?わからない、ちょうど言ったファイルはサポートされていません。

byte [] imageBytes = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image、 "jpg"、baos);
baos.flush();
imageBytes = baos.toByteArray();
baos.close();
} catch(IOException e){System.out.println(e.getMessage());}

// imageBytes =((DataBufferByte)image.getData()。getDataBuffer())。getData();
imageBytesを返します。

ありがとう!

4

2 に答える 2

1

pngは、生の画像データだけでなく、多くの画像メタデータで構成されています。それはあなたにクレイジーな680バイトを与えているものです。

于 2012-11-29T03:17:56.330 に答える
0

バーコードフォントでもほぼ同じ問題が発生しました。5ビットのデータを取得できる最小のPNGにエンコードしたかっただけです。私がやりたくなかったのは、libpngに基づいたカスタムプログラムを作成することです。私はかなりの数のエディターを試しましたが、取得できる最小のファイルサイズは約170バイトでした。

ついに私はGimp2.0を見つけました。すべてのメタデータなしでPNGファイルをエクスポートするために使用できる機能があります。また、8ビットのグレースケールに変更しました。2ビットのグレースケールに切り替えることで数バイトを削減できると思いますが、Gimpはそれを行いません。結局、私は1文字あたり約75バイトで満足しました。

于 2012-12-08T11:59:57.020 に答える