【问题标题】:Play Framework: How to resize and convert to JPG an image after uploadPlay Framework:上传后如何调整图片大小并转换为 JPG
【发布时间】:2014-06-19 05:55:09
【问题描述】:

以下代码sn -p将上传的图片保存到数据库中:

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

考虑到我会将我的应用程序部署到 Heruku,但我不知道他们是否在他们的服务器上安装了 ImageMagic,是否有任何库可以让我调整图像大小和转换图像而无需安装本机库?

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

谢谢。

【问题讨论】:

    标签: image scala playframework


    【解决方案1】:

    由于您使用的是 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。

    【讨论】:

    • 看起来很棒!我将尝试它并将其性能与我们按照 Ben Rhouma Zied 的建议实施的客户端解决方案进行比较。非常感谢您的提示。
    【解决方案2】:

    您指向的库与 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)
    

    【讨论】:

      【解决方案3】:

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

      最好的,

      【讨论】:

        【解决方案4】:

        我担心这个建议不能满足你的需要,但是我尝试了很多 JVM 库,经过多次尝试我无法得到预期的结果(质量损失、大尺寸、坏过滤器......),调整大尺寸图像的大小也会消耗大量内存。

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

        要上传的图片大小 > 调整大小的 4 张图片。

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

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

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

        干杯,

        【讨论】:

        • 我们已经将图像流直接存储在 MongoDB GridFs 中......我们只需要确保图像大小和格式。从美学上讲,我很乐意让我们的后端(由一个用 Scala 编写的纯 REST API 组成)来完成这项工作......但值得尝试您的建议。你知道我们在哪里可以找到一个很好的例子吗?
        猜你喜欢
        • 2013-04-01
        • 2018-05-08
        • 1970-01-01
        • 2011-08-25
        • 2011-05-28
        • 2012-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多