You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SkiaSharp解码图片仅显示顶部区域,其余90%为黑色

问题描述

我通过Fortnite API获取游戏地图图片及坐标,用来在地图上标注点位。之前用System.Drawing解决了坐标映射问题,但部署到Linux服务器后无法运行,因此改用SkiaSharp重写代码。

初次尝试的代码片段:

using var httpClient = new HttpClient();
await using var stream = await httpClient.GetStreamAsync(mapLocations.Images.Blank.AbsoluteUri);
var bitmap = SKBitmap.Decode(stream);
// 问题似乎出现在此处^

当前遇到的问题:解码后仅能显示图片顶部的蓝色区域,其余约90%的部分为黑色,看起来像是图片未完全下载。

问题截图:
约90%为黑色、带有青色X标记的图片

排查与解决建议
  • 先验证图片流完整性:将下载的流保存为本地文件,确认是否是下载环节导致的不完整。可添加以下代码测试:
using var fileStream = File.Create("test_map.png");
await stream.CopyToAsync(fileStream);
// 将流重置到开头后再解码
stream.Position = 0;
var bitmap = SKBitmap.Decode(stream);
  • 调整HttpClient配置:默认HttpClient可能存在超时或缓存问题,尝试设置更长超时时间并禁用缓存:
var httpClient = new HttpClient
{
    Timeout = TimeSpan.FromSeconds(30)
};
var request = new HttpRequestMessage(HttpMethod.Get, mapLocations.Images.Blank.AbsoluteUri);
request.Headers.CacheControl = new CacheControlHeaderValue { NoCache = true };
var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
response.EnsureSuccessStatusCode();
await using var contentStream = await response.Content.ReadAsStreamAsync();
var bitmap = SKBitmap.Decode(contentStream);
  • 改用SKData解码:先将流转换为SKData格式再解码,避免流读取不完整的问题:
await using var stream = await httpClient.GetStreamAsync(mapLocations.Images.Blank.AbsoluteUri);
using var ms = new MemoryStream();
await stream.CopyToAsync(ms);
ms.Position = 0;
using var data = SKData.Create(ms);
var bitmap = SKBitmap.Decode(data);
  • 检查Linux环境依赖:确保已安装SkiaSharp的Linux原生依赖包(如SkiaSharp.NativeAssets.Linux),避免底层解码错误。

内容的提问来源于stack exchange,提问作者muttley91

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 13:13:16