|
|
|
@ -121,7 +121,7 @@ namespace Emby.Drawing.Common
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="binaryReader">The binary reader.</param>
|
|
|
|
|
/// <returns>System.Int16.</returns>
|
|
|
|
|
private static short ReadLittleEndianInt16(BinaryReader binaryReader)
|
|
|
|
|
private static short ReadLittleEndianInt16(this BinaryReader binaryReader)
|
|
|
|
|
{
|
|
|
|
|
var bytes = new byte[sizeof(short)];
|
|
|
|
|
|
|
|
|
@ -137,7 +137,7 @@ namespace Emby.Drawing.Common
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="binaryReader">The binary reader.</param>
|
|
|
|
|
/// <returns>System.Int32.</returns>
|
|
|
|
|
private static int ReadLittleEndianInt32(BinaryReader binaryReader)
|
|
|
|
|
private static int ReadLittleEndianInt32(this BinaryReader binaryReader)
|
|
|
|
|
{
|
|
|
|
|
var bytes = new byte[sizeof(int)];
|
|
|
|
|
for (int i = 0; i < sizeof(int); i += 1)
|
|
|
|
@ -205,25 +205,30 @@ namespace Emby.Drawing.Common
|
|
|
|
|
/// <exception cref="System.ArgumentException"></exception>
|
|
|
|
|
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)
|
|
|
|
|
{
|
|
|
|
|
byte marker = binaryReader.ReadByte();
|
|
|
|
|
short chunkLength = ReadLittleEndianInt16(binaryReader);
|
|
|
|
|
if (marker == 0xc0)
|
|
|
|
|
short chunkLength = binaryReader.ReadLittleEndianInt16();
|
|
|
|
|
// 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();
|
|
|
|
|
int height = ReadLittleEndianInt16(binaryReader);
|
|
|
|
|
int width = ReadLittleEndianInt16(binaryReader);
|
|
|
|
|
return new ImageSize
|
|
|
|
|
{
|
|
|
|
|
Width = width,
|
|
|
|
|
Height = height
|
|
|
|
|
};
|
|
|
|
|
// https://help.accusoft.com/ImageGear/v18.2/Windows/ActiveX/IGAX-10-12.html
|
|
|
|
|
binaryReader.ReadByte(); // We don't care about the first byte
|
|
|
|
|
int height = binaryReader.ReadLittleEndianInt16();
|
|
|
|
|
int width = binaryReader.ReadLittleEndianInt16();
|
|
|
|
|
return new ImageSize(width, height);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (chunkLength < 0)
|
|
|
|
|
{
|
|
|
|
|
var uchunkLength = (ushort)chunkLength;
|
|
|
|
|
ushort uchunkLength = (ushort)chunkLength;
|
|
|
|
|
binaryReader.ReadBytes(uchunkLength - 2);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|