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

(另一个是您使用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();

}

}

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

  1. java为什么删除jpg删不掉_java-如何在不损失质量的情况下从图像(JPG)删除元数据?...

    我已经在Stackoverflow上发现了这个几乎相似的问题: 但是,当我使用上述方法时,保存的图像将被压缩.有什么办法可以在不压缩图像的情况下删除元数据?我的Java程序中可以使用任何库吗? 解决方 ...

  2. ITK:在没有写访问权的情况下迭代图像中的区域

    ITK:在没有写访问权的情况下迭代图像中的区域 内容提要 输出结果 输入 输出 C++实现代码 内容提要 遍历图像的某个区域(无写访问权限). 输出结果 输入 输出 255 255 255 255 2 ...

  3. html 图片放大保证不失真,教你如何在保证图片不失真的情况下缩小图片大小

    教你如何在保证图片不失真的情况下缩小图片大小 随着卡片机.单反的普及,越来越多的人有能力购买和拥有一台属于自己的相机,并随时随地拍摄下喜欢的风景.人物,记录身边美好的一切.照片拍下后,大部分人喜欢放到 ...

  4. java6打印机不能用_高分求解:java中调用的打印机在什么情况下不可用?

    java文档中说PrinterJob类中的getPrinterJob()方法无论返回的打印机是否可用都不会返回一个null值.我查阅过一些文献有介绍说可以用getPrintService()方法测试返 ...

  5. 一个数字可以在不损失精度的情况下达到的JavaScript的最高整数值是多少?

    这是由语言定义的吗? 是否有定义的最大值? 在不同的浏览器中是否有所不同? #1楼 您要用于按位运算的任何值都必须在0x80000000(-2147483648或-2 ^ 31)和0x7fffffff ...

  6. java流处理为什么快_“任何情况下,都不可以堕胎”是道德普遍主义的观点。

    [判断题]两个可能性之间可以彼此独立. [多选题]全球化正改变着我们的工作方式和生活方式,原因是我们首先必须处理( )和( )这两个问题. [判断题]"只许州官放火"体现了双重标准 ...

  7. java image 设置大小_如何使用Java调整图像大小?

    Thumbnailator是一个用于Java的开源图像大小调整库,具有流畅的界面,在MIT许可下分发. 我编写这个库是因为在Java中制作高质量的缩略图可能会非常困难,而且生成的代码可能非常混乱.使用 ...

  8. java处理图像减小大小不改变像素_在Java中调整图像大小以降低内存消耗

    ImageMagick的"转换"命令行工具使您可以在执行操作时指定内存使用限制. 我想找到一个提供相同选项的Java图像大小调整库. 我的应用程序有时会获得非常大的JPEG,因此需 ...

  9. 在线gif压缩文件大小_如何在不损失图像质量的情况下压缩动画GIF文件

    在线gif压缩文件大小 动画GIF比任何其他数字图像格式都已根深蒂固于在线文化中. JPEG或多或少是传统摄影的延续,但GIF是新的且功能强大. 在过去的十年中,广泛的宽带已导致视频流传输,但是在此之 ...

最新文章

  1. Redhat 5 无法安装elfutils-libelf-devel-0.137问题
  2. 【WP8.1开发】RenderTargetBitmap类的特殊用途
  3. MapReduce-流量统计求和-排序-Mapper和Reducer编写
  4. 2020巨量引擎用户旅游全周期行为动机调研报告
  5. 在a标签中写ajax,ajax请求后的数据渲染到页面中,a链接失效
  6. java IO包装流如何关闭
  7. MSN登陆以后没有响应处理方法
  8. 使用py2app打包项目 通用与各个平台
  9. Win10安装ST-Link驱动--无需下载驱动
  10. 车辆信息管理系统(C语言大作业)
  11. 对计算机专业学科的认识1000字,计算机专业1000字实习报告
  12. 一封学生来信:突破大学的迷茫
  13. cannot enlist more than one non-XA resource
  14. OPENGLES 绘制纹理带黑圈pre-multiplying
  15. Python爬虫,30秒爬取500+篇微信文章!太强啦!
  16. 开发板和电脑网线连接,电脑网线连接 ubuntu18.04 nfs搭建
  17. python青少年编程_机器人Python青少年编程开发实例
  18. python3or5的值_详解python中and和or的返回值
  19. 【前端】相对定位实现十字居中(上下左右居中)
  20. python量化交易:筹码分布(1)

热门文章

  1. k8s jenkins pipeline 多分支发布_给 Jenkins 换一个新皮肤:BlueOcean
  2. STL-queue.back()队尾误区
  3. 【性能测试】Linux系统监控-Top命令
  4. [51nod1201]整数划分
  5. MPI对道路车辆情况的Nagel-Schreckenberg 模型进行蒙特卡洛模拟
  6. JS闭包—你不知道的JavaScript上卷读书笔记(二)
  7. 使用FindBugs-IDEA插件找到代码中潜在的问题
  8. ios学习笔记——RunTime
  9. iOS中画矩形的几种方法总结
  10. J2ME游戏中的图片处理