20

我正在通过 OCR 从图像中读取文本。它只支持 TIFF 格式的图像。

所以,我需要将其他格式转换为 TIFF 格式。可以做到吗?请通过提供一些参考来帮助。

4

6 回答 6

22

如果Image在 .NET 中创建对象,可以将其保存为 TIFF。它是您可以使用的众多ImageFormat选择之一。

例子:

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

您需要将System.Drawing程序集包含在您的项目中。该程序集将为您提供许多图像处理功能。希望有帮助。

于 2012-08-07T06:36:00.420 回答
14

简介注:

  1. 这个答案涵盖了赏金问题;即:我们如何将多个文件转换为 1 个 tiff?例如,假设有 pdf、jpeg、png,我想用它们创建 1 个 tiff?
  2. 在这个答案中,我使用https://imagemagick.org/index.php的 .net 实现进行图像处理,并使用 Ghostscript 帮助读取 AI/EPS/PDF/PS 文件,以便我们可以将其转换为图像文件,两者都是可信且官方来源。
  3. 在我回答了这个问题后,我在电子邮件中收到了一些额外的问题,询问其他合并选项,因此我扩展了我的答案。

IMO 有两个步骤可以实现您的目标:

  1. 安装pdf转换所需的工具
  2. 从源中获取所有图像,包括 pdf 格式的文件,并将它们合并到一个 tiff 文件中。

1.安装帮助Pdf到图像转换的工具:

仅当您打算转换 AI/EPS/PDF/PS 文件格式时才需要第 1 步。否则直接跳到第 2 步。

为了使将 pdf 转换为任何图像格式成为可能,我们需要一个可以读取 pdf 文件的库,并且我们需要一个将其转换为图像类型的工具。为此,我们需要安装Ghostscript(GNU Affero 通用公共许可证)。

之后,我们需要在 Visual Studio 中安装ImageMagick.net for .net,nuget link

到目前为止,一切都很好。

2.代码部分

第二步和最后一步是我们需要从文件夹位置读取文件(png、jpg、bmp、pdf 等)并将每个文件添加到,MagickImageCollection然后我们有几个选项可以合并使用AppendHorizontally、或多页 Tiff。ImageMagick 有很多功能,比如调整大小、分辨率等,这只是演示合并功能的示例:AppendVerticallyMontage

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);
}

这是 C:\temp\Images 中的 4 个输入文件:

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

运行代码后,我们在 C:\temp\Output 下得到 4 个新文件,如下所示:

在此处输入图像描述 4 页多页 Tiff

在此处输入图像描述 4 图像垂直合并

在此处输入图像描述 4 图像水平合并

在此处输入图像描述 4 图像蒙太奇合并

最后说明:

  1. 可以使用 System.Drawing 将多个图像合并到 tiff;并使用 System.Drawing.Imaging;不使用 ImageMagick,但 pdf 确实需要第三方转换库或工具,因此我将 Ghostscript 和 ImageMagick 用于 C#。
  2. ImageMagick 具有许多功能,因此您可以更改输出文件的分辨率、大小等。它是公认的库。

免责声明:此答案的一部分取自我的个人网站https://itbackyard.com/how-to-convert-ai-eps-pdf-ps-to-image-file/以及 github 的源代码。

于 2019-08-21T20:26:51.067 回答
4

以 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());
    }
于 2019-08-19T07:05:36.773 回答
3

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 用于 C# 接口。见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

于 2019-08-21T22:06:21.187 回答
2

我用 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;
    }
于 2014-07-03T15:14:13.873 回答
2

这就是我转换上传到网站的图像的方式。对其进行了更改,使其输出 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);
于 2019-08-15T18:57:12.943 回答