我目前正在开发一个Windows应用程序,我必须在其中拍照,在本地保存,然后在调用同步时将其发送到将服务器上保存图片的服务。
我在复制这些图片时遇到问题。我的工作如下:
获取指定文件夹中所有图片的列表,并将他们的buffer.toarray
提取到bitearray
Dim fileList As IReadOnlyList(Of StorageFile) = Await folder.GetFilesAsync()
For Each file As StorageFile In fileList
Dim Buffer As IBuffer = Await Windows.Storage.FileIO.ReadBufferAsync(file)
fileBytes = Buffer.ToArray()
lstfileBytes.Add(fileBytes)
Next file
然后我将它发送到我的VB.Net服务,该服务将图像保存到使用stream.copyto()
For i = 0 To lstMemoryPicturesReservoir.Count - 1
Dim fs As FileStream = New FileStream("\\SERVER\Data\name.jpg", FileMode.Create)
Dim memory As Stream = New MemoryStream(lstMemoryPicturesReservoir(i))
memory.position = 0
memory.CopyTo(fs)
Next
此代码适用于我,除非图片尺寸变小到某一点。我注意到,当lenght
的{{1}}在 4000或更低附近时,图片无法正常复制。当我在 Windows Photo Viewer 中打开它时,出现以下错误:
Windows照片查看器无法显示此图片,因为文件是 空
有什么可能导致此问题或如何修复它的想法?
答案 0 :(得分:1)
尝试将两个流放入Using
块:
For i = 0 To lstMemoryPicturesReservoir.Count - 1
Using fs As FileStream = New FileStream("\\SERVER\Data\name.jpg", FileMode.Create)
Using memory As Stream = New MemoryStream(lstMemoryPicturesReservoir(i))
memory.position = 0
memory.CopyTo(fs)
End Using
End Using
Next
无论你在哪里都应该使用 Using
块:
IDisposable
接口和 Using
确保调用Dispose
接口的IDisposable
方法,即使抛出异常也是如此。
在这种情况下,Dispose
方法将确保在关闭流之前刷新所有缓冲区。我怀疑最后4000个字节没有被刷新。事实上,我怀疑你最终会注意到大于4000字节的图像的奇怪问题 - 其中一些会错过最终缓冲区的数据。没有足够的数据来阻止它们显示,但至少可以说它们看起来很奇怪。