Play Framework:如何在上传后调整JPG图像大小并将其转换为JPG

时间:2014-06-16 11:14:47

标签: image scala playframework

以下代码段将上传的图像保存在数据库中:

object MyController extends Controller {

  def upload = Action(multipartFormDataAsBytes) { request =>
    request.body.files foreach {
      case FilePart(key, filename, contentType, bytes) =>
      ...
      // store file in MongoDB GridFS
      ...
    }
    Ok("done")
  }
}

bytes包含要保存在数据库中的上传图像...但在实际保存之前我需要:

  1. 确定图像的大小,以防大小调整
  2. 确定图像的类型,以防将其转换为JPG
  3. 考虑到我将我的应用程序部署到Heruku并且我不知道他们是否在他们的服务器上安装了ImageMagic,是否有任何库可以让我调整大小并转换图像而无需安装本机库?

    我知道有imgscalr - 一个纯Java 2D库 - 提供调整图像大小的功能......但我还需要将它们转换为JPG。

    感谢。

4 个答案:

答案 0 :(得分:3)

由于您使用的是Scala,因此可以使用Scrimage,一个Scala图像库(基本上是一个包含大量辅助函数的AWT包装器)。

要从字节数组创建内存映像(格式无关紧要,它将自动检测):

val image = Image(bytes)

要调整大小,请执行以下操作:

val resized = image.scaleTo(width, height)

或者您可以指定质量/速度:

val resized = image.scaleTo(width, height, ScaleMethod = Bicubic|...others)

然后把它写成JPG。

val outBytes = resize.write(Format.JPEG)

要使用此库,您需要能够使用非无头JRE。

答案 1 :(得分:1)

您指向的库适用于Java ImageIO image processing library使用的类,可以将图像保存为JPEG。

根据this answer,您只需执行以下操作:

val input = new ByteArrayInputStream(bytes)
val image: BufferedImage = ImageIO.read(input)
val resizedImage: BufferedImage = // do imgscalr scaling magic
val outFile = new File("/my/file/location/file.jpg")
ImageIO.write(resizedImage, "jpg", outFile)

答案 2 :(得分:0)

使用JAI(Java高级成像),您可以重新调整您找到编解码器的任何媒体格式。我们将它与PNG,JPEG,GIF和TIFF一起使用。

最佳,

答案 3 :(得分:0)

我担心此提案无法满足您的需求,但我尝试了许多JVM库,经过多次尝试后,我无法获得预期的结果(质量损失,大尺寸,过滤器不良)。 ..),也调整大尺寸图像消耗大量内存。

所以我建议您在上传之前使用Canvas在浏览器中调整图片大小,我向您保证这是我找到的最佳解决方案。

要上传的图片尺寸>尺寸4调整大小的图像。

我知道这是一项艰巨的任务,但在我看来值得,你甚至可以直接从客户端将你的图像上传到mongo。

如果您需要调整有限数量的图片大小并且不需要质量并且尺寸不会打扰您,那么最后一件事就是忘记我所说的内容并转到其他解决方案。

如果您需要有关此解决方案的帮助,请通知我。

干杯,