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? P>
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? P>
3 Réponses :
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 } } }
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.
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: p> puis, dans la classe bootstrap, ajoutez ce document voile. Utilisation de 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: p> code> à la fin: p>
Save Document (Nouveau document) CODE> Le stocke dans la base de données. Un nouveau document CODE> Les champs CODE> S peuvent être définis à l'aide de la méthode
SET CODE>. Essayez de jouer avec
Supprimer _! Code>,
Rechercher code>,
Findall code> méthodes du document code> singleton à supprimer ou à le trouver dans la base de données . Il devrait être simple à partir de ce point. P>
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 } }
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.