private void WriteArtwork(IntPtr tagsPtr) { NativeMethods.MP4TagArtwork newArtwork = new NativeMethods.MP4TagArtwork(); MemoryStream stream = new MemoryStream(); this.artwork.Save(stream, this.ArtworkFormat); byte[] artworkBytes = stream.ToArray(); newArtwork.data = Marshal.AllocHGlobal(artworkBytes.Length); newArtwork.size = artworkBytes.Length; Marshal.Copy(artworkBytes, 0, newArtwork.data, artworkBytes.Length); if (this.ArtworkFormat.Equals(ImageFormat.Bmp)) { newArtwork.type = NativeMethods.ArtworkType.Bmp; } else if (this.ArtworkFormat.Equals(ImageFormat.Jpeg)) { newArtwork.type = NativeMethods.ArtworkType.Jpeg; } else if (this.ArtworkFormat.Equals(ImageFormat.Gif)) { newArtwork.type = NativeMethods.ArtworkType.Gif; } else if (this.ArtworkFormat.Equals(ImageFormat.Png)) { newArtwork.type = NativeMethods.ArtworkType.Png; } else { newArtwork.type = NativeMethods.ArtworkType.Undefined; } IntPtr newArtworkPtr = Marshal.AllocHGlobal(Marshal.SizeOf(newArtwork)); Marshal.StructureToPtr(newArtwork, newArtworkPtr, false); if (this.ArtworkCount == 0) { NativeMethods.MP4TagsAddArtwork(tagsPtr, newArtworkPtr); } else { NativeMethods.MP4TagsSetArtwork(tagsPtr, 0, newArtworkPtr); } Marshal.FreeHGlobal(newArtwork.data); Marshal.FreeHGlobal(newArtworkPtr); }
private void ReadArtwork(IntPtr artworkStructurePointer) { if (artworkStructurePointer == IntPtr.Zero) { return; } NativeMethods.MP4TagArtwork artwork = artworkStructurePointer.ReadStructure <NativeMethods.MP4TagArtwork>(); byte[] artworkBuffer = new byte[artwork.size]; Marshal.Copy(artwork.data, artworkBuffer, 0, artwork.size); this.artworkStream = new MemoryStream(artworkBuffer); this.artwork = Image.FromStream(this.artworkStream); switch (artwork.type) { case NativeMethods.ArtworkType.Bmp: this.ArtworkFormat = ImageFormat.Bmp; break; case NativeMethods.ArtworkType.Gif: this.ArtworkFormat = ImageFormat.Gif; break; case NativeMethods.ArtworkType.Jpeg: this.ArtworkFormat = ImageFormat.Jpeg; break; case NativeMethods.ArtworkType.Png: this.ArtworkFormat = ImageFormat.Png; break; default: this.ArtworkFormat = ImageFormat.MemoryBmp; break; } }