Skip to content

Commit fb8ab6b

Browse files
Merge pull request #1184 from telerik/new-kb-correcting-upside-down-image-imageeditor-dotnet-maui-8b0786e1d3c446439e2a74a25b9ace0e
Added new kb article correcting-upside-down-image-imageeditor-dotnet-maui
2 parents 3b11a68 + dc2b815 commit fb8ab6b

File tree

1 file changed

+122
-0
lines changed

1 file changed

+122
-0
lines changed
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
---
2+
title: Correcting Upside Down Image Display in ImageEditor for .NET MAUI
3+
description: Resolve the issue of upside-down image display in ImageEditor for .NET MAUI on iOS by handling EXIF metadata.
4+
type: how-to
5+
page_title: Fixing Upside Down Image in ImageEditor for .NET MAUI on iOS
6+
meta_title: Fixing Upside Down Image in ImageEditor for .NET MAUI on iOS
7+
slug: correcting-upside-down-image-imageeditor-dotnet-maui
8+
tags: imageeditor,.net maui,ios,skia,exif,bitmap,image-orientation,image-metadata
9+
res_type: kb
10+
ticketid: 1691149
11+
---
12+
13+
## Environment
14+
15+
<table>
16+
<tbody>
17+
<tr>
18+
<td> Product </td>
19+
<td> ImageEditor for .NET MAUI </td>
20+
</tr>
21+
<tr>
22+
<td> Version </td>
23+
<td> 11.0.0 </td>
24+
</tr>
25+
</tbody>
26+
</table>
27+
28+
## Description
29+
30+
Images loaded into the [ImageEditor](https://docs.telerik.com/devtools/maui/controls/imageeditor/overview) for .NET MAUI on iOS may appear upside down due to how SkiaSharp handles EXIF metadata. This metadata instructs the renderer to apply a specific rotation to the image, causing the display issue.
31+
32+
This knowledge base article also answers the following questions:
33+
- How to fix upside-down images in ImageEditor for .NET MAUI?
34+
- Why are images rotated incorrectly in ImageEditor on iOS?
35+
- How to handle EXIF metadata for ImageEditor in .NET MAUI?
36+
37+
## Solution
38+
39+
To ensure proper image orientation, handle EXIF metadata before loading the image into the ImageEditor.
40+
41+
### Steps to Correct Image Orientation
42+
43+
1. Add Helper Methods&mdash;Implement the following methods to handle image loading and orientation:
44+
45+
```csharp
46+
public SKBitmap LoadBitmapWithOrigin(Stream imageStream, out SKEncodedOrigin origin)
47+
{
48+
if (imageStream.CanSeek)
49+
imageStream.Seek(0, SeekOrigin.Begin);
50+
51+
using (var codec = SKCodec.Create(imageStream))
52+
{
53+
if (codec == null)
54+
{
55+
origin = SKEncodedOrigin.Default;
56+
return null;
57+
}
58+
59+
origin = codec.EncodedOrigin;
60+
var info = new SKImageInfo(codec.Info.Width, codec.Info.Height);
61+
var bitmap = SKBitmap.Decode(codec, info);
62+
return bitmap ?? throw new InvalidOperationException("Failed to decode the bitmap.");
63+
}
64+
}
65+
66+
public static SKBitmap? AutoOrient(SKBitmap bitmap, SKEncodedOrigin origin)
67+
{
68+
switch (origin)
69+
{
70+
case SKEncodedOrigin.BottomRight:
71+
var rotated180 = new SKBitmap(bitmap.Width, bitmap.Height);
72+
using (var surface = new SKCanvas(rotated180))
73+
{
74+
surface.RotateDegrees(180, bitmap.Width / 2, bitmap.Height / 2);
75+
surface.DrawBitmap(bitmap, 0, 0);
76+
}
77+
return rotated180;
78+
case SKEncodedOrigin.RightTop:
79+
var rotated90 = new SKBitmap(bitmap.Height, bitmap.Width);
80+
using (var surface = new SKCanvas(rotated90))
81+
{
82+
surface.Translate(rotated90.Width, 0);
83+
surface.RotateDegrees(90);
84+
surface.DrawBitmap(bitmap, 0, 0);
85+
}
86+
return rotated90;
87+
case SKEncodedOrigin.LeftBottom:
88+
var rotated270 = new SKBitmap(bitmap.Height, bitmap.Width);
89+
using (var surface = new SKCanvas(rotated270))
90+
{
91+
surface.Translate(0, rotated270.Height);
92+
surface.RotateDegrees(270);
93+
surface.DrawBitmap(bitmap, 0, 0);
94+
}
95+
return rotated270;
96+
default:
97+
return bitmap;
98+
}
99+
}
100+
```
101+
102+
2. Handle image metadata before loading&mdash;Use the helper methods to load and correct the image orientation.
103+
104+
```csharp
105+
private void LoadImage_Clicked(object sender, EventArgs e)
106+
{
107+
using var imageStream = File.OpenRead("MyImage.png");
108+
var bitmap = LoadBitmapWithOrigin(imageStream, out var origin);
109+
var rotatedBitmap = AutoOrient(bitmap, origin);
110+
111+
SKImage image = SKImage.FromPixels(rotatedBitmap.PeekPixels());
112+
imageEditor.Source = ImageSource.FromStream(() => image.Encode().AsStream());
113+
}
114+
```
115+
116+
Replace `"MyImage.png"` with the appropriate file path. Use the corrected bitmap when loading the image into the ImageEditor.
117+
118+
## See Also
119+
120+
- [ImageEditor Documentation](https://docs.telerik.com/devtools/maui/controls/imageeditor/overview)
121+
- [ImageEditor iOS EXIF Issue Discussion](https://feedback.telerik.com/maui/1600114-imageeditor-some-images-are-rotated-initially-when-displaying-in-the-editor)
122+
- [SkiaSharp API Reference](https://docs.microsoft.com/en-us/dotnet/api/skiasharp)

0 commit comments

Comments
 (0)