2016-10-22 4 views
0

jpeg画像をロスレスで保存する必要があります。私はステガノグラフィーのプロジェクトに取り組んでいますが、Javaは結果を圧縮して保存しています。私はすべてのフォーラムを調査し、すべてを試していますが、うまくいきませんでした。Javaでロスレスjpgを保存するには?

ここでロスレスのための私のコード例は、JPEG画像保存:この処理の後

BufferedImage image = ImageIO.read(new File("sources/image.jpg")); 

ImageWriter writer = ImageIO.getImageWritersByFormatName("JPEG").next(); 
JPEGImageWriteParam jpegParams = new JPEGImageWriteParam(null); 

jpegParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
jpegParams.setCompressionQuality(1f); 

writer.setOutput(ImageIO.createImageOutputStream(new File("example.jpg"))); 
writer.write(null, new IIOImage(image,null,null), jpegParams); 
writer.dispose(); 

を私はPSNR値を計算するには、28.53173であり、「example.jpg「のサイズはimage.jpg」よりも大きいです "。

私はJAIライブラリをインポートしようとしていますが、Java 8がJAIをサポートしているかわかりません。

+0

あなたのアルゴリズムの詳細を共有することができますので、あなたのJPEGがロスレスである必要がある理由を理解できますか? jpegがあなたのアルゴリズムの正しいフォーマットではないことや、stegoイメージを特定の方法でエンコードする必要があることが判明するかもしれません。例については、[here](https://stackoverflow.com/questions/29677726/steganography-in-lossy-compression-java/29678676#29678676)を参照してください。 – Reti43

+0

まず、あなたの答えに感謝します。私のアルゴリズムはとても簡単です。表紙/画像をバイナリに変換し、表紙画像、RGBからYCbCr、Y空間の8x8ブロック、各ブロックのDCT、中周波数の最大係数のLSBを読み込みます。すべてのIDCTの後に、YCbCrをRGBに変換して保存します。 私はAndroidアプリケーションでそれを行う必要があり、JPEG書き込みJPEGを読み取る必要があります。 – vakkaya

+1

私たちに見せることができるいくつかの出版物からあなたのアルゴリズムの基礎を得ましたか? JPEGを読み込んでいる場合、ファイルデータからピクセルを再構成する必要はありません。 DCTブロックをメモリにロードし、アルゴリズムごとに変更して、出力ファイルに再エンコードします。そうすれば、変換と量子化のステップを含むJPEG形式のすべての損失の多いものを避けることができます。 – Reti43

答えて

2

JPEGはlossyです。 100%の圧縮品質でさえ、いくらか情報が失われますが、最小化されます。

example.jpgのサイズが大きいのは、100%品質係数でエンコードされているためです。ほとんどのjpegエンコーダのデフォルト値は50%〜75%です。 example.jpg。異なる品質係数を試して、両方のファイルが同じサイズであることを確認することができます。

JAIで利用できるロスレスJPEGフォーマットは存在しますが、従来のJPEGとは異なるフォーマットであると考えられます。しかし、それは広く使われておらず、おそらくほとんどのアプリケーションで見ることができないでしょう。これは、無実のイメージを共有するという点を事実上打破します。

関連する問題