2012-03-21 66 views
2

我试图将一个图像的大小调整为5种不同的大小(然后将它们上传到amazonS3)。使用PostedFile.InputStream两次

我使用imageresizer.net

的问题似乎是,我不能使用InputStream的两倍。它第一次运作。当我尝试检索FileUpload1.PostedFile.InputStream第二次

Dim SmallStream As Stream = New MemoryStream 
    Dim TinyStream As Stream = New MemoryStream 

    If FileUpload1.HasFile Then 
     **ImageResizer.ImageBuilder.Current.Build(FileUpload1.PostedFile.InputStream, SmallStream, New ResizeSettings("maxwidth=100&maxheight=100")) 
     ImageResizer.ImageBuilder.Current.Build(FileUpload1.PostedFile.InputStream, TinyStream, New ResizeSettings("maxwidth=100&maxheight=100"))** 
     AmazonUploadFile("SmallImages/" & FileUpload1.FileName, SmallStream) 
     AmazonUploadFile("TinyImages/" & FileUpload1.FileName, TinyStream) 
    End If 




Public Shared Function GetS3Client() As AmazonS3 
    Dim appConfig As NameValueCollection = ConfigurationManager.AppSettings 
    Dim s3Client As AmazonS3 = AWSClientFactory.CreateAmazonS3Client(AWS_ACCESS_KEY, AWS_SECRET_KEY) 
    Return s3Client 
End Function 

Public 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 

代码中断。

+0

自己将流读入图像将阻止ImageResizer避免8个相关的陷阱 - 并且您还将失去除多帧TIFF或动画GIF中的第1帧以外的所有内容。请标记我的答案是否正确,以便其他人可以避免与NYSystemsAnalyst的答案有关的问题。 – 2012-04-05 15:58:48

回答

1

我相信ImageResizer会接受该方法的图像对象。因此,您可以先将InputStream读入Image对象(Image.FromStream()),然后重复使用该图像对象。

+0

这是一种比我想象的更有效的方法。 +1给你。 – David 2012-03-21 15:36:22

+0

实际上最好不共享一个Image实例,尽管如果(a)将它包装在using(){}子句中,(b)不需要元数据或自动exif旋转,(c)手动指定图像(d)不处理大量PSD或RAW/CR2图像,并且(e)不希望支持FreeImage,WIC或WPF流水线。 如果你传入一个Bitmap实例,除非你没有进一步处理Bitmap实例,否则不要使用sRotate或sFlip。 – 2012-03-26 12:14:59

+0

触摸System.Drawing的次数越少,ImageResizer可以优化图像解码,调整大小和内存管理的次数越多。 – 2012-03-26 12:15:48

1

[免责声明:我http://imageresizing.net/的作者]

FileUpload1.PostedFile而不是FileUpload1.PostedFile.InputStream到ImageResizer,它会自动处理重新搜索后的流开始每读一遍。 (确保你使用3.1.5或更高版本)。

或者,使用ImageJob类并设置ResetSourceStream=true