Уменьшить разрешение изображения в java
Мне нужно уменьшить размер изображения (не ширины и высоты) с помощью программы Java.
Есть ли у них какой-либо хороший API для этого?
Мне нужно уменьшить размер от 1 МБ до 50 кб - 100 кб.
Конечно, разрешение будет уменьшаться, но это не имеет значения.
Ответы
Ответ 1
Это рабочий код
public class ImageCompressor {
public void compress() throws IOException {
File infile = new File("Y:\\img\\star.jpg");
File outfile = new File("Y:\\img\\star_compressed.jpg");
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
infile));
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(outfile));
SeekableStream s = SeekableStream.wrapInputStream(bis, true);
RenderedOp image = JAI.create("stream", s);
((OpImage) image.getRendering()).setTileCache(null);
RenderingHints qualityHints = new RenderingHints(
RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
RenderedOp resizedImage = JAI.create("SubsampleAverage", image, 0.9,
0.9, qualityHints);
JAI.create("encode", resizedImage, bos, "JPEG", null);
}
public static void main(String[] args) throws IOException {
new ImageCompressor().compress();
}
}
Этот код работает отлично для меня. если вам нужно изменить размер изображения, то вы можете
измените масштаб x и y здесь JAI.create("SubsampleAverage", image, xscale,yscale, qualityHints);
Ответ 2
В соответствии с этим сообщением в блоге: http://i-proving.com/2006/07/06/java-advanced-imaging/ вы можете использовать Java Advanced Imaging Library, чтобы делать то, что вы хотите. Следующий примерный код должен предоставить вам хорошую отправную точку. Это изменит размер изображения как по высоте, так и по ширине, а также по качеству изображения. Когда изображение будет иметь нужный размер, вы можете масштабировать его до требуемой высоты и ширины пикселей при отображении изображения.
// read in the original image from an input stream
SeekableStream s = SeekableStream.wrapInputStream(
inputStream, true);
RenderedOp image = JAI.create("stream", s);
((OpImage)image.getRendering()).setTileCache(null);
// now resize the image
float scale = newWidth / image.getWidth();
RenderedOp resizedImage = JAI.create("SubsampleAverage",
image, scale, scale, qualityHints);
// lastly, write the newly-resized image to an
// output stream, in a specific encoding
JAI.create("encode", resizedImage, outputStream, "PNG", null);
Ответ 3
Вы можете использовать JAI для увеличения сжатия записанного JPEG без какого-либо масштабирования. См. http://java.sun.com/products/java-media/jai/forDevelopers/jai1_0_1guide-unc/Encode.doc.html
Ответ 4
Если ваш тип изображения поддерживается реализацией ImageWriteParam
, вы можете отрегулировать качество, как показано на рисунке example. Другие методы ImageWriteParam
, например getBitRate()
, могут позволить вам оптимизировать результат.