Skip to content

Commit 6f57091

Browse files
committed
Added HighBitDepth to the JpegWriteDefines.
1 parent 2dfa08e commit 6f57091

File tree

3 files changed

+146
-0
lines changed

3 files changed

+146
-0
lines changed

src/Magick.NET/Formats/Jpeg/JpegWriteDefines.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ public sealed class JpegWriteDefines : IWriteDefines
3232
public MagickFormat Format
3333
=> MagickFormat.Jpeg;
3434

35+
/// <summary>
36+
/// Gets or sets a value indicating whether the pixels can be written in 12 or 16 bit instead of 8 bit (jpeg:high-bit-depth).
37+
/// </summary>
38+
public bool? HighBitDepth { get; set; }
39+
3540
/// <summary>
3641
/// Gets or sets a value indicating whether optimize coding is enabled or disabled (jpeg:optimize-coding).
3742
/// </summary>
@@ -63,6 +68,9 @@ public IEnumerable<IDefine> Defines
6368
if (Extent.HasValue)
6469
yield return new MagickDefine(Format, "extent", Extent.Value + "KB");
6570

71+
if (HighBitDepth.HasValue)
72+
yield return new MagickDefine(Format, "high-bit-depth", HighBitDepth.Value);
73+
6674
if (OptimizeCoding.HasValue)
6775
yield return new MagickDefine(Format, "optimize-coding", OptimizeCoding.Value);
6876

tests/Magick.NET.Tests/Formats/Jpeg/JpegWriteDefinesTests/TheConstructor.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public void ShouldNotSetAnyDefine()
2020
Assert.Null(image.Settings.GetDefine(MagickFormat.Jpeg, "arithmetic-coding"));
2121
Assert.Null(image.Settings.GetDefine(MagickFormat.Jpeg, "dct-method"));
2222
Assert.Null(image.Settings.GetDefine(MagickFormat.Jpeg, "extent"));
23+
Assert.Null(image.Settings.GetDefine(MagickFormat.Jpeg, "high-bit-depth"));
2324
Assert.Null(image.Settings.GetDefine(MagickFormat.Jpeg, "optimize-coding"));
2425
Assert.Null(image.Settings.GetDefine(MagickFormat.Jpeg, "quality"));
2526
Assert.Null(image.Settings.GetDefine(MagickFormat.Jpeg, "q-table"));
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
// Copyright Dirk Lemstra https://github.com/dlemstra/Magick.NET.
2+
// Licensed under the Apache License, Version 2.0.
3+
4+
using System.IO;
5+
using ImageMagick;
6+
using ImageMagick.Formats;
7+
using Xunit;
8+
9+
namespace Magick.NET.Tests;
10+
11+
public partial class JpegWriteDefinesTests
12+
{
13+
public class TheHighBitDepthProperty
14+
{
15+
[Fact]
16+
public void ShouldSetTheDefine()
17+
{
18+
var defines = new JpegWriteDefines
19+
{
20+
HighBitDepth = true,
21+
};
22+
23+
using var image = new MagickImage();
24+
image.Settings.SetDefines(defines);
25+
26+
Assert.Equal("true", image.Settings.GetDefine(MagickFormat.Jpeg, "high-bit-depth"));
27+
}
28+
29+
[Fact]
30+
public void ShouldEncodeTheImageIn8bitWhenNotSet()
31+
{
32+
var defines = new JpegWriteDefines
33+
{
34+
HighBitDepth = false,
35+
};
36+
37+
using var input = new MagickImage(Files.FujiFilmFinePixS1ProJPG);
38+
input.Depth = 16;
39+
40+
using var memStream = new MemoryStream();
41+
input.Write(memStream, defines);
42+
43+
memStream.Position = 0;
44+
using var output = new MagickImage(memStream);
45+
Assert.Equal(8u, output.Depth);
46+
}
47+
48+
[Fact]
49+
public void ShouldEncodeTheImageIn12bit()
50+
{
51+
var defines = new JpegWriteDefines
52+
{
53+
HighBitDepth = true,
54+
};
55+
56+
using var input = new MagickImage(Files.FujiFilmFinePixS1ProJPG);
57+
input.Depth = 11;
58+
59+
using var memStream = new MemoryStream();
60+
input.Write(memStream, defines);
61+
62+
memStream.Position = 0;
63+
using var output = new MagickImage(memStream);
64+
Assert.Equal(12u, output.Depth);
65+
}
66+
67+
[Theory]
68+
[InlineData(2, 8)]
69+
[InlineData(3, 8)]
70+
[InlineData(4, 8)]
71+
[InlineData(5, 8)]
72+
[InlineData(6, 8)]
73+
[InlineData(7, 8)]
74+
[InlineData(8, 8)]
75+
[InlineData(9, 12)]
76+
[InlineData(10, 12)]
77+
[InlineData(11, 12)]
78+
[InlineData(12, 12)]
79+
[InlineData(13, 12)]
80+
[InlineData(14, 12)]
81+
[InlineData(15, 12)]
82+
[InlineData(16, 12)]
83+
public void ShouldEncodeTheImageInTheCorrectBitDepthWhenNotCompressingLossless(uint depth, uint expectedDepth)
84+
{
85+
var defines = new JpegWriteDefines
86+
{
87+
HighBitDepth = true,
88+
};
89+
90+
using var input = new MagickImage(Files.FujiFilmFinePixS1ProJPG);
91+
input.Depth = depth;
92+
93+
using var memStream = new MemoryStream();
94+
input.Write(memStream, defines);
95+
96+
memStream.Position = 0;
97+
using var output = new MagickImage(memStream);
98+
Assert.Equal(expectedDepth, output.Depth);
99+
}
100+
101+
[Theory]
102+
[InlineData(2)]
103+
[InlineData(3)]
104+
[InlineData(4)]
105+
[InlineData(5)]
106+
[InlineData(6)]
107+
[InlineData(7)]
108+
[InlineData(8)]
109+
[InlineData(9)]
110+
[InlineData(10)]
111+
[InlineData(11)]
112+
[InlineData(12)]
113+
[InlineData(13)]
114+
[InlineData(14)]
115+
[InlineData(15)]
116+
[InlineData(16)]
117+
public void ShouldEncodeTheImageInTheSpecifiedDepthWhenCompressingLossless(uint depth)
118+
{
119+
var defines = new JpegWriteDefines
120+
{
121+
HighBitDepth = true,
122+
};
123+
124+
using var input = new MagickImage(Files.FujiFilmFinePixS1ProJPG);
125+
input.Depth = depth;
126+
input.Quality = 100;
127+
input.Settings.Compression = CompressionMethod.LosslessJPEG;
128+
129+
using var memStream = new MemoryStream();
130+
input.Write(memStream, defines);
131+
132+
memStream.Position = 0;
133+
using var output = new MagickImage(memStream);
134+
Assert.Equal(depth, output.Depth);
135+
}
136+
}
137+
}

0 commit comments

Comments
 (0)