diff --git a/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj b/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj
index fc240a71fd19..e861a8aebf07 100644
--- a/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj
+++ b/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj
@@ -33,6 +33,13 @@
$(DefineConstants);NATIVE_AOT
+
+
+
+
+ true
+
+
@@ -66,7 +73,7 @@
-
+
diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue16767_Downsize.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue16767_Downsize.cs
index 26b355683623..988d991be9ff 100644
--- a/src/Controls/tests/TestCases.HostApp/Issues/Issue16767_Downsize.cs
+++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue16767_Downsize.cs
@@ -44,12 +44,29 @@ public class Issue16767_DownsizeDrawable : IDrawable
{
public void Draw(ICanvas canvas, RectF dirtyRect)
{
- IImage image;
- var assembly = GetType().GetTypeInfo().Assembly;
- using (var stream = assembly.GetManifestResourceStream("Controls.TestCases.HostApp.Resources.Images.royals.png"))
+ IImage image = null;
+
+ try
{
- image = PlatformImage.FromStream(stream);
+ // Use FileSystem.OpenAppPackageFileAsync for MauiAsset approach
+ var task = FileSystem.OpenAppPackageFileAsync("royals.png");
+ task.Wait();
+ using (var stream = task.Result)
+ {
+ // Copy to MemoryStream to ensure stream is properly buffered for marshal methods
+ using (var memoryStream = new MemoryStream())
+ {
+ stream.CopyTo(memoryStream);
+ memoryStream.Position = 0;
+ image = PlatformImage.FromStream(memoryStream);
+ }
+ }
}
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine($"Failed to load image: {ex.Message}");
+ }
+
if (image is not null)
{
float spacing = 20;
diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue16767_Resize.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue16767_Resize.cs
index 2e0f47a448d7..9bd2fd12981e 100644
--- a/src/Controls/tests/TestCases.HostApp/Issues/Issue16767_Resize.cs
+++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue16767_Resize.cs
@@ -97,11 +97,27 @@ internal void SetResizeMode(ResizeMode resizeMode)
public void Draw(ICanvas canvas, RectF dirtyRect)
{
- IImage image;
- var assembly = GetType().GetTypeInfo().Assembly;
- using (var stream = assembly.GetManifestResourceStream("Controls.TestCases.HostApp.Resources.Images.royals.png"))
+ IImage image = null;
+
+ try
{
- image = PlatformImage.FromStream(stream);
+ // Use FileSystem.OpenAppPackageFileAsync for MauiAsset approach
+ var task = FileSystem.OpenAppPackageFileAsync("royals.png");
+ task.Wait();
+ using (var stream = task.Result)
+ {
+ // Copy to MemoryStream to ensure stream is properly buffered for marshal methods
+ using (var memoryStream = new MemoryStream())
+ {
+ stream.CopyTo(memoryStream);
+ memoryStream.Position = 0;
+ image = PlatformImage.FromStream(memoryStream);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine($"Failed to load image: {ex.Message}");
}
if (image is not null)
diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue21886.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue21886.cs
index 7a1a89476415..4ded879abb05 100644
--- a/src/Controls/tests/TestCases.HostApp/Issues/Issue21886.cs
+++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue21886.cs
@@ -45,9 +45,21 @@ Button CreateButton(string text, EventHandler handler)
async Task LoadImageAsync()
{
- var assembly = GetType().GetTypeInfo().Assembly;
- using var stream = assembly.GetManifestResourceStream("Controls.TestCases.HostApp.Resources.Images.royals.png");
- return await Task.FromResult(PlatformImage.FromStream(stream));
+ try
+ {
+ // Use FileSystem.OpenAppPackageFileAsync for MauiAsset approach
+ using var stream = await FileSystem.OpenAppPackageFileAsync("royals.png");
+ // Copy to MemoryStream to ensure stream is properly buffered for marshal methods
+ using var memoryStream = new MemoryStream();
+ await stream.CopyToAsync(memoryStream);
+ memoryStream.Position = 0;
+ return PlatformImage.FromStream(memoryStream);
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine($"Failed to load image: {ex.Message}");
+ return null;
+ }
}
async void OnResize(object sender, EventArgs e)
diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue30006.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue30006.cs
index 179e25dea3c0..165291db846d 100644
--- a/src/Controls/tests/TestCases.HostApp/Issues/Issue30006.cs
+++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue30006.cs
@@ -45,9 +45,21 @@ Button CreateButton(string text, EventHandler handler)
async Task LoadImageAsync()
{
- var assembly = GetType().GetTypeInfo().Assembly;
- using var stream = assembly.GetManifestResourceStream("Controls.TestCases.HostApp.Resources.Images.royals.png");
- return await Task.FromResult(PlatformImage.FromStream(stream));
+ try
+ {
+ // Use FileSystem.OpenAppPackageFileAsync for MauiAsset approach
+ using var stream = await FileSystem.OpenAppPackageFileAsync("royals.png");
+ // Copy to MemoryStream to ensure stream is properly buffered for marshal methods
+ using var memoryStream = new MemoryStream();
+ await stream.CopyToAsync(memoryStream);
+ memoryStream.Position = 0;
+ return PlatformImage.FromStream(memoryStream);
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine($"Failed to load image: {ex.Message}");
+ return null;
+ }
}
async void OnDownSize(object sender, EventArgs e)
diff --git a/src/Graphics/src/Graphics/Platforms/Android/PlatformImage.cs b/src/Graphics/src/Graphics/Platforms/Android/PlatformImage.cs
index a08072db46d2..1b66d4dfa839 100644
--- a/src/Graphics/src/Graphics/Platforms/Android/PlatformImage.cs
+++ b/src/Graphics/src/Graphics/Platforms/Android/PlatformImage.cs
@@ -156,8 +156,28 @@ public IImage ToPlatformImage()
public static IImage FromStream(Stream stream, ImageFormat formatHint = ImageFormat.Png)
{
- var bitmap = BitmapFactory.DecodeStream(stream);
- return new PlatformImage(bitmap);
+ Bitmap bitmap;
+
+ if (stream is null)
+ {
+ return null;
+ }
+ //For memory efficiency, use a single MemoryStream and access its buffer directly
+ using (var memoryStream = new MemoryStream())
+ {
+ if (stream.CanSeek)
+ {
+ stream.Position = 0;
+ }
+ stream.CopyTo(memoryStream);
+
+ // Get the buffer and actual length
+ byte[] buffer = memoryStream.GetBuffer();
+ int length = (int)memoryStream.Length;
+ bitmap = BitmapFactory.DecodeByteArray(buffer, 0, length);
+ }
+
+ return bitmap != null ? new PlatformImage(bitmap) : null;
}
}
}
diff --git a/src/Graphics/src/Graphics/Platforms/Mac/PlatformImage.cs b/src/Graphics/src/Graphics/Platforms/Mac/PlatformImage.cs
index 180bbbd50afd..de003604fba5 100644
--- a/src/Graphics/src/Graphics/Platforms/Mac/PlatformImage.cs
+++ b/src/Graphics/src/Graphics/Platforms/Mac/PlatformImage.cs
@@ -174,9 +174,6 @@ public IImage ToPlatformImage()
public static IImage FromStream(Stream stream, ImageFormat formatHint = ImageFormat.Png)
{
- if (stream == null)
- return null;
-
var previous = NSApplication.CheckForIllegalCrossThreadCalls;
NSApplication.CheckForIllegalCrossThreadCalls = false;
var data = NSData.FromStream(stream);