4

画像をアップロードし、ストリームを取得し、imageresizer.netを使用してサイズを変更してから、AmazonS3にストリームをアップロードする関数を使用しています。

今、私は地元の写真を撮り、それをストリームに変換したいと思います。(サイズを変更して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
4

3 に答える 3

5

[免責事項-私は、OPが質問している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

複数のバージョンを作成している場合は、ビットマップまたはイメージインスタンスに何かをロードしないでください。代わりに、ファイルを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
于 2012-04-04T14:33:19.293 に答える
3

次のコードスニペットは、必要な処理を実行する必要があります。

  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
于 2012-03-30T14:33:21.123 に答える
2

画像バイトを読み取り、それをMemoryStreamでラップします

MemoryStream ms = new MemoryStrean(imageBytes);
于 2012-03-30T14:31:03.467 に答える