9
votes

Supprimer l'image de l'image, redimensionner, stocker dans la base de données, afficher

Y a-t-il un exemple succinct de la façon de télécharger une image, de le redimensionner, de le stocker dans une base de données, puis de servir l'image en utilisant Ascenseur?

Je suis sûr que je pouvais le créer à partir du téléchargement de fichier, de l'API 2D Java, de l'ascenseur et de l'API de réponse. Mais y a-t-il un exemple de code que je puisse suivre pour le faire la manière «correcte» ou recommandée?


2 commentaires

Pas d'infraction, mais cela ressemble à un projet décent pour vous écrire! Il a tout: intrigue, aventure et SQL.


Ouais j'allais! Je pensais juste que je demanderais des conseils avant de commencer.


3 Réponses :


6
votes

Je l'ai fait pour un champ de mappeur lié à S3 en créant un nouveau mappefield. J'ai également un certain code à redimensionner, mais je n'ai pas testé ou déployé (donc utiliser avec prudence).

class MappedS3Image[T<:Mapper[T]](owner: T, val path:String, maxWidth: String, maxHeight:String) extends MappedString[T](owner, 36) {

  def url:String = MappedS3Image.fullImgPath(path, is)

  def setFromUpload(fileHolder: Box[FileParamHolder]) = {
      S3Sender.uploadImageToS3(path, fileHolder).map(this.set(_))
  }

  override def asHtml:Node = <img src={url} style={"max-width:" + maxWidth + ";max-height:"+maxHeight} />
  override def _toForm: Box[Elem] = Full(SHtml.fileUpload(fu=>setFromUpload(Full(fu))))

}


import java.awt.Image 
import java.awt.image.BufferedImage
import javax.imageio.ImageIO
import java.awt.Graphics2D
import java.awt.AlphaComposite

object ImageResizer {

    def resize(is:java.io.InputStream, maxWidth:Int, maxHeight:Int):BufferedImage = {
        val originalImage:BufferedImage = ImageIO.read(is)

        val height = originalImage.getHeight
        val width = originalImage.getWidth

        if (width <= maxWidth && height <= maxHeight)
            originalImage
        else {
            var scaledWidth:Int = width
            var scaledHeight:Int = height
            val ratio:Double = width/height
            if (scaledWidth > maxWidth){
                scaledWidth = maxWidth
                scaledHeight = (scaledWidth.doubleValue/ratio).intValue
            }
            if (scaledHeight > maxHeight){
                scaledHeight = maxHeight
                scaledWidth = (scaledHeight.doubleValue*ratio).intValue
            }
            val scaledBI = new BufferedImage(scaledWidth, scaledHeight,  BufferedImage.TYPE_INT_RGB)
            val g = scaledBI.createGraphics
            g.setComposite(AlphaComposite.Src)
            g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null);
            g.dispose
            scaledBI
        }
    }
}


1 commentaires

Mathématiques imparfaites. Cela gâchre le rapport de largeur / hauteur. J'ai répondu avec une version fixe (trois ans plus tard). Pourtant, il a répondu aux questions sur les belles bibliothèques à utiliser pour moi et était très utile.



3
votes

L'autre réponse décrit joliment comment redimensionner l'image et stocker une référence au fichier sur le système de fichiers.

Si vous souhaitez utiliser le mappeur d'ascenseur pour stocker le contenu du fichier réel, vous devez créer votre modèle personnalisé. objet, et définir un champ binaire dessus. Essayez quelque chose comme ceci: xxx

puis, dans la classe bootstrap, ajoutez ce document à la fin: xxx

voile. Utilisation de Save Document (Nouveau document) Le stocke dans la base de données. Un nouveau document Les champs S peuvent être définis à l'aide de la méthode SET . Essayez de jouer avec Supprimer _! , Rechercher , Findall méthodes du document singleton à supprimer ou à le trouver dans la base de données . Il devrait être simple à partir de ce point.

Enfin, pour afficher l'image, vous pouvez remplacer les règles de répartition de l'ascenseur (en classe bootstrap, boot.scala). Essayez de jouer avec cet exemple qui remplace les règles des demandes PDF: xxx


0 commentaires

2
votes

Basé sur la réponse acceptée de Jon Hoffman, j'ai corrigé les bugs. Sa version est en train de gâcher le rapport de format (il devient toujours 1: 1), car les mathématiques étaient éteintes dans quelques taches. Cette version redimensionne de grandes images jusqu'à ce qu'ils s'adaptent et respecte le rapport de format.

def resize(is:java.io.InputStream, maxWidth:Int, maxHeight:Int):BufferedImage = {
    require (maxWidth > 0)
    require (maxHeight > 0)
    val originalImage:BufferedImage = ImageIO.read(is)

    var height = originalImage.getHeight
    var width = originalImage.getWidth

    // Shortcut to save a pointless reprocessing in case the image is small enough already
    if (width <= maxWidth && height <= maxHeight)
        originalImage
    else {          
        // If the picture was too big, it will either fit by width or height.
        // This essentially resizes the dimensions twice, until it fits
        if (width > maxWidth){
          height = (height.doubleValue() * (maxWidth.doubleValue() / width.doubleValue())).intValue
          width = maxWidth
        }
        if (height > maxHeight){
          width = (width.doubleValue() * (maxHeight.doubleValue() / height.doubleValue())).intValue
          height = maxHeight
        }
        val scaledBI = new BufferedImage(width, height,  BufferedImage.TYPE_INT_RGB)
        val g = scaledBI.createGraphics
        g.setComposite(AlphaComposite.Src)
        g.drawImage(originalImage, 0, 0, width, height, null);
        g.dispose
        scaledBI
    }
}


0 commentaires