Image 播放框架:上传后如何调整图像大小并转换为JPG图像

Image 播放框架:上传后如何调整图像大小并转换为JPG图像,image,scala,playframework,Image,Scala,Playframework,以下代码段将上载的图像保存在数据库中: object MyController extends Controller { def upload = Action(multipartFormDataAsBytes) { request => request.body.files foreach { case FilePart(key, filename, contentType, bytes) => ... // store file

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

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")
  }
}
字节
包含要保存在数据库中的上载图像。。。但在实际保存之前,我需要:

  • 确定图像的大小,以防调整其大小
  • 确定图像的类型,以防将其转换为JPG
  • 考虑到我将把我的应用程序部署到Heruku,我不知道他们是否在他们的服务器上安装了ImageMagic,是否有任何库允许我在不安装本机库的情况下调整和转换图像

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


    谢谢。

    您指向的库与Java使用的类配合使用,这些类可以将图像保存为JPEG格式

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

    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)
    

    您指向的库与Java使用的类一起工作,Java使用的类可以将图像保存为JPEG格式

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

    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)
    
    使用JAI(Java Advanced Imaging),您可以重新缩放找到其编解码器的任何媒体格式。我们将其与PNG、JPEG、GIF和TIFF一起使用

    最好的方法是,使用JAI(Java Advanced Imaging),您可以重新缩放找到编解码器的任何媒体格式。我们将其与PNG、JPEG、GIF和TIFF一起使用


    最好的,

    我担心这个方案不能满足您的需要,但是我已经尝试了许多JVM库,在多次尝试之后,我都没有得到预期的结果(质量损失、大尺寸、坏过滤器……),而且调整大尺寸图像的大小会消耗大量内存

    因此,我建议您在上传图像之前,使用画布在浏览器中使用javascript调整图像大小,我向您保证,这是我找到的最好的解决方案

    要上载的图像大小>大小4已调整大小的图像

    我知道这是一项困难的任务,但我认为这是值得的,你甚至可以直接从客户端上传你的图片到mongo

    最后一件事,如果你需要调整有限数量的图像,你不需要质量和大小不困扰你,那么忘记我说的,去其他的解决方案

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


    干杯,

    我担心这个方案不能满足您的需要,但是我尝试了许多JVM库,在多次尝试之后,我都没有得到预期的结果(质量下降、尺寸过大、过滤器不好……),而且调整大尺寸图像的大小会消耗大量内存

    因此,我建议您在上传图像之前,使用画布在浏览器中使用javascript调整图像大小,我向您保证,这是我找到的最好的解决方案

    要上载的图像大小>大小4已调整大小的图像

    我知道这是一项困难的任务,但我认为这是值得的,你甚至可以直接从客户端上传你的图片到mongo

    最后一件事,如果你需要调整有限数量的图像,你不需要质量和大小不困扰你,那么忘记我说的,去其他的解决方案

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


    干杯,

    因为您使用的是Scala,所以您可以使用Scala图像库(基本上是AWT的包装器,包含大量的帮助函数)

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

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

    val resized = image.scaleTo(width, height)
    
    或者您可以指定质量/速度:

    val resized = image.scaleTo(width, height, ScaleMethod = Bicubic|...others)
    
    然后把它写成JPG

    val outBytes = resize.write(Format.JPEG)
    

    要使用这个库,您需要有一个无头JRE。

    因为您使用的是Scala,所以您可以使用Scala图像库(基本上是AWT的包装器,包含大量的帮助函数)

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

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

    val resized = image.scaleTo(width, height)
    
    或者您可以指定质量/速度:

    val resized = image.scaleTo(width, height, ScaleMethod = Bicubic|...others)
    
    然后把它写成JPG

    val outBytes = resize.write(Format.JPEG)
    

    要使用此库,您需要有一个无头JRE。

    我们已经在MongoDB GridFs中直接存储了图像流。。。我们只需要确保图像的大小和格式。从美学角度讲,我希望让我们的后端(由一个用Scala编写的纯RESTAPI组成)完成这项工作。。。但你的建议值得一试。你知道我们在哪里可以找到一个很好的例子吗?我们已经在MongoDB GridFs中直接存储了图像流。。。我们只需要确保图像的大小和格式。从美学角度讲,我希望让我们的后端(由一个用Scala编写的纯RESTAPI组成)完成这项工作。。。但你的建议值得一试。你知道我们在哪里可以找到一个很好的例子吗?看起来很棒!我将尝试一下,并将其性能与我们按照Ben Rhouma Zied的建议实现的客户端解决方案进行比较。非常感谢你的提示。看起来很棒!我将尝试一下,并将其性能与我们按照Ben Rhouma Zied的建议实现的客户端解决方案进行比较。非常感谢你的提示。