如何提高 g.drawImage() 方法调整图像大小的性能

2023-12-07

我有一个应用程序,用户可以在相册中上传图片,但上传的图像自然需要调整大小,以便还有拇指可用,并且显示的图片也适合页面(例如800x600)。 我调整大小的方式是这样的:

Image scaledImage = img.getScaledInstance((int)width, (int)height, Image.SCALE_SMOOTH);
BufferedImage imageBuff = new BufferedImage((int)width, (int)height, BufferedImage.TYPE_INT_RGB);
Graphics g = imageBuff.createGraphics();
g.drawImage(scaledImage, 0, 0, new Color(0,0,0), null);
g.dispose();

而且效果还不错。我唯一的问题是g.drawImage()方法似乎非常慢,我无法想象用户有足够的耐心等待上传 20 张图片 20*10 秒 ~ 3 分钟。事实上,在我的电脑上,为一张图片调整 3 种不同的大小需要花费近 40 秒的时间。

这还不够好,我正在寻找更快的解决方案。我想知道是否有人可以告诉我 Java 中更好的一个,或者通过调用 shell 脚本、命令,无论你知道什么黑客,它必须更快,这次其他一切都不重要。


我使用类似于以下的代码来缩放图像,我删除了处理保留纵横比的部分。每张图像的性能绝对优于 10 秒,但我不记得任何确切的数字。为了在缩小尺寸时获得更好的质量,如果原始图像大于所需缩略图大小的两倍,则应分几个步骤进行缩放,每个步骤都应将前一个图像缩放至其大小的大约一半。

public static BufferedImage getScaledImage(BufferedImage image, int width, int height) throws IOException {
    int imageWidth  = image.getWidth();
    int imageHeight = image.getHeight();

    double scaleX = (double)width/imageWidth;
    double scaleY = (double)height/imageHeight;
    AffineTransform scaleTransform = AffineTransform.getScaleInstance(scaleX, scaleY);
    AffineTransformOp bilinearScaleOp = new AffineTransformOp(scaleTransform, AffineTransformOp.TYPE_BILINEAR);

    return bilinearScaleOp.filter(
        image,
        new BufferedImage(width, height, image.getType()));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何提高 g.drawImage() 方法调整图像大小的性能 的相关文章

随机推荐

  • 为 Fortran 数组操作指定冒号

    Fortran 允许更轻松地使用数组操作 例如 double precision a 3 3 b 3 3 c 3 3 Given a and b已初始化 我知道一个简单的c a b将导致矩阵加法 使用同样可以实现c a b 我知道第二种方法
  • 前端 Ajax 和 WordPress - 数据库未更新

    所以我正在开发一个 WordPress 网站 我在获取用户输入来更新数据库方面遇到了一些困难 JS var ID this attr id var name name input ID val var createDate created
  • 如何显示进度条?

    我创建了一个隐写术 隐藏位图中的文本 应用程序 我想添加一个进度条来显示该过程的运行时间 procedure TForm1 Button2Click Sender TObject var x y i currentBit bitInChar
  • Scala.Option 的 Spring RequestParam 格式化程序

    我们在 Scala 应用程序中使用 Spring MVC 我想弄清楚如何打开 ScalaOption这样它们就可以使用正确转换 RequestParam 我认为解决方案可能与格式化程序 SPI 但我不确定如何让它很好地工作Option可以包
  • 向 CSV 文件添加一行 - 类型错误:必须是 str,而不是 tuple

    尝试以以下格式向我的 CSV 文件添加一行 名称 值 这是 CSV 文件 Japanese Yen 169 948 US Dollar 1 67 Pound Sterling 1 Euro 5 5 以下是负责向 CSV 文件添加行的代码部分
  • jQuery 在 Firefox 中不工作

    jQuery 在 Firefox 中不工作 它在 IE 和 Google Chrome 中工作正常 但是当我尝试在 Mozilla Firefox 中运行我的应用程序时 jQuery 无法工作 有什么猜测吗 这是我的代码
  • 转发声明一个标准容器?

    是否可以在头文件中转发声明标准容器 例如 采用以下代码 include
  • 矩阵转置 Common Lisp

    好吧 我被告知要在 common lisp 中创建一个矩阵转置函数 我是个初学者 所以不太了解 我的矩阵是列表的列表 我不能使用 apply mapcar 或类似的方法来解决它 只能使用 CONS CAR 和 CDR 如果没有 我的解决方案
  • jquery 动画可以以编程方式链接吗?

    我有这个代码 jQuery flash animate opacity 0 35 200 animate opacity 0 200 animate opacity 0 35 200 animate opacity 0 200 animat
  • 在 XGBoost.XGBRegressor 中创建自定义目标函数

    因此 我对 Python 中的 ML AI 游戏相对较新 目前正在研究围绕 XGBoost 自定义目标函数实现的问题 我的微分方程知识相当生疏 所以我创建了一个带有梯度和 hessian 的自定义 obj 函数 该函数对均方误差函数进行建模
  • Play 2.2.1 Java:相当于 play 1.X 中的 @before 过滤器吗?

    我想实施一个设置用户是否存在 当你could使用过滤器 或拦截器 在 传统 webapp框架方式中 Play首选方式似乎肯定是编写自定义Action方法 请参阅有关的文档动作组合 如果你遵循他们的风格 你就会定义一个新的Action像这样的
  • 链接到 Docker memcached 容器

    我已经尝试 Docker 几天了 并且越来越喜欢它 然而 有一些事情仍然让我困惑 这是我到目前为止所拥有的 创建占用空间少的 Ubuntu 14 04 映像 I got this from a post on this forum bin
  • 对于使用 packages.config 的项目,是否有 contentFiles 的替代方案?

    我有一个 nuget 包 当用户安装我的包时 我希望将其内容复制到构建输出 有对此的支持 NuGet ContentFiles 揭秘在 NuGet v3 3 中 但是 它仅适用于使用project json 当我有一个使用的项目时 内容文件
  • React Native中获取ScrollView的当前滚动位置

    是否可以获取当前滚动位置或当前页面
  • C++11 lambda 实现和内存模型

    我想要一些有关如何正确思考 C 11 闭包和std function就它们如何实现以及如何处理内存而言 尽管我不相信过早优化 但我确实有在编写新代码时仔细考虑我的选择对性能影响的习惯 我还进行了大量的实时编程 例如在微控制器和音频系统上 需
  • android 三角形drawablw xml

    我想画一个等边三角形 我检查过 但它是倒置的 我想要一个如下图所示的三角形 Triangle 三角形 xml
  • Java 扫描器未扫描整个文件

    我正在用 Java 编写一个程序 我需要做的一件事是为最短路径问题创建一组每个有效位置 这些位置在 txt 文件中定义 该文件遵循严格的模式 每行一个条目 没有额外的空格 非常适合使用 nextLine 获取数据 我的问题是 文件中的 24
  • Facebook SDK 3.1 PresentShareDialogModally 失败

    我正在尝试在 iOS 6 上测试 Facebook 的新内置共享 表 但是当我运行示例代码时 它没有显示该表 相反 它会为我发布一个状态 但不会显示它将首先发布的内容 我还以为 Facebook 不再允许你把话放到用户的嘴里了 控制台打印此
  • html 空间显示为 %2520 而不是 %20

    将文件名传递给 Firefox 浏览器会导致其将空格替换为 2520代替 20 我在名为的文件中有以下 HTMLmyhtml html img src 当我加载时myhtml html在 Firefox 中 图像显示为损坏的图像 所以我右键
  • 如何提高 g.drawImage() 方法调整图像大小的性能

    我有一个应用程序 用户可以在相册中上传图片 但上传的图像自然需要调整大小 以便还有拇指可用 并且显示的图片也适合页面 例如800x600 我调整大小的方式是这样的 Image scaledImage img getScaledInstanc