Как обрезать набор изображений на основе другого набора изображений - Фотопедия
0 голосов
/ 21 июля 2018

Я случайно переключил камеру на уменьшенное разрешение, и несколько сотен фотографий были сохранены таким образом.

Для них есть RAW, поэтому я могу переработать их до полного разрешения. К сожалению, хотя исходные ориентации изображения сохраняются, обрезка JPEG в камере, которую я использовал, отбрасывается, а файлы JPEG из RAW всегда имеют соотношение сторон 4: 3 (или 3: 4).

Подводя итог:

  • Существует один набор изображений (IMG1234.JPG - IMG2345.JPG) с уменьшенным разрешением и правильными пропорциями 3: 2, 2: 3, 4: 3 и 3: 4.
  • Существует еще один набор изображений (IMG1234.JPG - IMG2345.JPG) с полным разрешением и форматом изображения 4: 3 или 3: 4.
  • Мне нужен целевой набор изображений в полном разрешении с правильными пропорциями 3: 2, 2: 3, 4: 3 и 3: 4.

Какой рекомендуемый инструмент / цепь для этого? Спасибо.

1 Ответ

0 голосов
/ 22 июля 2018

Я разработал решение в .NET Core, которое я не собираюсь принимать (все еще жду лучшего ответа).

Проблема с этим решением состоит в том, что обрезка не без потерь (JPEG повторно сжат), и ImageSharp каким-то образом повреждает метаданные изображения - время создания даты отображается как 00:00 в XNView - мне пришлось исправить это с помощью ExifTool копирование метаданных из камеры в формате JPEG.

В противном случае он делает то, что мне нужно.

Изображения размещаются в подпапках пути:
/ S - камера JPEG с уменьшенным разрешением
/ L - переработанные JPEG из RAW с полным разрешением
/ T - целевая папка для обрезанных изображений в полном разрешении

using System;
using System.IO;
using System.Linq;
using ImageSharp;
using SixLabors.Primitives;

namespace fix
{
    class Program
    {
        static void Main(string[] args)
        {
            var smalls = Directory.GetFiles("path/S").OrderBy(p => p);
            var tPath = "path/T/";            

            foreach (var path in smalls)
            {
                using (FileStream sStream = File.OpenRead(path))
                // change path to full resolution JPEGs from RAWs
                using (FileStream lStream = File.OpenRead(path.Replace("/S/", "/L/")))
                {
                    var small = Image.Load(sStream);
                    var large = Image.Load(lStream);
                    Rectangle rect = new Rectangle();

                    // image height of the reduced resolution image with in-camera cropping
                    // it's always height, the portrait (2:3) mode is only in EXIF
                    if (small.Height == 1360)
                    {
                        // crop rectangle on the full resolution image (see above)
                        rect = new Rectangle(0, 168, 4000, 2664);
                    }

                    // this file has been cropped
                    if (rect.Width != 0)
                    {
                        using (FileStream tStream = File.OpenWrite(string.Format("{0}{1}", tPath, Path.GetFileName(path))))
                        {
                            var encoder = new ImageSharp.Formats.JpegEncoder();
                            encoder.Quality = 98; // as desired
                            large.Crop(rect).Save(tStream, encoder);
                        }
                    }
                }
            }
        }           
    }
}
Добро пожаловать на сайт Фотопедия, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...