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.