MIME Types


This article has been excerpted from book "Graphics Programming with GDI+".

MIME stands for "Multipurpose Internet Mail Extensions." It is a standard way of classifying file types on the Internet. By specifying a MIME type, application can easily identify the type of file and can extract more information and attributes about a file. Here are some useful links to Web resources that provides information about MIME types:

http://www.mhonarc.org/~ehood/MIME/MIME.html

http://msdn.microsoft.com/library/default.asp?url=/workshop/networking/moniker/overview/appendix_a.asp

ftp://ftp.isi.edu/in-notes/iana/assignments/media-types/media-types/

TABLE 8.12: ImageCodecInfo properties

Property

Description

Clsid

Returns the Guid structure that contains a GUID identifying a specific codec.

CodecName

Returns a string containing the name of the codec.

DilName

Returns a string containing the path name of the codec's DLL. If there is no DLL, returns null.

FilenameExtension

Returns a string containing the file name extension(s) used by the codec. The extensions are separated by semicolons.

Flags

Returns a 32-bit combination of flags from the ImageCodexFlag enumeration.

FormatDescription

Returns a string describing the codec's file format.

FormatID

Returns a Guid structure containing a GUID that identifies the codec's format.

MimeType

Returns a string containing the codex's Multipurpose Internet Mail Extension (MIME) type.

SignaturePatterns

Returns a two-dimensional array of bytes that can be used as a filter.

SignaturePatterns

Returns a two-dimensional array of bytes representing the signature of the codec.

Version

Returns the version number of the codec.

In Listing 8.13, after creating an EncoderParameters object, we use the Encoder and EncoderParameter objects to create three encoder parameters. These encoder parameters are responsible for changing image color depth, compression, and transformation. We use the Encoder class and set its ColorDepth property. Later the Encoder object is used as an argument to EncoderParameter, which subsequently is added to EncoderParameters. Then we also set the Transformation and Compression properties to CompressionLZW and TransformRotation180, respectively.

When we are done adding EncoderParameter object to EncoderParameters, we call the Save method of Bitmap with the EncoderParameters object. Our sample saves the bitmap to a TIFF file with 24 color depth, and LZW compression.

LISTING 8.13: Saving an image with encoder properties

        private void button1_Click(object sender, System.EventArgs e)
        {
            ImageCodecInfo imgCodecInfo = null;
            Encoder encoder = null;
             EncoderParameter encoderParam = null;
             EncoderParameters encoderParams =
            new EncoderParameters(3);

            // Create a Bitmap object from a file
            Bitmap curBitmap = new Bitmap("Roses.jpg");

            // Define mimeType
            string mimeType = "image/tiff";
             ImageCodecInfo[] encoders;
            encoders = ImageCodecInfo.GetImageEncoders();

            for (int i = 0; i < encoders.Length; ++i)
            {
                if (encoders[i].MimeType == mimeType)
                     imgCodecInfo = encoders[i];
            }

            // Sec color depth to 24 pixels
            encoder = Encoder.ColorDepth;
            encoderParam = new EncoderParameter(encoder, 24L);
             encoderParams.Param[0] = encoderParam;

            // Set compression mode to LZW
            encoder = Encoder.Compression;
            encoderParam = new EncoderParameter(encoder,
            (long)EncoderValue.CompressionLZW);
             encoderParams.Param[1] = encoderParam;

            // Set transformation to 180 degrees
            encoder = Encoder.Transformation;
            encoderParam = new EncoderParameter(encoder,
            (long)EncoderValue.TransformRotate180);
             encoderParams.Param[2] = encoderParam;

            // Save file as a TIFF file
             curBitmap.Save("newFile.tif", imgCodecInfo,
             encoderParams);

            // Dispose of object
             curBitmap.Dispose();
        }

Retrieving Information from Digital Images or Tagged Data or TIFF Files

The PropertyItems property of the Image class returns an array of PropertyItem object, which describe the attributes of an image. Each instance of PropertyItem has four properties=Id, Len, Type, and Value- which represent the identifier, length, type, and value of the property, respectively.

One common use of PropertyItem is to read the tagged data of TIFF files or the information from the JPEG images taken from a digital camera. Listing 8.14 opens a JPEG file and uses the Image.PropertyItems property to get an array of PropertyItem objects. After that we make a loop and read all property item IDs and values.

You can add this code to a button or a menu click event handler. Don't forget to add a reference to the System.Drawing.Imaging namespace.

LISTING 8.14: Retrieving information from digital images

            Graphics g = this.CreateGraphics();
            g.Clear(this.BackColor);
            Image curImage = Image.FromFile("DSCF0105.JPG");

            // Return an array of property item using
            // Image's propertyItems property
            PropertyItem[] imgProperties = curImage.PropertyItems;

            // Total Items
            string str = imgProperties.Length.ToString();
            MessageBox.Show("Properties " + str);

            // Read items and display in a message box
            for (int i = 0; i < imgProperties.Length; i++)
            {
                str = string.Empty;
                str = "Id :" + imgPropeties[i].Id.ToString();
                str += " , Values: "
                + BitConverter.ToString(imgProperties[i].Value);
                MessageBox.Show(str);
            }

            // Dispose of object
            g.Dispose();

Converting a Bitmap to Other Formats

Saving a bitmap as a PNG file or any another format is simple if we use ImageCodecInfo settings. We create an ImageCodecInfo object with MIME type image/png and use it as the second argument to the Save method of the Bitmap class. Listing 8.15 converts Shapes.bmp to Shape0.png.

LISTING 8.15: Converting from JPEG to PNG

        private void ConvertToPNG_Click(object sender, System.EventArgs e)
        {
            ImageCodecInfo imgCodecInfo = null;

            // Create a bitmap from a file
            Bitmap curBitmap = new Bitmap("Shapes.bmp");
            int j;

            // Set MIME type. This defines the format of the new file
            string mimeType = "image/png";
            ImageCodecInfo[] encoders;

            // Get GDI+ built-in image encoders
            encoders = ImageCodecInfo.GetImageEncoders();

            // Compare with our MIME type and copy it to ImageCodecInfo
            for (j = 0; j < encoders.Length; ++j)
            {
                if (encoders[j].MimeType == mimeType)
                    imgCodecInfo = encoders[j];
            }

            // Save as PNG file
            curBitmap.Save("Shape0.png", imgCodecInfo, null);

            // Dispose of object
            curBitmap.Dispose();
        }

Listing 8.15 will save Shapes.bmp to Shape0.png. You can save a file to other formats by changing the MIME type.

Conclusion

Hope the article would have helped you in understanding image class methods and properties in GDI+. Read other articles on GDI+ on the website.

bookGDI.jpg
This book teaches .NET developers how to work with GDI+ as they develop applications that include graphics, or that interact with monitors or printers. It begins by explaining the difference between GDI and GDI+, and covering the basic concepts of graphics programming in Windows.


Mindcracker
Founded in 2003, Mindcracker is the authority in custom software development and innovation. We put best practices into action. We deliver solutions based on consumer and industry analysis.