Использование EXIF для ориентации изображения на C#
Пример
В этом примере для ориентации изображения используется следующий код.
// Ориентируйте изображение правильно. public static void OrientImage(Image img) { // Получить ориентацию изображения. ExifOrientations orientation = ImageOrientation(img); // Ориентируйте изображение. switch (orientation) { case ExifOrientations.Unknown: case ExifOrientations.TopLeft: break; case ExifOrientations.TopRight: img.RotateFlip(RotateFlipType.RotateNoneFlipX); break; case ExifOrientations.BottomRight: img.RotateFlip(RotateFlipType.Rotate180FlipNone); break; case ExifOrientations.BottomLeft: img.RotateFlip(RotateFlipType.RotateNoneFlipY); break; case ExifOrientations.LeftTop: img.RotateFlip(RotateFlipType.Rotate90FlipX); break; case ExifOrientations.RightTop: img.RotateFlip(RotateFlipType.Rotate90FlipNone); break; case ExifOrientations.RightBottom: img.RotateFlip(RotateFlipType.Rotate90FlipY); break; case ExifOrientations.LeftBottom: img.RotateFlip(RotateFlipType.Rotate270FlipNone); break; } // Установите ориентацию изображения на TopLeft. SetImageOrientation(img, ExifOrientations.TopLeft); } // Установите ориентацию изображения. public static void SetImageOrientation(Image img, ExifOrientations orientation) { // Получить индекс свойства ориентации. int orientation_index = Array.IndexOf(img.PropertyIdList, OrientationId); // Если такого свойства нет, ничего не делайте. if (orientation_index < 0) return; // Установите значение ориентации. PropertyItem item = img.GetPropertyItem(OrientationId); item.Value[0] = (byte)orientation; img.SetPropertyItem(item); }
Метод OrientImage вызывает метод ImageOrientation, описанный в более ранний пример , чтобы увидеть, как изображение ориентировано. Затем он вызывает метод Image класса RotateFlip для поворота и переворачивания изображения, чтобы он был справа вверх. Он заканчивается вызовом метода SetImageOrientation, чтобы сделать ориентацию объекта Image TopLeft, нормальную правую сторону вверх.
Метод SetImageOrientation находит индекс свойства идентификатора ориентации изображения. Если этот идентификатор присутствует, метод получает свой PropertyItem и устанавливает значение Value элемента в новую ориентацию. Затем он использует метод Image объекта SetPropertyItem для установки нового значения.
После переориентации изображения вы можете сохранить его в файл, если хотите.
Следующий код показывает, как основная программа отображает исходные и ориентированные изображения.
// Откройте файл и прочитайте его информацию о ориентации. private void btnOpen_Click(object sender, EventArgs e) { // Откройте файл. using (Bitmap bm = new Bitmap(txtFile.Text)) { // Отображение исходного изображения. Bitmap original_bm = new Bitmap(bm); picOriginal.Image = original_bm; // Отображение свойства изображения. // Примечание. Если для создания копии используется новый битмап (bm) // тогда свойства EXIF теряются. Вместо этого клоун. Bitmap oriented_bm = (Bitmap)bm.Clone(); ExifStuff.OrientImage(oriented_bm); picOriented.Image = oriented_bm; } }
Код создает Bitmap, удерживающий изображение. Затем он копирует исходное изображение и отображает его.