Преобразование изображения в поток - PullRequest
4 голосов
/ 30 марта 2012

Я использую функцию, которая загружает изображение, берет поток и изменяет его размер с помощью imageresizer.net, а затем загружает поток в Amazon S3.

Теперь я хочу сделать локальный снимок и преобразовать его в поток. (чтобы изменить размер и загрузить в amazonS3). В основном, как вы конвертируете изображение в поток.

Это может быть простой вопрос, но нигде не смог найти ответ.

Вот базовый код.

Public Shared Sub MoveToAmazon(strImg As String, SKU As String)
        Dim fullImg As String = "C:\ImageLocation\" & strImg
        Dim img As Image = Image.FromFile(fullImg)

        'Here Im missing the code to convert it to a stream.
        UploadImage(imgStream, SKU)  

End Sub


Public Shared Sub UploadImage(imgStream As Stream, imgName As String)

    Dim MainStream As Stream = New MemoryStream
    Dim HomeStream As Stream = New MemoryStream
    Dim SmallStream As Stream = New MemoryStream
    Dim TinyStream As Stream = New MemoryStream
    Dim MidStream As Stream = New MemoryStream
    Dim GridStream As Stream = New MemoryStream
    Dim ListStream As Stream = New MemoryStream


    Dim c As New ImageResizer.Configuration.Config

    Dim SourceImage As Bitmap = New Bitmap(imgStream)
    Dim SourceMain As Bitmap = New Bitmap(SourceImage)
    Dim SourceHome As Bitmap = New Bitmap(SourceImage)
    Dim SourceSmall As Bitmap = New Bitmap(SourceImage)
    Dim SourceTiny As Bitmap = New Bitmap(SourceImage)
    Dim SourceMid As Bitmap = New Bitmap(SourceImage)
    Dim SourceGrid As Bitmap = New Bitmap(SourceImage)
    Dim SourceList As Bitmap = New Bitmap(SourceImage)

    ImageResizer.ImageBuilder.Current.Build(SourceMain, MainStream, New ResizeSettings("width=300&height=372&scale=both&paddingWidth=40")) 'ProductPage
    ImageResizer.ImageBuilder.Current.Build(SourceHome, HomeStream, New ResizeSettings("width=112&height=147&scale=both")) 'HomePage Products
    ImageResizer.ImageBuilder.Current.Build(SourceGrid, GridStream, New ResizeSettings("width=149&height=149&scale=both")) 'Categories Grid
    ImageResizer.ImageBuilder.Current.Build(SourceList, ListStream, New ResizeSettings("width=171&height=206&scale=both")) 'Categories List
    ImageResizer.ImageBuilder.Current.Build(SourceSmall, SmallStream, New ResizeSettings("width=64&height=75&scale=both")) 'Accessories
    ImageResizer.ImageBuilder.Current.Build(SourceTiny, TinyStream, New ResizeSettings("width=82&height=82&scale=both")) 'Cart
    ImageResizer.ImageBuilder.Current.Build(SourceMid, MidStream, New ResizeSettings("width=155&height=116&scale=both")) 'CategoryMain


    AmazonUploadFile("OriginalImages/" & imgName, imgStream)
    AmazonUploadFile("MainImages/" & imgName, MainStream)
    AmazonUploadFile("HomeImages/" & imgName, HomeStream)
    AmazonUploadFile("GridImages/" & imgName, GridStream)
    AmazonUploadFile("ListImages/" & imgName, ListStream)
    AmazonUploadFile("SmallImages/" & imgName, SmallStream)
    AmazonUploadFile("TinyImages/" & imgName, TinyStream)
    AmazonUploadFile("MidImages/" & imgName, MidStream)
End Sub

Public Shared Sub AmazonUploadFile(S3Key As String, FileStream As Stream)
    Dim request As New PutObjectRequest()
    request.WithBucketName(BUCKET_NAME)
    request.WithKey(S3Key).InputStream = FileStream
    request.WithCannedACL(S3CannedACL.PublicRead)
    GetS3Client.PutObject(request)
End Sub

Ответы [ 3 ]

5 голосов
/ 04 апреля 2012

[Отказ от ответственности - я являюсь автором библиотеки ImageResizing.NET , о которой ОП задает вопрос.]

Народ - НЕ используйте растровое изображениеи изображения экземпляров, если вы можете избежать этого.Существует гигантский список ловушек , которые приведут к краху вашего сервера.НЕ ИСПОЛЬЗУЙТЕ НИЧЕГО из System.Drawing без серверной оболочки вокруг него.

@ dash - Ваш код почти верен, кроме утечек памяти.

Декодирование и кодирование изображений безопасно не так просто.Пусть библиотека ImageResizing.Net справится с этим.

Dim settings as New ResizeSettings("width=64&height=75&scale=both")
Using ms As New MemoryStream()
    ImageBuilder.Current.Build("C:\ImageLocation\" & strImg, ms, settings)
    ms.Seek(0, SeekOrigin.Begin) 
    UploadImage(ms, SKU)
End Using

Никогда не загружайте что-либо в экземпляр Bitmap или Image, если вы создаете несколько версий.Вместо этого клонируйте файл в MemoryStream.

Using fs as New FileStream(...)
  Using ms as MemoryStream = Util.StreamUtils.CopyStream(fs)
     'For loop here with your setting variations
     ms.Seek(0, SeekOrigin.Begin)
     'Place upload and resize code here
     'End Loop
  End Using
End Using
3 голосов
/ 30 марта 2012

Следующий фрагмент кода должен делать то, что вы хотите:

  Using myImage = Image.FromFile(fullImg)
    Using ms As New MemoryStream()
        myImage.Save(ms, ImageFormat.Jpeg)
        ms.Seek(0, SeekOrigin.Begin) 
        UploadImage(ms, SKU)  
    End Using
  End Using

Кроме того, вам может оказаться проще параметризовать ваши методы и выполнять всю работу при их вызове. Нечто подобное может сделать вашу жизнь проще (предполагается, что код, который вы разместили, - это код, который вы фактически используете, а не демонстрационная версия):

Public Shared Sub UploadImages()
    'Call this for each image
    MoveToAmazon("C:\ImageLocation\blah.jpg", "OriginalImage", 300, 300, 0, "whatever")

End Sub


Public Shared Sub MoveToAmazon(strImg As String, targetFolder As String, height as Integer, width as Integer, padding as Integer, SKU As String)
        Dim fullImg As String = "" & strImg
        Using img = Image.FromFile(fullImg)
            'Here Im missing the code to convert it to a stream.
            Using ms As New MemoryStream()
                Image.Save(ms, ImageFormat.Jpeg)
                ms.Seek(0, SeekOrigin.Begin) 
                UploadImage(ms, SKU)  
            End Using
        End Using
End Sub


Public Shared Sub UploadImage(imgStream As Stream, imgName As String, targetFolder As String, height as Integer, width as Integer, padding as Integer, SKU As String)

    Dim c As New ImageResizer.Configuration.Config

    ImageResizer.ImageBuilder.Current.Build(SourceMain, imgStream, New ResizeSettings("width=" & CStr(width) & "&height=" & CStr(height) & "&scale=both&paddingWidth=" & CStr(padding)) 

    AmazonUploadFile(targetFolder & "/" & imgName, imgStream)

End Sub

Public Shared Sub AmazonUploadFile(S3Key As String, FileStream As Stream)
    Dim request As New PutObjectRequest()
    request.WithBucketName(BUCKET_NAME)
    request.WithKey(S3Key).InputStream = FileStream
    request.WithCannedACL(S3CannedACL.PublicRead)
    GetS3Client.PutObject(request)
End Sub


Using ms As New MemoryStream()
    Image.Save(ms, ImageFormat.Jpeg)
    ms.Seek(0, SeekOrigin.Begin) 
    UploadImage(ms, SKU)  
End Using
2 голосов
/ 30 марта 2012

Считайте байты изображения и затем оберните его в MemoryStream

MemoryStream ms = new MemoryStrean(imageBytes);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...