gpt4 book ai didi

c# - 使用读取和写入流保存文件时图像损坏

转载 作者:太空狗 更新时间:2023-10-29 21:32:43 24 4
gpt4 key购买 nike

各位程序员大家好

我正在使用 Xamarin (iOS) 的应用程序中实现下载功能,以获取正在下载的文件的进度。

我使用的代码是来自网络上的各种示例,显示相同的原理,编码风格的最大差异。它们都在 System.IO.File 上使用相同的 ReadAsync 和 WriteAsync 函数,并使用字节数组作为缓冲区。

但无论我求助于哪个示例,都会导致图片上出现不同的伪像,如下所示:

(原创/下载)

我似乎找不到发生这种情况的任何原因。我已经尝试了不同的东西,看看是什么触发了这个。我发现将缓冲区更改为更大的大小(比如 10240)会导致更多的伪影,而更小的缓冲区(比如 1024)会导致更少的伪影。

在调试不同的东西时,我找到了一种“方法”来“避免”这种情况的发生,但这包括在 WriteAsync 刚刚完成后立即添加一个 Task Delay,持续 20 毫秒(在代码中注释掉)——不是解决方案我想继续,但告诉我问题可能在于两个流的使用(在女巫中,我的知识是“仅基本用法”)。我也尝试使用非异步方法,但给出了相同的结果。

希望有人能告诉我我在这里做错了什么,以及为什么。

提前致谢

public async Task<bool> MakeDownloadRequestAsync(string url, string destination, Action<string, long, long, float> progress = null) {
if (_downloadHttpClient == null) {
_downloadHttpClient = new HttpClient (new NativeMessageHandler());
}

bool finished = false;

try {
var result = await _downloadHttpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);

long receivedBytes = 0;
long totalBytes = result.Content.Headers.ContentLength.HasValue ? result.Content.Headers.ContentLength.Value : 0;

System.Diagnostics.Debug.WriteLine ("Started download file: {0}", url);

using (var stream = await _downloadHttpClient.GetStreamAsync (url))
{
byte[] buffer = new byte[4096];
var filename = Path.GetFileName (url);
var writeStream = _fileStore.OpenWrite (Path.Combine(destination, filename));

while(true)
{
int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);

if (bytesRead == 0)
{
finished = true;
System.Diagnostics.Debug.WriteLine ("Finished downloading file: {0}", url);
break;
}


await writeStream.WriteAsync(buffer, 0, buffer.Length);
//Task.Delay(20);
receivedBytes += bytesRead;

if (progress != null)
{
progress.Invoke(url, receivedBytes, totalBytes, (float)receivedBytes/(float)totalBytes);
}
}

writeStream.Dispose();
stream.Dispose();
}

} catch (Exception e) {
System.Diagnostics.Debug.WriteLine (e);
}


return finished;
}

最佳答案

你的问题可能是这一行:

await writeStream.WriteAsync(buffer, 0, buffer.Length);

应该是:

await writeStream.WriteAsync(buffer, 0, bytesRead);

您的代码正在写入整个缓冲区...无论实际读取了多少字节。相反,您应该只写入实际读取的字节数。

关于c# - 使用读取和写入流保存文件时图像损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36548418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com