JAI довольно разочаровывает. Я до сих пор удивляюсь, почему, независимо от того, какие настройки вы делаете, он никогда не соответствует скорости, качеству и простоте ImageMagick . Я предпочитаю использовать ImageMagick везде, где могу.
Приведенный ниже код дает мне лучший результат для масштабирования изображения. Обратите внимание, что я использовал RenderingHints.VALUE_RENDER_QUALITY
и SubsampleAverage
и , а не RenderingHints.VALUE_INTERPOLATION_BICUBIC
.
Я завернул обработку JAI в небольшой блок и всегда использую его для уменьшения. Тот же код не дает хороший результат при масштабировании - для этого применяются другие настройки. Я не пробовал с PNG, JPEG - это то, с чем я работал.
Надеюсь, это поможет
//Set-up and load file
PlanarImage image = JAI.create("fileload", absPath);
RenderingHints quality = new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
Properties p = new Properties(System.getProperties());
p.put("com.sun.media.jai.disableMediaLib", "true");
System.setProperties(p);
//Setup the processes
ParameterBlock pb = new ParameterBlock()
.addSource(image)
.add(scaleX) //scaleX = (double)1.0*finalX/origX
.add(scaleY); //scaleY = (double)1.0*finalY/origY
RenderedOp tempProcessingFile = JAI.create("SubsampleAverage", pb, quality);
//Save the file
FileOutputStream fout = new FileOutputStream(file);
JPEGEncodeParam encodeParam = new JPEGEncodeParam();
encodeParam.setQuality(0.92f); //My experience is anything below 0.92f gives bad result
ImageEncoder encoder = ImageCodec.createImageEncoder("JPEG", fout, encodeParam);
encoder.encode(tempProcessingFile.getAsBufferedImage());
Кроме того, статьи, которые мне помогли.
(ссылки выше из моей закладки, отредактируйте их, если обнаружите, что они мертвы)