private const int THUMBNAIL_DATA = 0x501B; private const int ORIENTATION_DATA = 0x0112; public static Image GetThumbnail(string path) { try { // Please do not remove :) // Written by Kourosh Derakshan // Modified by Phate for automatic exif orientation FileStream fs = File.OpenRead(path); Image img = Image.FromStream(fs, false, false); // Last parameter tells GDI+ not the load the actual image data // GDI+ throws an error if we try to read a property when the image // doesn't have that property. Check to make sure the thumbnail property // item exists. bool propertyFound = false, orientFound = false; for (int i = 0; i < img.PropertyIdList.Length; i++) { if (img.PropertyIdList[i] == ORIENTATION_DATA) { orientFound = true; } if (img.PropertyIdList[i] == THUMBNAIL_DATA) { propertyFound = true; break; } } if (!propertyFound) { fs.Dispose(); img.Dispose(); return null; } PropertyItem o = null; if (orientFound) o = img.GetPropertyItem(ORIENTATION_DATA); PropertyItem p = img.GetPropertyItem(THUMBNAIL_DATA); fs.Close(); img.Dispose(); // The image data is in the form of a byte array. Write all // the bytes to a stream and create a new image from that stream byte[] imageBytes = p.Value; MemoryStream stream = new MemoryStream(imageBytes.Length); stream.Write(imageBytes, 0, imageBytes.Length); Image temp = Image.FromStream(stream); if (o != null && Form1.ini.IniReadValue("settings", "automaticEXIF") == "true") { switch (int.Parse(string.Format("{0}", BitConverter.ToInt16(o.Value, 0)))) { case 1: temp.RotateFlip(RotateFlipType.RotateNoneFlipNone); break; case 2: temp.RotateFlip(RotateFlipType.RotateNoneFlipX); break; case 3: temp.RotateFlip(RotateFlipType.Rotate180FlipNone); break; case 4: temp.RotateFlip(RotateFlipType.Rotate180FlipX); break; case 5: temp.RotateFlip(RotateFlipType.Rotate90FlipX); break; case 6: temp.RotateFlip(RotateFlipType.Rotate90FlipNone); break; case 7: temp.RotateFlip(RotateFlipType.Rotate270FlipX); break; case 8: temp.RotateFlip(RotateFlipType.Rotate270FlipNone); break; default: temp.RotateFlip(RotateFlipType.RotateNoneFlipNone); break; } } return temp; } catch (Exception) { return null; } }
Saturday, March 23, 2013
Get thumbnails without reading the entire image
I just thought this could be useful to someone, i was searching for a method to read the thumbnail data of a Jpeg file without loading the entire file into memory, and i stumbled upon this code written by Kourosh Derakshan (Extract thumbnail image from a file without reading the whole file). The only problem was that i needed the thumbnails to have the correct orientation based on the EXIF data of the photo, so i modified it to implement that feature.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment