mirror of https://github.com/SixLabors/ImageSharp
2 changed files with 103 additions and 94 deletions
@ -0,0 +1,101 @@ |
|||
// Copyright (c) Six Labors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.Common.Helpers; |
|||
using SixLabors.ImageSharp.Metadata; |
|||
using SixLabors.ImageSharp.Metadata.Profiles.Exif; |
|||
|
|||
namespace SixLabors.ImageSharp.Formats.Experimental.Tiff |
|||
{ |
|||
internal static class TiffFrameMetadataResolutionExtensions |
|||
{ |
|||
public static void SetResolutions(this TiffFrameMetadata meta, PixelResolutionUnit unit, double horizontal, double vertical) |
|||
{ |
|||
switch (unit) |
|||
{ |
|||
case PixelResolutionUnit.AspectRatio: |
|||
case PixelResolutionUnit.PixelsPerInch: |
|||
case PixelResolutionUnit.PixelsPerCentimeter: |
|||
break; |
|||
case PixelResolutionUnit.PixelsPerMeter: |
|||
{ |
|||
unit = PixelResolutionUnit.PixelsPerCentimeter; |
|||
horizontal = UnitConverter.MeterToCm(horizontal); |
|||
vertical = UnitConverter.MeterToCm(vertical); |
|||
} |
|||
|
|||
break; |
|||
default: |
|||
unit = PixelResolutionUnit.PixelsPerInch; |
|||
break; |
|||
} |
|||
|
|||
meta.SetSingle(ExifTag.ResolutionUnit, (ushort)unit + 1); |
|||
meta.SetResolution(ExifTag.XResolution, horizontal); |
|||
meta.SetResolution(ExifTag.YResolution, vertical); |
|||
} |
|||
|
|||
public static PixelResolutionUnit GetResolutionUnit(this TiffFrameMetadata meta) |
|||
{ |
|||
if (!meta.TryGetSingle(ExifTag.ResolutionUnit, out ushort res)) |
|||
{ |
|||
res = TiffFrameMetadata.DefaultResolutionUnit; |
|||
} |
|||
|
|||
return (PixelResolutionUnit)(res - 1); |
|||
} |
|||
|
|||
public static double? GetResolution(this TiffFrameMetadata meta, ExifTag tag) |
|||
{ |
|||
if (!meta.TryGetSingle(tag, out Rational resolution)) |
|||
{ |
|||
return null; |
|||
} |
|||
|
|||
double res = resolution.ToDouble(); |
|||
switch (meta.ResolutionUnit) |
|||
{ |
|||
case PixelResolutionUnit.AspectRatio: |
|||
return 0; |
|||
case PixelResolutionUnit.PixelsPerCentimeter: |
|||
return UnitConverter.CmToInch(res); |
|||
case PixelResolutionUnit.PixelsPerMeter: |
|||
return UnitConverter.MeterToInch(res); |
|||
case PixelResolutionUnit.PixelsPerInch: |
|||
default: |
|||
// DefaultResolutionUnit is Inch
|
|||
return res; |
|||
} |
|||
} |
|||
|
|||
private static void SetResolution(this TiffFrameMetadata meta, ExifTag tag, double? value) |
|||
{ |
|||
if (value == null) |
|||
{ |
|||
meta.Remove(tag); |
|||
return; |
|||
} |
|||
else |
|||
{ |
|||
double res = value.Value; |
|||
switch (meta.ResolutionUnit) |
|||
{ |
|||
case PixelResolutionUnit.AspectRatio: |
|||
res = 0; |
|||
break; |
|||
case PixelResolutionUnit.PixelsPerCentimeter: |
|||
res = UnitConverter.InchToCm(res); |
|||
break; |
|||
case PixelResolutionUnit.PixelsPerMeter: |
|||
res = UnitConverter.InchToMeter(res); |
|||
break; |
|||
case PixelResolutionUnit.PixelsPerInch: |
|||
default: |
|||
break; |
|||
} |
|||
|
|||
meta.SetSingle(tag, new Rational(res)); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue