需要帮助了解Scala Futures与Scrimage图像包

时间:2014-05-05 21:45:58

标签: scala concurrency future scrimage

我正试图围绕期货,并有一些缩放图像目录的样本......

有人可以向我解释这应该如何运作吗?

import com.sksamuel.scrimage._
import scala.concurrent._
import ExecutionContext.Implicits.global
import java.io._

object Test {

    def main(args: Array[String]) = {
        val dir = new File("/Users/bthibault/Downloads/ff_images/")
        dir.listFiles().foreach(file => AsyncImage(file).map( x => x.scale(0.5) ).onSuccess {
            case image => image.writer(Format.PNG).withMaxCompression.write(file)
        })
    }
}

我正在使用Scrimage包https://github.com/sksamuel/scrimage/,他提供了一个异步操作示例...这里是实际的异步文件:

https://github.com/sksamuel/scrimage/blob/master/core/src/main/scala/com/sksamuel/scrimage/AsyncImage.scala

有人可以帮助我了解我需要做些什么才能让这个工作吗?我正在玩map()函数......我的想法是我需要在onSuccess而不是AsyncImage上返回一个真正的'图像'....

1 个答案:

答案 0 :(得分:2)

如果您尝试异步调整文件夹中的所有图像,并要求提供正确语法的指导,那么这将有效:

object AsyncBatch extends App {

  val dir = new File(args(0)) 
  dir.listFiles.map(file =>
    AsyncImage(file)
      .flatMap(x => x.scale(0.5))
      .onSuccess {
      case image => image.writer(Format.PNG).write(file)
    })
}

注意:withMaxCompression不支持AsyncWriter。这是对图书馆的疏忽。

你能做到这一点的另一种方法是理解:

  val dir = new File(args(0)) 
  for ( file <- dir.listFiles;
        image <- AsyncImage(file);
        scaled <- image.scale(0.5) ) {
    scaled.writer(Format.PNG).write(file)
  }

当你有很多flatMaps和地图正在进行时,我认为这更容易阅读。