2011-07-26 12 views
8

無意識にお詫び申し上げますが、以前はJavaでJPEG画像(画像の種類は問わない)を使ったことがありません。プログラムでJPEGファイルサイズを小さくする

ウェブサービスからクライアントにjpegイメージを送信したいとします。何らかの方法で画像のカラープロファイルを操作してjpegファイルサイズを小さくする方法はありますか?

imgscalrというBufferedImages用のきれいなツールを使用して画像サイズを縮小することで、既に画像サイズを縮小できました。 hereを参照してください。

また、高品質のJPEG画像よりも色が少ないjpegが好きです。たとえば、私は16ビットの色の代わりに私のjpegで8ビットの色を使用できるようにしたいと思います。

Javaの2DパッケージからBufferedImageを取得する場合、正確に何を変更する必要がありますか?

答えて

4

画像サイズを縮小する別の方法は、圧縮レベルを変更することです。あなたはImageWriterを使ってそれを行うことができます。可能な解決策の

ImageWriter writer = null; 
    Iterator<ImageWriter> iwi = ImageIO.getImageWritersByFormatName("jpg"); 
    if (!iwi.hasNext()) 
     return; 
    writer = (ImageWriter) iwi.next(); 
    ImageWriteParam iwp = writer.getDefaultWriteParam(); 
    iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT) ; 
    iwp.setCompressionQuality(compressionQuality); 
    writer.setOutput(...); 
    writer.write(null, image, iwp); 
+0

こんにちは、どのような影響(視覚的に)は、JPEGの圧縮を変更しますか?ありがとう – Joeblackdev

+1

このポストhttp://www.codinghorrorを見てください。com/blog/2006/07/a-comparison-of-jpeg-compression-levels-and-recompression.html –

+0

リンクをいただきありがとうございます。しかし、jpegの色数を減らす方法があるかどうか疑問に思っていましたか?たとえば、16ビットカラーの代わりに8ビットカラーを使用するには?ありがとう – Joeblackdev

1

これを行う最も簡単な方法は、バイトストリームをJava Imageに解凍し、必要に応じてサイズを変更します(サイズを小さくします)。次にJPEG画像を望ましい品質設定で再生成します。

この新しいイメージは、クライアントに送信されるイメージです。

+0

これはありがとうございますが、これはまさに私が今までに持っているものです。 imgscalrというツールを使用して、jpegイメージがクライアントに送信される前にサイズを変更します。しかし、私はまた、jpegのカラープロファイルを更新してjpegの色を減らしたいと思います。 「減らす」とは、少ない色を使うことを意味します。私はこの用語をよく理解していません... – Joeblackdev

1

ImageIOクラスをご覧ください。ファイルサイズを縮小する場合:画像はすでにJPEGになっているため、行うことができるのは画質や画像サイズを減らすことだけです。

もう1つ注意してください。画像がCMYK jpegの場合、画像が大きくなることがあります。残念ながらImageIOはこれらを処理できませんが、JAI ImageIOをCMYKからRGBに変換してみてください(はるかに小さくする必要があります)。

1

二つの画像を縮小している、ここにあなたがそれを行うだろう方法は次のとおりです。

BufferedImage original = //your image here 
scaled = original.getScaledInstance(finalWidth, finalHeight, Image.SCALE_SMOOTH); // scale the image to a smaller one 

BufferedImage result = new BufferedImage(finalWidth, finalHeight, original.getType()); 
Graphics2D g = result.createGraphics();  

g.drawImage(scaled, 0, 0, null); //draw the smaller image 
g.dispose(); 

を明らかに画像が同じでとどまるので、あなたは、スケールの幅と高さを計算する必要がありますアスペクト比。

あなたはそれを小さく描かれていたら、あなたは今、JPEGファイルにこのイメージを変えることができます:

BufferedImage image = // this is the final scaled down image 

JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(output); 
JPEGEncodeParam jpegEncodeParam = jpegEncoder.getDefaultJPEGEncodeParam(image); 

jpegEncodeParam.setDensityUnit(JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH); 
jpegEncodeParam.setXDensity(92); 
jpegEncodeParam.setYDensity(92); 

jpegEncodeParam.setQuality(0.8F , false); 
jpegEncoder.encode(image, jpegEncodeParam); 

これらのクラスは、JAIパッケージ(より正確にcom.sun.image.codecからです。 jpeg)、JVMは直接使用すべきではないと訴えるかもしれませんが、無視することができます。

hereからJAIをダウンロードすることはできますが、動作しない場合は、2つのライブラリ用にgithubミラーを設定するJAI coreJAI ImageIOがあります。

関連する問題