Upload d'image, redimension et enregistrement SQL

blowdesign Messages postés 22 Date d'inscription mercredi 3 septembre 2003 Statut Membre Dernière intervention 31 janvier 2009 - 10 févr. 2007 à 16:32
blowdesign Messages postés 22 Date d'inscription mercredi 3 septembre 2003 Statut Membre Dernière intervention 31 janvier 2009 - 13 févr. 2007 à 10:15
J'ai un fichier image téléchargé par un upload.

L'objet est un stream.

Je voudrais redimensionner l'image avant de l'enregistrer dans SQL

Mais le stream n'est pas changé car je n'arrive pas à transformer mon bitmap (nécessaire pour changer la taille de l'image) en stream. C'est la fonction RedimensionneImage qui pose problème

Voici le code :

'On passe la hauteur max, la largeur max, et le fichier type System.IO.Stream (System.IO.HttpStream)
clsImage.VerifieTailleImage(clsConstantes.i_MAXHEIGHT_IMG_CULTURE, clsConstantes.i_MAXWIDTH_IMG_CULTURE, e.UploadedFile.InputStream)

    Shared Sub VerifieTailleImage(ByVal iMaxHeigth As Integer, _
                                  ByVal iMaxWidth As Integer, _
                                  ByRef ObjImg As Object)

        Dim iCoefficient As Double = 0
        Dim iCoefficientHeight As Double = 0
        Dim iCoefficientWidth As Double = 0
        Dim iNewHeight As Integer = 0
        Dim iNewWidth As Integer = 0
        Dim iHeightImg As Integer = 0
        Dim iWidthImg As Integer = 0
        Dim imgClientSize As Size = New System.Drawing.Size(0, 0)

        imgClientSize = CalculeTailleImage(ObjImg)

        iHeightImg = imgClientSize.Height
        iWidthImg = imgClientSize.Width

        If Not imgClientSize.IsEmpty AndAlso (iHeightImg > iMaxHeigth Or iWidthImg > iMaxWidth) Then
            iCoefficientHeight = iMaxHeigth / iHeightImg
            iCoefficientWidth = iMaxWidth / iWidthImg

            If iCoefficientHeight <= iCoefficientWidth Then
                iCoefficient = iCoefficientHeight
            Else
                iCoefficient = iCoefficientWidth
            End If

            iNewHeight = CInt(iHeightImg * iCoefficient)
            iNewWidth = CInt(iWidthImg * iCoefficient)

            ObjImg = RedimensionneImage(iNewHeight, iNewWidth, ObjImg)

        End If

    End Sub

    Shared Function CalculeTailleImage(ByVal ObjImg As Object) As Size

        Dim b As System.Drawing.Bitmap = Nothing
        Dim imgClientSize As Size = New System.Drawing.Size(0, 0)

        Select Case ObjImg.GetType().Name
            Case GetType(Image).Name
                b = New System.Drawing.Bitmap(CType(ObjImg, Image))
                imgClientSize = New System.Drawing.Size(b.Size.Width, b.Size.Height)
            Case GetType(ImageButton).Name
                imgClientSize = New System.Drawing.Size(CType(ObjImg, ImageButton).Height.Value, CType(ObjImg, ImageButton).Width.Value)
            Case Else
                If ObjImg.GetType.Name.Contains(GetType(System.IO.Stream).Name) Then
                    b = New System.Drawing.Bitmap(CType(ObjImg, System.IO.Stream))
                    imgClientSize = New System.Drawing.Size(b.Size.Width, b.Size.Height)
                End If
        End Select

        Return imgClientSize

    End Function

    Shared Function RedimensionneImage(ByVal iNewHeight As Integer, _
                                       ByVal iNewWidth As Integer, _
                                       ByRef ObjImg As Object) As Object

        Select Case ObjImg.GetType().Name
            Case GetType(Image).Name
                Dim b As System.Drawing.Bitmap = New System.Drawing.Bitmap(CType(ObjImg, Image))
                Dim Newb As System.Drawing.Bitmap = New System.Drawing.Bitmap(iNewWidth, iNewHeight, b.PixelFormat)
                b = Newb
                Dim objNewImage As Image = CType(ObjImg, Image)
                objNewImage = New System.Drawing.Bitmap(b)
                ObjImg = objNewImage
            Case GetType(ImageButton).Name
                CType(ObjImg, ImageButton).Height = System.Web.UI.WebControls.Unit.Parse(iNewHeight)
                CType(ObjImg, ImageButton).Width = System.Web.UI.WebControls.Unit.Parse(iNewWidth)
            Case Else
                If ObjImg.GetType.Name.Contains(GetType(System.IO.Stream).Name) Then
                    Dim s As System.IO.Stream = CType(ObjImg, System.IO.Stream)
                    Dim b As System.Drawing.Bitmap = New System.Drawing.Bitmap(s)
                    Dim Newb As System.Drawing.Bitmap = New System.Drawing.Bitmap(iNewWidth, iNewHeight, b.PixelFormat)
                    b = Newb
                    ObjImg = b
                End If
        End Select

        Return ObjImg

    End Function

Quelqu'un peut-il m'aider ?

Merci d'avance

Blowdesign

5 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
11 févr. 2007 à 01:31
Salut,

Regardes juste le post précedent et tu auras les infos que tu cherches ;-)
0
blowdesign Messages postés 22 Date d'inscription mercredi 3 septembre 2003 Statut Membre Dernière intervention 31 janvier 2009
11 févr. 2007 à 12:41
Merci, mais je ne vois pas en quoi ce post peut m'aider : http://www.aspfr.com/infomsg_1ER-TEST-AVEC-EXTENSION-AJAX_885732.aspx#2

Blowdesign
0
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
11 févr. 2007 à 14:27
Je pense qu'il parlait de ce post là :
http://www.aspfr.com/infomsg_REDUIRE-PHOTO-IMAGE-UPLOAD_886335.aspx#3

<hr width="100%" size="2" />Nurgle (Antoine) - MSP
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
11 févr. 2007 à 14:28
Salut,
Le psost précédent sur le site aspfr.com est
http://www.aspfr.com/infomsg_REDUIRE-PHOTO-IMAGE-UPLOAD_886335.aspx#3
Dans la liste des messages sur la droite?

Voila
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
blowdesign Messages postés 22 Date d'inscription mercredi 3 septembre 2003 Statut Membre Dernière intervention 31 janvier 2009
13 févr. 2007 à 10:15
Ok, voilà pour ceux que ça intéresse (en VB.Net)

/* L'appel de la méthode */
*********************

                'Vérifie les dimensions de l'image et la redimensione si besoin
                Dim image As System.Drawing.Image = Nothing
                Dim NewBmp As Bitmap = Nothing
                Dim Stream As System.IO.MemoryStream = New System.IO.MemoryStream

                Try
                    image = System.Drawing.Image.FromStream(leStreamAUtiliser)
                    NewBmp = clsImage.VerifieTailleImage(clsConstantes.i_MAXHEIGHT_IMG_CULTURE, _
                                                                                  clsConstantes.i_MAXWIDTH_IMG_CULTURE, _
                                                                                  image)

                    NewBmp.Save(Stream, image.RawFormat)
                    c = Stream.Length
                    ReDim objTampon(c)
                    objTampon = Stream.GetBuffer()

                    e.InputParameters("img") = objTampon
                Catch ex As Exception
                    Throw New ApplicationException(ex.Message, ex.InnerException)
                Finally
                    If image IsNot Nothing Then
                        image.Dispose()
                    End If

                    If NewBmp IsNot Nothing Then
                        NewBmp.Dispose()
                    End If

                    If Stream IsNot Nothing Then
                        Stream.Close()
                    End If
                End Try

***************

/* La classe Image */
****************

Public Class clsImage

    ''' <summary>
    ''' Calcule les dimensions d'une image
    ''' </summary>
    ''' Objet image pour lequel on recherche les dimensions

    ''' <returns>Retourne un Size contenant les dimensions de l'image</returns>
    ''' <remarks></remarks>
    Shared Function CalculeTailleImage(ByVal ObjImg As Image) As Size

        Dim b As System.Drawing.Bitmap = Nothing
        Dim imgClientSize As Size = New System.Drawing.Size(0, 0)

        b = New System.Drawing.Bitmap(ObjImg)
        imgClientSize = New System.Drawing.Size(b.Size.Width, b.Size.Height)

        Return imgClientSize

    End Function

    ''' <summary>
    ''' Redimmensionne une image
    ''' </summary>
    ''' Entier définissant la nouvelle hauteur de l'image

    ''' Entier définissant la nouvelle largeur de l'image

    ''' Objet image qui sera redimmensionné

    ''' <returns>Retounre un Bitmap de la nouvelle image</returns>
    ''' <remarks>Le Bitmap est utile au cas où l'on veut enregistrer l'image dans un flux (Stream)
    ''' afin d'enregistrer l'image dans une Base de Donnée par exemple</remarks>
    Shared Function RedimensionneImage(ByVal iNewHeight As Integer, _
                                       ByVal iNewWidth As Integer, _
                                       ByVal ObjImg As Image) As Bitmap

        Dim b As System.Drawing.Bitmap = New System.Drawing.Bitmap(ObjImg)
        Dim Newb As System.Drawing.Bitmap = New System.Drawing.Bitmap(ObjImg, iNewWidth, iNewHeight)

        Return Newb

    End Function

    ''' <summary>
    ''' Vérifie la taille d'une image et la redimensionne si besoin
    ''' </summary>
    ''' Entier définissant la hauteur maximale autorisée

    ''' Entier définissant la largeur maximale autorisée

    ''' Objet image à vérifier

    ''' <returns>Retounre un Bitmap de la nouvelle image</returns>
    ''' <remarks>Le Bitmap est utile au cas où l'on veut enregistrer l'image dans un flux (Stream)
    ''' afin d'enregistrer l'image dans une Base de Donnée par exemple. Cette fonction utilise les Fonctions CalculeTailleImage et RedimensionneImage</remarks>
    Shared Function VerifieTailleImage(ByVal iMaxHeigth As Integer, _
                                       ByVal iMaxWidth As Integer, _
                                       ByVal ObjImg As Image) As Bitmap

        Dim iCoefficient As Double = 0
        Dim iCoefficientHeight As Double = 0
        Dim iCoefficientWidth As Double = 0
        Dim iNewHeight As Integer = 0
        Dim iNewWidth As Integer = 0
        Dim iHeightImg As Integer = 0
        Dim iWidthImg As Integer = 0
        Dim imgClientSize As Size = New System.Drawing.Size(0, 0)
        Dim ObjRetun As Object = Nothing

        imgClientSize = CalculeTailleImage(ObjImg)

        iHeightImg = imgClientSize.Height
        iWidthImg = imgClientSize.Width

        If Not imgClientSize.IsEmpty AndAlso (iHeightImg > iMaxHeigth Or iWidthImg > iMaxWidth) Then
            iCoefficientHeight = iMaxHeigth / iHeightImg
            iCoefficientWidth = iMaxWidth / iWidthImg

            If iCoefficientHeight <= iCoefficientWidth Then
                iCoefficient = iCoefficientHeight
            Else
                iCoefficient = iCoefficientWidth
            End If

            iNewHeight = CInt(iHeightImg * iCoefficient)
            iNewWidth = CInt(iWidthImg * iCoefficient)

        Else
            iNewHeight = iHeightImg
            iNewWidth = iWidthImg
        End If

        ObjRetun = RedimensionneImage(iNewHeight, iNewWidth, ObjImg)

        Return ObjRetun

    End Function

End Class

****************

Blowdesign
0
Rejoignez-nous