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

java setquality_Java-在不损失质量的情况下调整图像大小给定您的输入图像 注释中第一个链接的答案中的方法 对 Chris Campbell 表示敬意 将产生以下缩略图之一 另一个是您使用 MS Paint 创建的缩略图 很难称其中一个比另一个 更好 编辑 只是要指出这一点 原始代码的主要问题是您并没有真正按比例缩放图像

大家好,我是讯享网,很高兴认识大家。

给定您的输入图像,注释中第一个链接的答案中的方法(对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();

}

}

小讯
上一篇 2025-01-08 14:44
下一篇 2025-01-06 12:16

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/127164.html