diff --git a/src/ImageProcessor/Formats/Jpg/JpegDecoder.cs b/src/ImageProcessor/Formats/Jpg/JpegDecoder.cs index 0c5a843aa..2f456dfc0 100644 --- a/src/ImageProcessor/Formats/Jpg/JpegDecoder.cs +++ b/src/ImageProcessor/Formats/Jpg/JpegDecoder.cs @@ -102,15 +102,34 @@ namespace ImageProcessor.Formats float[] pixels = new float[pixelWidth * pixelHeight * 4]; - if (!(jpg.Colorspace == Colorspace.RGB && jpg.BitsPerComponent == 8)) + if (jpg.Colorspace == Colorspace.RGB && jpg.BitsPerComponent == 8) { - throw new NotSupportedException("JpegDecoder only support RGB color space."); - } + Parallel.For( + 0, + pixelHeight, + y => + { + SampleRow row = jpg.GetRow(y); + + for (int x = 0; x < pixelWidth; x++) + { + Sample sample = row.GetAt(x); - Parallel.For( - 0, - pixelHeight, - y => + int offset = ((y * pixelWidth) + x) * 4; + + pixels[offset + 0] = sample[0] / 255f; + pixels[offset + 1] = sample[1] / 255f; + pixels[offset + 2] = sample[2] / 255f; + pixels[offset + 3] = 1; + } + }); + } + else if (jpg.Colorspace == Colorspace.Grayscale && jpg.BitsPerComponent == 8) + { + Parallel.For( + 0, + pixelHeight, + y => { SampleRow row = jpg.GetRow(y); @@ -121,11 +140,16 @@ namespace ImageProcessor.Formats int offset = ((y * pixelWidth) + x) * 4; pixels[offset + 0] = sample[0] / 255f; - pixels[offset + 1] = sample[1] / 255f; - pixels[offset + 2] = sample[2] / 255f; + pixels[offset + 1] = sample[0] / 255f; + pixels[offset + 2] = sample[0] / 255f; pixels[offset + 3] = 1; } }); + } + else + { + throw new NotSupportedException("JpegDecoder only supports RGB and Grayscale color spaces."); + } image.SetPixels(pixelWidth, pixelHeight, pixels); } diff --git a/tests/ImageProcessor.Tests/Processors/ProcessorTestBase.cs b/tests/ImageProcessor.Tests/Processors/ProcessorTestBase.cs index 3734d79ed..4e1bbc942 100644 --- a/tests/ImageProcessor.Tests/Processors/ProcessorTestBase.cs +++ b/tests/ImageProcessor.Tests/Processors/ProcessorTestBase.cs @@ -19,6 +19,7 @@ namespace ImageProcessor.Tests /// public static readonly List Files = new List { + "TestImages/Formats/Jpg/Floorplan.jpeg", "TestImages/Formats/Jpg/Calliphora.jpg", //"TestImages/Formats/Jpg/gamma_dalai_lama_gray.jpg", //Perf: Enable for local testing only "TestImages/Formats/Bmp/Car.bmp", diff --git a/tests/ImageProcessor.Tests/TestImages/Formats/Jpg/Floorplan.jpeg.REMOVED.git-id b/tests/ImageProcessor.Tests/TestImages/Formats/Jpg/Floorplan.jpeg.REMOVED.git-id new file mode 100644 index 000000000..88d957b21 --- /dev/null +++ b/tests/ImageProcessor.Tests/TestImages/Formats/Jpg/Floorplan.jpeg.REMOVED.git-id @@ -0,0 +1 @@ +5a1eaf806b7f3793d3db41c85bac6366584bce83 \ No newline at end of file