Skip to content

Commit 5c7849b

Browse files
Fix point translation
1 parent c308595 commit 5c7849b

3 files changed

Lines changed: 49 additions & 44 deletions

File tree

samples/ImageSharp.Web.Sample/wwwroot/index.html

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -272,59 +272,59 @@ <h2>EXIF Handling Portrait</h2>
272272
<p>Demonstrates that the middleware handles EXIF orientation correctly for portrait images.</p>
273273
<div>
274274
<p>
275-
<code>Portrait_0.jpg?width=60&height=50&rxy=0.25,0.25</code>
275+
<code>Portrait_0.jpg?width=60&height=50&rxy=0.69,0.37</code>
276276
</p>
277-
<p><img src="Portrait_0.jpg?width=60&height=50&rxy=0.25,0.25" /></p>
277+
<p><img src="Portrait_0.jpg?width=60&height=50&rxy=0.69,0.37" /></p>
278278
</div>
279279
<div>
280280
<p>
281-
<code>Portrait_1.jpg?width=60&height=50&rxy=0.25,0.25</code>
281+
<code>Portrait_1.jpg?width=60&height=50&rxy=0.69,0.37</code>
282282
</p>
283-
<p><img src="Portrait_1.jpg?width=60&height=50&rxy=0.25,0.25" /></p>
283+
<p><img src="Portrait_1.jpg?width=60&height=50&rxy=0.69,0.37" /></p>
284284
</div>
285285
<div>
286286
<p>
287-
<code>Portrait_2.jpg?width=60&height=50&rxy=0.25,0.25</code>
287+
<code>Portrait_2.jpg?width=60&height=50&rxy=0.69,0.37</code>
288288
</p>
289-
<p><img src="Portrait_2.jpg?width=60&height=50&rxy=0.25,0.25" /></p>
289+
<p><img src="Portrait_2.jpg?width=60&height=50&rxy=0.69,0.37" /></p>
290290
</div>
291291

292292
<div>
293293
<p>
294-
<code>Portrait_3.jpg?width=60&height=50&rxy=0.25,0.25</code>
294+
<code>Portrait_3.jpg?width=60&height=50&rxy=0.69,0.37</code>
295295
</p>
296-
<p><img src="Portrait_3.jpg?width=60&height=50&rxy=0.25,0.25" /></p>
296+
<p><img src="Portrait_3.jpg?width=60&height=50&rxy=0.69,0.37" /></p>
297297
</div>
298298
<div>
299299
<p>
300-
<code>Portrait_4.jpg?width=60&height=50&rxy=0.25,0.25</code>
300+
<code>Portrait_4.jpg?width=60&height=50&rxy=0.69,0.37</code>
301301
</p>
302-
<p><img src="Portrait_4.jpg?width=60&height=50&rxy=0.25,0.25" /></p>
302+
<p><img src="Portrait_4.jpg?width=60&height=50&rxy=0.69,0.37" /></p>
303303
</div>
304304
<div>
305305
<p>
306-
<code>Portrait_5.jpg?width=60&height=50&rxy=0.25,0.25</code>
306+
<code>Portrait_5.jpg?width=60&height=50&rxy=0.69,0.37</code>
307307
</p>
308-
<p><img src="Portrait_5.jpg?width=60&height=50&rxy=0.25,0.25" /></p>
308+
<p><img src="Portrait_5.jpg?width=60&height=50&rxy=0.69,0.37" /></p>
309309
</div>
310310

311311
<div>
312312
<p>
313-
<code>Portrait_6.jpg?width=60&height=50&rxy=0.25,0.25</code>
313+
<code>Portrait_6.jpg?width=60&height=50&rxy=0.69,0.37</code>
314314
</p>
315-
<p><img src="Portrait_6.jpg?width=60&height=50&rxy=0.25,0.25" /></p>
315+
<p><img src="Portrait_6.jpg?width=60&height=50&rxy=0.69,0.37" /></p>
316316
</div>
317317
<div>
318318
<p>
319-
<code>Portrait_7.jpg?width=60&height=50&rxy=0.25,0.25</code>
319+
<code>Portrait_7.jpg?width=60&height=50&rxy=0.69,0.37</code>
320320
</p>
321-
<p><img src="Portrait_7.jpg?width=60&height=50&rxy=0.25,0.25" /></p>
321+
<p><img src="Portrait_7.jpg?width=60&height=50&rxy=0.69,0.37" /></p>
322322
</div>
323323
<div>
324324
<p>
325-
<code>Portrait_8.jpg?width=60&height=50&rxy=0.25,0.25</code>
325+
<code>Portrait_8.jpg?width=60&height=50&rxy=0.69,0.37</code>
326326
</p>
327-
<p><img src="Portrait_8.jpg?width=60&height=50&rxy=0.25,0.25" /></p>
327+
<p><img src="Portrait_8.jpg?width=60&height=50&rxy=0.69,0.37" /></p>
328328
</div>
329329
</section>
330330

@@ -639,59 +639,59 @@ <h2>EXIF Handling : Landscape</h2>
639639
<p>Demonstrates that the middleware handles EXIF orientation correctly for landscape images.</p>
640640
<div>
641641
<p>
642-
<code>Landscape_0.jpg?width=60&height=50&rxy=0.25,0.25</code>
642+
<code>Landscape_0.jpg?width=60&height=50&rxy=0.69,0.37</code>
643643
</p>
644-
<p><img src="Landscape_0.jpg?width=60&height=50&rxy=0.25,0.25" /></p>
644+
<p><img src="Landscape_0.jpg?width=60&height=50&rxy=0.69,0.37" /></p>
645645
</div>
646646
<div>
647647
<p>
648-
<code>Landscape_1.jpg?width=60&height=50&rxy=0.25,0.25</code>
648+
<code>Landscape_1.jpg?width=60&height=50&rxy=0.69,0.37</code>
649649
</p>
650-
<p><img src="Landscape_1.jpg?width=60&height=50&rxy=0.25,0.25" /></p>
650+
<p><img src="Landscape_1.jpg?width=60&height=50&rxy=0.69,0.37" /></p>
651651
</div>
652652
<div>
653653
<p>
654-
<code>Landscape_2.jpg?width=60&height=50&rxy=0.25,0.25</code>
654+
<code>Landscape_2.jpg?width=60&height=50&rxy=0.69,0.37</code>
655655
</p>
656-
<p><img src="Landscape_2.jpg?width=60&height=50&rxy=0.25,0.25" /></p>
656+
<p><img src="Landscape_2.jpg?width=60&height=50&rxy=0.69,0.37" /></p>
657657
</div>
658658

659659
<div>
660660
<p>
661-
<code>Landscape_3.jpg?width=60&height=50&rxy=0.25,0.25</code>
661+
<code>Landscape_3.jpg?width=60&height=50&rxy=0.69,0.37</code>
662662
</p>
663-
<p><img src="Landscape_3.jpg?width=60&height=50&rxy=0.25,0.25" /></p>
663+
<p><img src="Landscape_3.jpg?width=60&height=50&rxy=0.69,0.37" /></p>
664664
</div>
665665
<div>
666666
<p>
667-
<code>Landscape_4.jpg?width=60&height=50&rxy=0.25,0.25</code>
667+
<code>Landscape_4.jpg?width=60&height=50&rxy=0.69,0.37</code>
668668
</p>
669-
<p><img src="Landscape_4.jpg?width=60&height=50&rxy=0.25,0.25" /></p>
669+
<p><img src="Landscape_4.jpg?width=60&height=50&rxy=0.69,0.37" /></p>
670670
</div>
671671
<div>
672672
<p>
673-
<code>Landscape_5.jpg?width=60&height=50&rxy=0.25,0.25</code>
673+
<code>Landscape_5.jpg?width=60&height=50&rxy=0.69,0.37</code>
674674
</p>
675-
<p><img src="Landscape_5.jpg?width=60&height=50&rxy=0.25,0.25" /></p>
675+
<p><img src="Landscape_5.jpg?width=60&height=50&rxy=0.69,0.37" /></p>
676676
</div>
677677

678678
<div>
679679
<p>
680-
<code>Landscape_6.jpg?width=60&height=50&rxy=0.25,0.25</code>
680+
<code>Landscape_6.jpg?width=60&height=50&rxy=0.69,0.37</code>
681681
</p>
682-
<p><img src="Landscape_6.jpg?width=60&height=50&rxy=0.25,0.25" /></p>
682+
<p><img src="Landscape_6.jpg?width=60&height=50&rxy=0.69,0.37" /></p>
683683
</div>
684684
<div>
685685
<p>
686-
<code>Landscape_7.jpg?width=60&height=50&rxy=0.25,0.25</code>
686+
<code>Landscape_7.jpg?width=60&height=50&rxy=0.69,0.37</code>
687687
</p>
688-
<p><img src="Landscape_7.jpg?width=60&height=50&rxy=0.25,0.25" /></p>
688+
<p><img src="Landscape_7.jpg?width=60&height=50&rxy=0.69,0.37" /></p>
689689
</div>
690690
<div>
691691
<p>
692-
<code>Landscape_8.jpg?width=60&height=50&rxy=0.25,0.25</code>
692+
<code>Landscape_8.jpg?width=60&height=50&rxy=0.69,0.37</code>
693693
</p>
694-
<p><img src="Landscape_8.jpg?width=60&height=50&rxy=0.25,0.25" /></p>
694+
<p><img src="Landscape_8.jpg?width=60&height=50&rxy=0.69,0.37" /></p>
695695
</div>
696696
</section>
697697

src/ImageSharp.Web/ExifOrientationUtilities.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,23 +38,23 @@ public static Vector2 Transform(Vector2 position, Vector2 min, Vector2 max, usho
3838
switch (orientation)
3939
{
4040
case ExifOrientationMode.TopRight:
41-
builder.AppendTranslation(new Vector2(size.Width - normalized.X, 0));
41+
builder.AppendTranslation(new Vector2(FlipNormalized(normalized.X), 0));
4242
break;
4343
case ExifOrientationMode.BottomRight:
4444
builder.AppendRotationDegrees(180);
4545
break;
4646
case ExifOrientationMode.BottomLeft:
47-
builder.AppendTranslation(new Vector2(0, size.Height - normalized.Y));
47+
builder.AppendTranslation(new Vector2(0, FlipNormalized(normalized.Y)));
4848
break;
4949
case ExifOrientationMode.LeftTop:
50-
builder.AppendTranslation(new Vector2(size.Width - normalized.X, 0));
50+
builder.AppendTranslation(new Vector2(FlipNormalized(normalized.X), 0));
5151
builder.AppendRotationDegrees(270);
5252
break;
5353
case ExifOrientationMode.RightTop:
5454
builder.AppendRotationDegrees(270);
5555
break;
5656
case ExifOrientationMode.RightBottom:
57-
builder.AppendTranslation(new Vector2(size.Width - normalized.X, 0));
57+
builder.AppendTranslation(new Vector2(FlipNormalized(normalized.X), 0));
5858
builder.AppendRotationDegrees(90);
5959
break;
6060
case ExifOrientationMode.LeftBottom:
@@ -198,5 +198,8 @@ or ExifOrientationMode.RightBottom
198198

199199
[MethodImpl(MethodImplOptions.AggressiveInlining)]
200200
private static Vector2 DeNormalize(Vector2 x, Vector2 min, Vector2 max) => min + (x * (max - min));
201+
202+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
203+
private static float FlipNormalized(float origin) => (2F * -origin) + 1F;
201204
}
202205
}

tests/ImageSharp.Web.Tests/Processors/ResizeWebProcessorTests.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -294,30 +294,32 @@ public void ResizeWebProcessor_CanReportAlphaRequirements(ResizeMode resizeMode,
294294

295295
private static PointF GetExpectedCenter(ushort orientation, PointF center)
296296
{
297+
static float FlipNormalized(float origin) => (2F * -origin) + 1F;
298+
297299
// New XY is calculated based on flipping and rotating the input XY.
298300
// Coordinates range from 0-1, hence the matching source size.
299301
AffineTransformBuilder builder = new();
300302
Size size = new(1, 1);
301303
switch (orientation)
302304
{
303305
case ExifOrientationMode.TopRight:
304-
builder.AppendTranslation(new PointF(size.Width - center.X, 0));
306+
builder.AppendTranslation(new PointF(FlipNormalized(center.X), 0));
305307
break;
306308
case ExifOrientationMode.BottomRight:
307309
builder.AppendRotationDegrees(180);
308310
break;
309311
case ExifOrientationMode.BottomLeft:
310-
builder.AppendTranslation(new PointF(0, size.Height - center.Y));
312+
builder.AppendTranslation(new PointF(0, FlipNormalized(center.Y)));
311313
break;
312314
case ExifOrientationMode.LeftTop:
313-
builder.AppendTranslation(new PointF(size.Width - center.X, 0));
315+
builder.AppendTranslation(new PointF(FlipNormalized(center.X), 0));
314316
builder.AppendRotationDegrees(270);
315317
break;
316318
case ExifOrientationMode.RightTop:
317319
builder.AppendRotationDegrees(270);
318320
break;
319321
case ExifOrientationMode.RightBottom:
320-
builder.AppendTranslation(new PointF(size.Width - center.X, 0));
322+
builder.AppendTranslation(new PointF(FlipNormalized(center.X), 0));
321323
builder.AppendRotationDegrees(90);
322324
break;
323325
case ExifOrientationMode.LeftBottom:

0 commit comments

Comments
 (0)