Я работаю над чтением текста с изображения через OCR. Он поддерживает только изображения в формате TIFF.
Итак, мне нужно конвертировать другие форматы в формат TIFF. Это можно сделать? Пожалуйста, помогите, предоставив некоторые ссылки.
Я работаю над чтением текста с изображения через OCR. Он поддерживает только изображения в формате TIFF.
Итак, мне нужно конвертировать другие форматы в формат TIFF. Это можно сделать? Пожалуйста, помогите, предоставив некоторые ссылки.
Если вы создаете объект Image
в .NET, вы можете сохранить его как TIFF. Это один из многих ImageFormat в вашем распоряжении.
Пример:
var png = Image.FromFile("some.png");
png.Save("a.tiff", ImageFormat.Tiff);
Вам нужно включить в проект проект сборки System.Drawing
. Эта сборка даст вам много возможностей манипулирования изображениями. Надеюсь, что это поможет.
Intro Note:
- Этот ответ охватывает вопрос о наградах; что: как мы конвертировать несколько файлов в 1 TIFF? Например, допустим, есть PDF, JPEG, PNG, и я хотел бы создать 1 TIFF из них?
- В этом ответе я использую .net реализацию https://imagemagick.org/index.php для работы с изображениями и Ghostscript для помощи в чтении файла AI/EPS/PDF/PS, чтобы мы могли перевести его в файлы изображений, которые являются достоверными и официальными источниками.
- После того, как я ответил на этот вопрос, в моем электронном письме я получил дополнительный вопрос с другими вариантами слияния, поэтому я расширил свой ответ.
ИМО есть 2 шага к вашей цели:
Шаг 1 требуется только в том случае, если вы собираетесь конвертировать форматы файлов AI/EPS/PDF/PS. В противном случае просто перейдите к шагу 2.
Чтобы сделать возможным преобразование PDF в любой формат изображения, нам нужна библиотека, которая может читать файлы PDF, и нам нужен инструмент для преобразования его в тип изображения. Для этого нам потребуется установить Ghostscript (Стандартная общественная лицензия GNU Affero).
После этого нам нужно установить ImageMagick.net для .net в Visual Studio, ссылку nua link.
Пока все хорошо.
Второй и последний шаг - нам нужно прочитать файлы (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:
После запуска кода мы получаем 4 новых файла в папке C:\temp\Output, которые выглядят так:
Многостраничный Tiff на 4 страницы
Вертикальное слияние 4 изображений
Горизонтальное слияние 4 изображений
Final note:
- можно объединить несколько изображений, используя System.Drawing; и используя System.Drawing.Imaging; без использования ImageMagick, но pdf требует сторонней библиотеки преобразования или инструмента, поэтому я использую Ghostscript и ImageMagick для С#.
- ImageMagick имеет много функций, так что вы можете изменить разрешение, размер выходного файла и т.д. Это хорошо узнаваемая библиотека.
Отказ от ответственности: часть этого ответа взята с моего личного веб-сайта https://itbackyard.com/how-to-convert-ai-eps-pdf-ps-to-image-file/ с исходным кодом на github.
Чтобы быть скрытым изображение в формате 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());
}
Командная строка 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
Вы можете легко обрабатывать изображения, чтобы изменять их размер, преобразовывать в оттенки серого, фильтровать (резкость), пороговые значения и т.д., Все в одной командной строке.
Видеть
Я тестировал это с помощью 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;
}
Так я конвертирую изображения, загруженные на сайт. Изменено так, что он выводит файлы 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);