java setquality_Java-在不损失质量的情况下调整图像大小

给定您的输入图像,注释中第一个链接的答案中的方法(对Chris Campbell表示敬意)将产生以下缩略图之一:

f9e0d03eadb983b686a37ee0e628258d.png

cb56fb336c48595d08ac71648168621d.png

(另一个是您使用MS Paint创建的缩略图。很难称其中一个比另一个“更好” ...)

编辑:只是要指出这一点:原始代码的主要问题是您并没有真正按比例缩放图像。 您只是使用了一个奇怪的循环来“计算”目标大小。 关键是您实际上要分多个步骤执行缩放。

为了完整起见,MVCE

(编辑:我提到了Chris Campbell,并通过注释引用了源代码,但在此要更清楚:以下内容基于《 Perils of Image.getScaledInstance()》)

import java.awt.Graphics2D;

import java.awt.RenderingHints;

import java.awt.Transparency;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.util.Iterator;

import javax.imageio.IIOImage;

import javax.imageio.ImageIO;

import javax.imageio.ImageWriteParam;

import javax.imageio.ImageWriter;

import javax.imageio.stream.ImageOutputStream;

import javax.imageio.stream.MemoryCacheImageOutputStream;

public class ResizeQuality

{

public static void main(String[] args) throws IOException

{

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

BufferedImage scaled = getScaledInstance(

image, 51, 75, RenderingHints.VALUE_INTERPOLATION_BILINEAR, true);

writeJPG(scaled, new FileOutputStream("X0aPT_tn.jpg"), 0.85f);

}

public static BufferedImage getScaledInstance(

BufferedImage img, int targetWidth,

int targetHeight, Object hint,

boolean higherQuality)

{

int type =

(img.getTransparency() == Transparency.OPAQUE)

? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;

BufferedImage ret = (BufferedImage) img;

int w, h;

if (higherQuality)

{

// Use multi-step technique: start with original size, then

// scale down in multiple passes with drawImage()

// until the target size is reached

w = img.getWidth();

h = img.getHeight();

}

else

{

// Use one-step technique: scale directly from original

// size to target size with a single drawImage() call

w = targetWidth;

h = targetHeight;

}

do

{

if (higherQuality && w > targetWidth)

{

w /= 2;

if (w < targetWidth)

{

w = targetWidth;

}

}

if (higherQuality && h > targetHeight)

{

h /= 2;

if (h < targetHeight)

{

h = targetHeight;

}

}

BufferedImage tmp = new BufferedImage(w, h, type);

Graphics2D g2 = tmp.createGraphics();

g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);

g2.drawImage(ret, 0, 0, w, h, null);

g2.dispose();

ret = tmp;

} while (w != targetWidth || h != targetHeight);

return ret;

}

public static void writeJPG(

BufferedImage bufferedImage,

OutputStream outputStream,

float quality) throws IOException

{

Iterator iterator =

ImageIO.getImageWritersByFormatName("jpg");

ImageWriter imageWriter = iterator.next();

ImageWriteParam imageWriteParam = imageWriter.getDefaultWriteParam();

imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);

imageWriteParam.setCompressionQuality(quality);

ImageOutputStream imageOutputStream =

new MemoryCacheImageOutputStream(outputStream);

imageWriter.setOutput(imageOutputStream);

IIOImage iioimage = new IIOImage(bufferedImage, null, null);

imageWriter.write(null, iioimage, imageWriteParam);

imageOutputStream.flush();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值