diff options
Diffstat (limited to 'Wrapper/FreeImage.NET/cs/Samples/Sample 08 - Creating a plugin/SerializationPlugin.cs')
-rw-r--r-- | Wrapper/FreeImage.NET/cs/Samples/Sample 08 - Creating a plugin/SerializationPlugin.cs | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/Wrapper/FreeImage.NET/cs/Samples/Sample 08 - Creating a plugin/SerializationPlugin.cs b/Wrapper/FreeImage.NET/cs/Samples/Sample 08 - Creating a plugin/SerializationPlugin.cs new file mode 100644 index 0000000..a8ef7d5 --- /dev/null +++ b/Wrapper/FreeImage.NET/cs/Samples/Sample 08 - Creating a plugin/SerializationPlugin.cs @@ -0,0 +1,222 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; +using System.Runtime.Serialization.Formatters.Binary; +using System.IO; +using System.IO.Compression; +using FreeImageAPI; +using FreeImageAPI.IO; +using FreeImageAPI.Plugins; + +namespace Sample08 +{ + public sealed class SerializationPlugin : LocalPlugin + { + // Header for the file + private byte[] header = new byte[] { 0xff, 0x12, 0x0f, 0xff, 0x01, 0x00 }; + + // Structure that will store all bitmap data. + [Serializable] + private struct SerialDib + { + public uint width; + public uint height; + public int pitch; + public uint bpp; + public uint red_mask; + public uint green_mask; + public uint blue_mask; + public byte[] data; + } + + // Implementation of 'GetImplementedMethods()' + // All implemented methods are listed. + protected override LocalPlugin.MethodFlags GetImplementedMethods() + { + return + MethodFlags.DescriptionProc | + MethodFlags.SupportsExportBPPProc | + MethodFlags.SupportsExportTypeProc | + MethodFlags.SupportsICCProfilesProc | + MethodFlags.LoadProc | + MethodFlags.SaveProc | + MethodFlags.ValidateProc | + MethodFlags.ExtensionListProc; + } + + // Returns a format string. + protected override string FormatProc() + { + return "Serialization"; + } + + // Returns a more specific description + protected override string DescriptionProc() + { + return "Serializes bitmaps for .NET"; + } + + // Returns whether a color depth is supported. + protected override bool SupportsExportBPPProc(int bpp) + { + return ((bpp == 1) || + (bpp == 4) || + (bpp == 8) || + (bpp == 16) || + (bpp == 24) || + (bpp == 32)); + } + + // This plugin can only export standard bitmaps + protected override bool SupportsExportTypeProc(FREE_IMAGE_TYPE type) + { + return (type == FREE_IMAGE_TYPE.FIT_BITMAP); + } + + // This plugin does not support icc profiles + protected override bool SupportsICCProfilesProc() + { + return false; + } + + // The function reads the first bytes of the file and compares it + // with the predefined header. + protected override bool ValidateProc(ref FreeImageIO io, fi_handle handle) + { + for (int i = 0; i < header.Length; i++) + if (ReadByte(io, handle) != header[i]) + return false; + return true; + } + + // Loading function + protected override FIBITMAP LoadProc(ref FreeImageIO io, fi_handle handle, int page, int flags, IntPtr data) + { + // Check if the data has the correct format + if (!ValidateProc(ref io, handle)) + { + // Create a free-image message + FreeImage.OutputMessageProc(format, "Invalid format."); + // return 0 (operation failed) + return FIBITMAP.Zero; + } + + SerialDib sdib; + int read = 0; + System.IO.MemoryStream stream = new System.IO.MemoryStream(); + byte[] buffer = new byte[1024]; + + do + { + // Use the helper function 'Read' to read from the source + read = Read(io, handle, 1, 1024, ref buffer); + + // Store the data in a temporary buffer + stream.Write(buffer, 0, read); + } + while (read != 0); + + // Set the memory stream back to the beginning. + stream.Position = 0; + + // Unzip the stream + GZipStream zipStream = new GZipStream(stream, CompressionMode.Decompress); + + // Create a serializer + BinaryFormatter formatter = new BinaryFormatter(); + + // Deserialize the stream + sdib = (SerialDib)formatter.Deserialize(zipStream); + + // Unload the stream + zipStream.Dispose(); + + // Use 'ConvertFromRawBits and the deserialized struct to recreate the bitmap + // In this case the marshaller is used to create the needed IntPtr to the data + // array. + FIBITMAP dib = FreeImage.ConvertFromRawBits( + Marshal.UnsafeAddrOfPinnedArrayElement(sdib.data, 0), + (int)sdib.width, (int)sdib.height, sdib.pitch, sdib.bpp, + sdib.red_mask, sdib.green_mask, sdib.blue_mask, + false); + + // Unload the temporary stream + stream.Dispose(); + + // Return the created bitmap + return dib; + } + + // Saving function + protected override bool SaveProc(ref FreeImageIO io, FIBITMAP dib, fi_handle handle, int page, int flags, IntPtr data) + { + SerialDib sdib; + uint size = FreeImage.GetDIBSize(dib); + + // Store all data needed to recreate the bitmap + sdib.width = FreeImage.GetWidth(dib); + sdib.height = FreeImage.GetHeight(dib); + sdib.pitch = (int)FreeImage.GetPitch(dib); + sdib.bpp = FreeImage.GetBPP(dib); + sdib.red_mask = FreeImage.GetRedMask(dib); + sdib.green_mask = FreeImage.GetGreenMask(dib); + sdib.blue_mask = FreeImage.GetBlueMask(dib); + sdib.data = new byte[size]; + + // Copy the bitmaps data into the structures byte-array + // The marshaller is used to create an IntPtr for using + // 'ConvertToRawBits'. + FreeImage.ConvertToRawBits(Marshal.UnsafeAddrOfPinnedArrayElement(sdib.data, 0), + dib, sdib.pitch, sdib.bpp, + sdib.red_mask, sdib.green_mask, sdib.blue_mask, + false); + + // Use the healper function to write the header to the destination + if (Write(io, handle, (uint)header.Length, 1, ref header) != 1) + return false; + + // Create a serializer + BinaryFormatter formatter = new BinaryFormatter(); + + // Create a temporary stream + MemoryStream stream = new MemoryStream(); + + // Create a compression stream + GZipStream zipStream = new GZipStream(stream, CompressionMode.Compress); + + // Serialize the structure into the compression stream + formatter.Serialize(zipStream, sdib); + + // Unload the compression stream + zipStream.Dispose(); + + // Get the result data + byte[] buffer = stream.GetBuffer(); + + // Use the healper function 'Write' to write the data to the destination + if (Write(io, handle, 1, (uint)buffer.Length, ref buffer) != buffer.Length) + { + // Unload the temporary stream + stream.Dispose(); + return false; + } + + // Unload the temporary stream + stream.Dispose(); + return true; + } + + // Return a list of supported file extensions (comma seperated) + protected override string ExtensionListProc() + { + return "ser"; + } + + // Implementation of 'ToString()' + public override string ToString() + { + return DescriptionProc(); + } + } +} |