Merge pull request #519 from Bond-009/image

Fix the DecodeJfif function to get proper image sizes
This commit is contained in:
Joshua M. Boniface 2019-01-08 18:09:54 -05:00 committed by GitHub
commit 803226acef

View File

@ -121,7 +121,7 @@ namespace Emby.Drawing.Common
/// </summary> /// </summary>
/// <param name="binaryReader">The binary reader.</param> /// <param name="binaryReader">The binary reader.</param>
/// <returns>System.Int16.</returns> /// <returns>System.Int16.</returns>
private static short ReadLittleEndianInt16(BinaryReader binaryReader) private static short ReadLittleEndianInt16(this BinaryReader binaryReader)
{ {
var bytes = new byte[sizeof(short)]; var bytes = new byte[sizeof(short)];
@ -137,7 +137,7 @@ namespace Emby.Drawing.Common
/// </summary> /// </summary>
/// <param name="binaryReader">The binary reader.</param> /// <param name="binaryReader">The binary reader.</param>
/// <returns>System.Int32.</returns> /// <returns>System.Int32.</returns>
private static int ReadLittleEndianInt32(BinaryReader binaryReader) private static int ReadLittleEndianInt32(this BinaryReader binaryReader)
{ {
var bytes = new byte[sizeof(int)]; var bytes = new byte[sizeof(int)];
for (int i = 0; i < sizeof(int); i += 1) for (int i = 0; i < sizeof(int); i += 1)
@ -205,25 +205,30 @@ namespace Emby.Drawing.Common
/// <exception cref="System.ArgumentException"></exception> /// <exception cref="System.ArgumentException"></exception>
private static ImageSize DecodeJfif(BinaryReader binaryReader) private static ImageSize DecodeJfif(BinaryReader binaryReader)
{ {
// A JPEG image consists of a sequence of segments,
// each beginning with a marker, each of which begins with a 0xFF byte
// followed by a byte indicating what kind of marker it is.
// Source: https://en.wikipedia.org/wiki/JPEG#Syntax_and_structure
while (binaryReader.ReadByte() == 0xff) while (binaryReader.ReadByte() == 0xff)
{ {
byte marker = binaryReader.ReadByte(); byte marker = binaryReader.ReadByte();
short chunkLength = ReadLittleEndianInt16(binaryReader); short chunkLength = binaryReader.ReadLittleEndianInt16();
if (marker == 0xc0) // SOF0: Indicates that this is a baseline DCT-based JPEG,
// and specifies the width, height, number of components, and component subsampling
// SOF2: Indicates that this is a progressive DCT-based JPEG,
// and specifies the width, height, number of components, and component subsampling
if (marker == 0xc0 || marker == 0xc2)
{ {
binaryReader.ReadByte(); // https://help.accusoft.com/ImageGear/v18.2/Windows/ActiveX/IGAX-10-12.html
int height = ReadLittleEndianInt16(binaryReader); binaryReader.ReadByte(); // We don't care about the first byte
int width = ReadLittleEndianInt16(binaryReader); int height = binaryReader.ReadLittleEndianInt16();
return new ImageSize int width = binaryReader.ReadLittleEndianInt16();
{ return new ImageSize(width, height);
Width = width,
Height = height
};
} }
if (chunkLength < 0) if (chunkLength < 0)
{ {
var uchunkLength = (ushort)chunkLength; ushort uchunkLength = (ushort)chunkLength;
binaryReader.ReadBytes(uchunkLength - 2); binaryReader.ReadBytes(uchunkLength - 2);
} }
else else