2009-06-04 9 views
7

Javaを使用してjpegファイルを圧縮します。jpegイメージをJavaで圧縮するにはどうしたらよいですか?

  1. BufferedImage
  2. は、圧縮率を持つ別のファイルにイメージを書くと、画像を読む:私はこのようにそれを行います。

OK、これは簡単ですが、新しいファイルでICCカラープロファイルとEXIF情報が消えてしまい、イメージのDPIが240から72に落ちてしまいます。元のイメージとは異なります。私はOS Xでプレビューのようなツールを使用します。他の情報に影響を与えずにイメージの品質を完全に変えることができます。

Javaでこれを実行できますか?少なくともICCのカラープロファイルを保持し、画像の色が原点の写真と同じに見えるようにしますか?

答えて

1
/** 
* @param inputFilenameWithPath : binary filepath 
* @param outputFilepath  : output image path 
* @param start     : from where the image start in binary file 
* @param len     : length of the image 
* @throws ImageAccessException 
*/ 
public void extractImageFromBinaryFile(String inputFilenameWithPath, String outputFilepath, int start, int len) throws ImageAccessException 
{ 
    try 
    { 
     File file = new File(inputFilenameWithPath); 
     FileImageInputStream iis = new FileImageInputStream(file); 

     // Added 
     byte[] b = new byte[start]; 
     iis.read(b, 0, start); 

     byte[] fb = new byte[]{}; 
     iis.read(fb); 

     IIOByteBuffer iiob = new IIOByteBuffer(fb, start, len); 
     iis.readBytes(iiob, len); 

     OutputStream os = new FileOutputStream(outputFilepath); 
     os.write(iiob.getData()); 
     iis.close(); 
     os.close(); 

    } 
    catch (IOException ioe) 
    {`enter code here` 
     throw new ImageAccessException("Image File read/write error"); 
    } 
} 
+0

コードを説明してください。 – hims056

+0

これは画像を読み込んで出力するように見えますが、これは圧縮するために画像の品質を変更することをサポートしていないと私は思います。 – guitarpoet

0

最後にこれを行う方法を見つけます。

javax.imageio.IIOImageを使用してください。これはJpegImageReaderによって読み取ることができます。

しかし、バグが6年続いた。幸いにも:(

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4924909

、あなたには、いくつかのハック(フェイクJFIFセクション)を実行し、それが動作するかどうか:。

    :D

    ので、この問題は次のように解決することができます

  1. ImageIOを使用してjpegのImageReaderを取得する
  2. jpegイメージをメモリバッファに読み込みます。
  3. バグ4924909で失敗した場合は、イメージbufを修正してください偽のJFIF情報を持っています。
  4. ImageWriterを使用してファイルを書き、ImageWriterParamにトリックをさせます。

出力画像が元の画像よりも明るい(または薄く)(ただし、すべての情報が保存されている)ようです。プレビューを使用すると発生しません圧縮された写真にOS X、の問題は、私のコードやJava、または私の間違った使い方:()内になければなりませんので。だから、JavaでJPEGを圧縮するための私の問題はまだ解決されていない

任意の提案?

+0

良い、私はあきらめるImageIOはうまく動作しません。少なくとも私のために)。私はちょうど情報を失うことなく圧縮するように画像の品質を変え、原点写真と同じように見えるようにしたい。 Javaが失敗しました。私はこれを行うためにImageMagicとJNIを使​​用します。 多分私は間違っていました。オラクルの誰でも助けることができますか? – guitarpoet

関連する問題