.NET MAUI中使用ICanvas时DrawImage无法绘制图像的问题排查
问题:Microsoft.Maui.Graphics.Skia中DrawImage无法在画布绘制图像
我马上就要实现这个功能了……
以下是我使用Microsoft.Maui.Graphics.Skia的代码,已经更新为可运行版本,但目前唯一的问题是DrawImage函数无法在画布上绘制图像。尝试加载本地图像到画布也无法生效,问题显然出在DrawImage函数上:
private async void DrawThisThing(object sender, EventArgs e) { #if IOS || ANDROID || MACCATALYST //=================== setAsset(); // save file details as preference if (MediaPicker.Default.IsCaptureSupported) { GetCurrentLocation(); // get lat long of current location FileResult photo = await MediaPicker.CapturePhotoAsync(); if (photo != null) { try { var fName = projID.Text + "-" + assID.Text + "-" + wDetail.Text + ".jpg"; Stream sourceStream = await photo.OpenReadAsync(); devOri = DeviceDisplay.Current.MainDisplayInfo.Orientation.ToString(); var image = PlatformImage.FromStream(sourceStream); if (image != null) { IImage newImage = image.Downsize(1600, true); double lat = 0.0; double lng = 0.0; var skiaBitmap = new SkiaBitmapExportContext((int)newImage.Width, (int)newImage.Height,72); if (latlong != null) { lat = Math.Round(latlong.Latitude, 6); lng = Math.Round(latlong.Longitude, 6); } else { } ICanvas canvas = skiaBitmap.Canvas; canvas.FontColor = Colors.White; canvas.FontSize = 72; canvas.Font = Font.Default; canvas.DrawImage(newImage, 0,0,newImage.Width,newImage.Height); canvas.DrawString(lat.ToString() + " : " + lng.ToString(), 0, 0, 1600, 100, HorizontalAlignment.Left, VerticalAlignment.Top); canvas.SaveState(); using (MemoryStream _result = new MemoryStream()) { skiaBitmap.WriteToStream(_result); _result.Position = 0; savetoGallery(_result, fName); fileSaveLoc.Text = fName; if (latlong != null) { latlngRes.Text = lat.ToString() + " : " + lng.ToString(); latlong = null; } else { latlngRes.Text = "Unable to Retreive Location"; } } } } catch (Exception ex) { await DisplayAlert("Error", ex.Message, "Ok"); } } } #endif }
编辑:好的,我已成功使用Microsoft.Maui.Graphics.Skia,上述代码已更新为可运行的新版本。但目前唯一的问题是DrawImage函数无法在画布上绘制图像。有人知道原因吗?我尝试加载本地图像到画布也无法生效,显然问题确实出在DrawImage函数上?
解决方案
- 验证图像加载状态:在
Downsize后打印newImage.Width和newImage.Height,确认图像是否有效。如果尺寸为0,说明sourceStream读取异常,可尝试重新打开流或检查文件权限。 - 转换为Skia原生图像对象:将
IImage转换为Skia原生的SKImage再绘制,替换原DrawImage代码:var skiaImage = ((SkiaImage)newImage).SKImage; canvas.DrawImage(skiaImage, 0, 0, newImage.Width, newImage.Height); - 调整画布绘制顺序:将
canvas.SaveState()移到所有绘制操作完成之后,避免提前保存空白画布状态。 - 检查坐标与画布边界:尝试缩小绘制尺寸测试,比如
canvas.DrawImage(newImage, 0, 0, 800, 800),排除尺寸超出画布的可能。 - 确认图像格式兼容性:将捕获的图像流保存到本地,验证图像本身是否损坏,确保是Skia支持的格式(JPG/PNG等)。
内容的提问来源于stack exchange,提问作者KSD050
相关产品推荐
相关产品推荐

