Преобразование различных форматов изображений (jpg, gif, png и т.д.) В формат TIFF

Я работаю над чтением текста с изображения через OCR. Он поддерживает только изображения в формате TIFF.

Итак, мне нужно конвертировать другие форматы в формат TIFF. Это можно сделать? Пожалуйста, помогите, предоставив некоторые ссылки.

Ответ 1

Если вы создаете объект Image в .NET, вы можете сохранить его как TIFF. Это один из многих ImageFormat в вашем распоряжении.

Пример:

var png = Image.FromFile("some.png");
png.Save("a.tiff", ImageFormat.Tiff);

Вам нужно включить в проект проект сборки System.Drawing. Эта сборка даст вам много возможностей манипулирования изображениями. Надеюсь, что это поможет.

Ответ 2

Intro Note:

  1. Этот ответ охватывает вопрос о наградах; что: как мы конвертировать несколько файлов в 1 TIFF? Например, допустим, есть PDF, JPEG, PNG, и я хотел бы создать 1 TIFF из них?
  2. В этом ответе я использую .net реализацию https://imagemagick.org/index.php для работы с изображениями и Ghostscript для помощи в чтении файла AI/EPS/PDF/PS, чтобы мы могли перевести его в файлы изображений, которые являются достоверными и официальными источниками.
  3. После того, как я ответил на этот вопрос, в моем электронном письме я получил дополнительный вопрос с другими вариантами слияния, поэтому я расширил свой ответ.

ИМО есть 2 шага к вашей цели:

  1. Установите необходимые инструменты для конвертации в PDF
  2. Возьмите все изображения, включая файлы в формате PDF, из источника и объедините их в одном файле TIFF.

1. Установите инструменты, которые помогут преобразовать Pdf в изображение:

Шаг 1 требуется только в том случае, если вы собираетесь конвертировать форматы файлов AI/EPS/PDF/PS. В противном случае просто перейдите к шагу 2.

Чтобы сделать возможным преобразование PDF в любой формат изображения, нам нужна библиотека, которая может читать файлы PDF, и нам нужен инструмент для преобразования его в тип изображения. Для этого нам потребуется установить Ghostscript (Стандартная общественная лицензия GNU Affero).

После этого нам нужно установить ImageMagick.net для .net в Visual Studio, ссылку nua link.

Пока все хорошо.

2. Кодовая часть

Второй и последний шаг - нам нужно прочитать файлы (png, jpg, bmp, pdf и т.д.) Из папки и добавить каждый файл в MagickImageCollection, затем у нас есть несколько вариантов слияния, использовать AppendHorizontally, AppendVertically, Montage или многостраничный тифф. ImageMagick имеет множество функций, таких как изменение размера, разрешение и т.д., Это всего лишь пример, демонстрирующий объединение функций:

public static void MergeImage(string src, string dest, MergeType type = MergeType.MultiplePage)
{
    var files = new DirectoryInfo(src).GetFiles();

    using (var images = new MagickImageCollection())
    {
        foreach (var file in files)
        {
            var image = new MagickImage(file)
            {
                Format = MagickFormat.Tif,
                Depth = 8,
            };
            images.Add(image);
        }

        switch (type)
        {
            case MergeType.Vertical:
                using (var result = images.AppendVertically())
                {
                    result.AdaptiveResize(new MagickGeometry(){Height = 600, Width = 800});
                    result.Write(dest);
                }
                break;
            case MergeType.Horizontal:
                using (var result = images.AppendHorizontally())
                {
                    result.AdaptiveResize(new MagickGeometry(){Height = 600, Width = 800});
                    result.Write(dest);
                }
                break;
            case MergeType.Montage:
                var settings = new MontageSettings
                {
                    BackgroundColor = new MagickColor("#FFF"),
                    Geometry = new MagickGeometry("1x1<")
                };

                using (var result = images.Montage(settings))
                {
                    result.Write(dest);
                }
                break;
            case MergeType.MultiplePage:
                images.Write(dest);
                break;
            default:
                throw new ArgumentOutOfRangeException(nameof(type), type, "Un-support choice");
        }

        images.Dispose();
    }
}

public enum MergeType
{
    MultiplePage,
    Vertical,
    Horizontal,
    Montage
}

Для запуска кода

public static void Main(string[] args)
{
    var src = @"C:\temp\Images";
    var dest1 = @"C:\temp\Output\MultiplePage.tiff";
    var dest2 = @"C:\temp\Output\Vertical.tiff";
    var dest3 = @"C:\temp\Output\Horizontal.tiff";
    var dest4 = @"C:\temp\Output\Montage.tiff";

    MergeImage(src, dest1);
    MergeImage(src, dest2, MergeType.Vertical);
    MergeImage(src, dest3, MergeType.Horizontal);
    MergeImage(src, dest4, MergeType.Montage);
}

Вот 4 входных файла в C:\temp\Images:

enter image description here enter image description here enter image description here enter image description here

После запуска кода мы получаем 4 новых файла в папке C:\temp\Output, которые выглядят так:

enter image description here Многостраничный Tiff на 4 страницы

enter image description here Вертикальное слияние 4 изображений

enter image description here Горизонтальное слияние 4 изображений

enter image description here 4 изображения Montage Merge

Final note:

  1. можно объединить несколько изображений, используя System.Drawing; и используя System.Drawing.Imaging; без использования ImageMagick, но pdf требует сторонней библиотеки преобразования или инструмента, поэтому я использую Ghostscript и ImageMagick для С#.
  2. ImageMagick имеет много функций, так что вы можете изменить разрешение, размер выходного файла и т.д. Это хорошо узнаваемая библиотека.

Отказ от ответственности: часть этого ответа взята с моего личного веб-сайта https://itbackyard.com/how-to-convert-ai-eps-pdf-ps-to-image-file/ с исходным кодом на github.

Ответ 3

Чтобы быть скрытым изображение в формате TIF. В приведенном ниже примере, чтобы преобразовать изображение и установить в текстовое поле. Чтобы увидеть изображение в текстовом поле есть (.tif формат). Этот исходный код работает.

private void btn_Convert(object sender, EventArgs e)
    {
        string newName = System.IO.Path.GetFileNameWithoutExtension(CurrentFile);
        newName = newName + ".tif";
        try
        {
            img.Save(newName, ImageFormat.Tiff);
        }
        catch (Exception ex)
        {
            string error = ee.Message.ToString();
            MessageBox.Show(MessageBoxIcon.Error);

        }
        textBox2.Text = System.IO.Path.GetFullPath(newName.ToString());
    }

Ответ 4

Командная строка ImageMagick может сделать это легко. Он поставляется в большинстве систем Linux и также доступен для Mac или Windows. Смотрите https://imagemagick.org/script/download.php

convert image.suffix -compress XXX image.tiff


или вы можете обработать целую папку файлов, используя

mogrify -format tiff -path path/to/output_directory *


ImageMagick поддерживает объединение нескольких изображений в многостраничный TIFF. И изображения могут быть смешанного типа, включая PDF.

convert image1.suffix1 image2.suffix2 ... -compress XXX imageN.suffixN output.tiff


Вы можете выбрать один из нескольких форматов сжатия или без сжатия.

Смотрите

https://imagemagick.org/script/command-line-processing.php

https://imagemagick.org/Usage/basics/

https://imagemagick.org/Usage/basics/#mogrify

https://imagemagick.org/script/command-line-options.php#compress


Или вы можете использовать Magick.Net для интерфейса С#. Смотрите https://github.com/dlemstra/Magick.NET

Главная страница ImageMagick находится на https://imagemagick.org.

Поддерживаемые форматы перечислены в https://imagemagick.org/script/formats.php

Вы можете легко обрабатывать изображения, чтобы изменять их размер, преобразовывать в оттенки серого, фильтровать (резкость), пороговые значения и т.д., Все в одной командной строке.

Видеть

https://imagemagick.org/Usage/

https://imagemagick.org/Usage/reference.html

Ответ 5

Я тестировал это с помощью jpg, bmp, png и gif. Работает для однократного и многостраничного создания tiff. Передайте ему полный путь к файлу. Надеюсь, это поможет кому-то. (извлеченный из MSDN)

public static string[] ConvertJpegToTiff(string[] fileNames, bool isMultipage)
    {
        EncoderParameters encoderParams = new EncoderParameters(1);
        ImageCodecInfo tiffCodecInfo = ImageCodecInfo.GetImageEncoders()
            .First(ie => ie.MimeType == "image/tiff");

        string[] tiffPaths = null;
        if (isMultipage)
        {
            tiffPaths = new string[1];
            System.Drawing.Image tiffImg = null;
            try
            {
                for (int i = 0; i < fileNames.Length; i++)
                {
                    if (i == 0)
                    {
                        tiffPaths[i] = String.Format("{0}\\{1}.tif",
                            Path.GetDirectoryName(fileNames[i]),
                            Path.GetFileNameWithoutExtension(fileNames[i]));

                        // Initialize the first frame of multipage tiff.
                        tiffImg = System.Drawing.Image.FromFile(fileNames[i]);
                        encoderParams.Param[0] = new EncoderParameter(
                            System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
                        tiffImg.Save(tiffPaths[i], tiffCodecInfo, encoderParams);
                    }
                    else
                    {
                        // Add additional frames.
                        encoderParams.Param[0] = new EncoderParameter(
                            System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
                        using (System.Drawing.Image frame = System.Drawing.Image.FromFile(fileNames[i]))
                        {
                            tiffImg.SaveAdd(frame, encoderParams);
                        }
                    }

                    if (i == fileNames.Length - 1)
                    {
                        // When it is the last frame, flush the resources and closing.
                        encoderParams.Param[0] = new EncoderParameter(
                            System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.Flush);
                        tiffImg.SaveAdd(encoderParams);
                    }
                }
            }
            finally
            {
                if (tiffImg != null)
                {
                    tiffImg.Dispose();
                    tiffImg = null;
                }
            }
        }
        else
        {
            tiffPaths = new string[fileNames.Length];

            for (int i = 0; i < fileNames.Length; i++)
            {
                tiffPaths[i] = String.Format("{0}\\{1}.tif",
                    Path.GetDirectoryName(fileNames[i]),
                    Path.GetFileNameWithoutExtension(fileNames[i]));

                // Save as individual tiff files.
                using (System.Drawing.Image tiffImg = System.Drawing.Image.FromFile(fileNames[i]))
                {
                    tiffImg.Save(tiffPaths[i], ImageFormat.Tiff);
                }
            }
        }

        return tiffPaths;
    }

Ответ 6

Так я конвертирую изображения, загруженные на сайт. Изменено так, что он выводит файлы Tiff. Метод вводит и выводит байтовый массив, поэтому его можно легко использовать различными способами. Но вы можете легко изменить его.

using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

public byte[] ConvertImageToTiff(byte[] SourceImage)
{
    //create a new byte array
    byte[] bin = new byte[0];

    //check if there is data
    if (SourceImage == null || SourceImage.Length == 0)
    {
        return bin;
    }

    //convert the byte array to a bitmap
    Bitmap NewImage;
    using (MemoryStream ms = new MemoryStream(SourceImage))
    {
        NewImage = new Bitmap(ms);
    }

    //set some properties
    Bitmap TempImage = new Bitmap(NewImage.Width, NewImage.Height);
    using (Graphics g = Graphics.FromImage(TempImage))
    {
        g.CompositingMode = CompositingMode.SourceCopy;
        g.CompositingQuality = CompositingQuality.HighQuality;
        g.SmoothingMode = SmoothingMode.HighQuality;
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.PixelOffsetMode = PixelOffsetMode.HighQuality;
        g.DrawImage(NewImage, 0, 0, NewImage.Width, NewImage.Height);
    }
    NewImage = TempImage;

    //save the image to a stream
    using (MemoryStream ms = new MemoryStream())
    {
        EncoderParameters encoderParameters = new EncoderParameters(1);
        encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 80L);

        NewImage.Save(ms, GetEncoderInfo("image/tiff"), encoderParameters);
        bin = ms.ToArray();
    }

    //cleanup
    NewImage.Dispose();
    TempImage.Dispose();

    //return data
    return bin;
}


//get the correct encoder info
public ImageCodecInfo GetEncoderInfo(string MimeType)
{
    ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
    for (int j = 0; j < encoders.Length; ++j)
    {
        if (encoders[j].MimeType.ToLower() == MimeType.ToLower())
            return encoders[j];
    }
    return null;
}

Для проверки

var oldImage = File.ReadAllBytes(Server.MapPath("OldImage.jpg"));
var newImage = ConvertImageToTiff(oldImage);
File.WriteAllBytes(Server.MapPath("NewImage.tiff"), newImage);