java - imgscalr AsyncScalr 的示例代码

标签 java image image-processing imgscalr

有人可以分享使用 AsyncScalr 调整代码大小的 imgscalr 示例代码吗?我正在尝试使用 imgscalr(Scalr 类)进行图像处理。这是一个很好且易于使用的库,但是,经常会出现 OutOfMemoryException。我希望使用 AsyncScalr 可以解决我的低负载问题。

最佳答案

如果您熟悉 Java 并发库,那么使用 AsyncScalr 类非常简单;如果您不熟悉新的并发库,那么要点是:

  1. 调用一个 API 方法,在未来未知的时间点做一些工作;方法调用返回 Future包装实际工作。
  2. 原来的 API 调用实际上是在内部排队工作;如果它不忙,它可能会立即完成工作,但如果它很忙并且队列很大,则可能需要一段时间才能完成工作(在这种情况下,“工作”是图片)。
  3. 想要结果的调用代码(您的代码)可以继续工作直到 Future.isDone()返回 true 以指示工作已完成,或者调用代码可以阻塞,直到通过调用以下操作完成操作:Future.get() -- 此方法返回工作结果,在本例中为表示缩放结果的 BufferedImage。

代码最终看起来像这样:

// Block until result is done
BufferedImage result = AsyncScalr.resize(origImage, 125).get();

此代码与使用 Scalr class 的区别直接的是,在多线程系统中,如果您从所有线程调用 Scalr.resize() (或任何图像操作),这些线程中的每一个都将开始一个昂贵的图像操作,使您的 CPU 充满并发工作并减慢系统的速度(扼杀在其上运行的其他进程,如数据库或网络服务器)。

使用 AsyncScalr class您可以从任意数量的线程安全地调用 AsyncScalr.resize(或任何其他操作),而不必担心主机系统会被工作淹没; AsyncScalr.THREAD_COUNT确定一次可以同时发生多少个作业;如果主机还托管其他重要服务,如数据库或 Web 服务器,您通常希望将其设置为主机上的核心数或少于核心数(以确保您不会扼杀其他缩放变得繁忙时的进程)。

您可以在应用程序启动时使用“imgscalr.async.threadCount”系统属性在命令行上设置此线程值;默认情况下它是“2”,但如果您担心系统内存太低,您可以将它设置为“1”。

或者,如果您在等待结果时线程可以做一些工作,您可以做这样的事情来真正充分利用异步编程:

// Queue up the scaling operation (or any other op)
Future<BufferedImage> result = AsyncScalr.resize(origImage, 125);

/*
 * You can do other work here that doesn't need 'result', like making
 * DB calls, cleaning up temp files or anything else you might need to
 * do.
 */

// Now we are all done and need the resulting image, so we wait for it.
BufferedImage scaledImage = result.get();

// Do something with the image...

如果您在等待图像缩放时有大量其他工作可以做,您可以简单地循环 result.isDone() 并保持工作直到缩放操作完成;但是,如果您只有离散/特定数量的工作要做,则无需在 isDone 上循环,只需完成工作,然后调用 Future.get() 获取结果(或阻塞直到它准备好了)。

希望对您有所帮助!

关于java - imgscalr AsyncScalr 的示例代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9753016/

相关文章:

Java Vector 在删除时不重新排序索引,但将它们保留为空,在添加命令上重用这些空格

java - 无法解析Android Studio中的Symbol v7和appComapat Activity导入

python - OpenCV/python:如何使用公式更改图像像素的值?

python - 我是否使用 Numpy 正确计算逆滤波器?

java - Grails - 与第 3 方 API 的异步通信

android - 如何让移动网页在所有设备上显示相同

php - 在使用 imagecache_create_path & getimagesize 之前使用 Drupal imagecache 生成图像

python - OpenCV 检测试管中的药丸数量

opencv - 我对opencv的测试findfundamentalMat的输出是否合理?

java - 如何使用通过以太网在另一个线程中接收的数据更新 javaFX 表