internal static ReadOnlySpan <byte> ToBase64([NotNull] ICoverArt coverArt) #endif { var dataLength = 32 + coverArt.MimeType.Length + coverArt.Data.Length; Span <byte> buffer = new byte[Base64.GetMaxEncodedToUtf8Length(dataLength) + 1]; // Set the picture type as "Front Cover" BinaryPrimitives.WriteUInt32BigEndian(buffer, 3); BinaryPrimitives.WriteUInt32BigEndian(buffer.Slice(4), (uint)coverArt.MimeType.Length); #if NETSTANDARD2_0 fixed(char *mimeTypeAddress = coverArt.MimeType) fixed(byte *bufferAddress = buffer.Slice(8)) Encoding.ASCII.GetBytes( mimeTypeAddress, coverArt.MimeType.Length, bufferAddress, coverArt.MimeType.Length); #else Encoding.ASCII.GetBytes(coverArt.MimeType, buffer.Slice(8)); #endif BinaryPrimitives.WriteUInt32BigEndian(buffer.Slice(12 + coverArt.MimeType.Length), (uint)coverArt.Width); BinaryPrimitives.WriteUInt32BigEndian(buffer.Slice(16 + coverArt.MimeType.Length), (uint)coverArt.Height); BinaryPrimitives.WriteUInt32BigEndian(buffer.Slice(20 + coverArt.MimeType.Length), (uint)coverArt.ColorDepth); BinaryPrimitives.WriteUInt32BigEndian(buffer.Slice(28 + coverArt.MimeType.Length), (uint)coverArt.Data.Length); coverArt.Data.CopyTo(buffer.Slice(32 + coverArt.MimeType.Length)); Base64.EncodeToUtf8InPlace(buffer, dataLength, out var bytesWritten); return(buffer.Slice(0, bytesWritten + 1)); }
internal CoverArtToPictureBlockAdapter(ICoverArt coverArt) { SetData(coverArt.Data); SetType(PictureType.CoverFront); SetMimeType(coverArt.MimeType); SetWidth(coverArt.Width); SetHeight(coverArt.Height); SetColorDepth(coverArt.ColorDepth); }
public static ICoverArt ConvertToLossy([NotNull] ICoverArt coverArt) { if (coverArt == null) { throw new ArgumentNullException(nameof(coverArt)); } if (!coverArt.Lossless) { return(coverArt); } using (var tempStream = new MemoryStream()) using (var image = Image.Load(coverArt.Data)) { image.SaveAsJpeg(tempStream); tempStream.Position = 0; return(new CoverArt(tempStream)); } }
internal static unsafe ReadOnlySpan <byte> ToBase64([NotNull] ICoverArt coverArt)
internal CoverAtom(ICoverArt coverArt) => Value = coverArt;
public CoverAtom(ReadOnlySpan <byte> data) { // There could be more than one data atom. Ignore all but the first. Value = CoverArtFactory.GetOrCreate(data.Slice(24, (int)BinaryPrimitives.ReadUInt32BigEndian(data.Slice(8, 4)) - 16)); }
internal CoverAtom([NotNull] ICoverArt coverArt) { Value = coverArt; }