将不同的图片格式(jpg、gif、png等)转换为TIFF格式
Posted
技术标签:
【中文标题】将不同的图片格式(jpg、gif、png等)转换为TIFF格式【英文标题】:Convert different picture formats (jpg, gif, png, etc.) to TIFF format 【发布时间】:2012-08-07 06:32:41 【问题描述】:我正在通过 OCR 从图像中读取文本。它只支持 TIFF 格式的图像。
所以,我需要将其他格式转换为 TIFF 格式。可以做到吗?请提供一些参考资料以提供帮助。
【问题讨论】:
@l--''''''---------''''''''''''这是一个不同的问题。 l--'''''------'''''''''''' - 正如@Reza所说,通过将pdf添加到列表中您提出了一个完全不同的问题,pdf 是矢量图形格式,而包括目标 tiff 在内的其他格式是位图图形格式。因此,我将回滚该编辑。 @l--''''''------'''''''''''' 你的问题是我们如何将多个文件转换为1蒂夫?所以我知道您需要拍摄一组图像 1,2,3,4 并制作 1 个图像 tiff,将所有图像 1,2,3,4 合并到一个 tiff 文件中,对吗?问题的另一部分是,您还需要涵盖 pdf 转换,对吗?因此我有你的问题的解决方案。 @maytham-ɯɐɥʇʎɐɯ 我需要能够将图像和 pdf 文件合并为 1 个 tiff 文件 @l--''''''------'''''''''''' 你会接受基于亚马逊网络服务(AWS)的吗解决方案? 【参考方案1】:如果您在 .NET 中创建 Image
对象,则可以将其保存为 TIFF。它是您可以使用的众多ImageFormat 选择之一。
例子:
var png = Image.FromFile("some.png");
png.Save("a.tiff", ImageFormat.Tiff);
您需要在项目中包含System.Drawing
程序集。该程序集将为您提供许多图像处理功能。希望对您有所帮助。
【讨论】:
您正在转换的文件或一般错误中的更多详细信息有什么奇怪的地方吗?仅对您正在尝试的内容有一个模糊的概念,很难知道您可能会遇到什么错误。 我已经在 Ms Paint 中将 tiff 图像编辑为 gif 图像。这会导致错误吗? png.Save 是一种 void 方法,因此不能将 Tiff 设置为等于其返回值 这会使图像文件的大小增加太多,从仅 748 KB (image.jpg) 增加到 4.305 KB (image.tif)。是否可以在不增加图像大小或至少不增加那么多的情况下进行这种转换?我有一个要求,即图像不应大于 200 KB,因此我尝试将 TIFF 转换为 JPG 以减小大小,然后再次将其转换回 TIFF。转换后,我计划应用更多尺寸缩减步骤,但首先我需要能够进行此转换。Image::Save
存在移动重载,可让您具体了解编码器参数。我不是 TIFF 格式方面的专家,但您可以在这里找到一些有用的细节:msdn.microsoft.com/en-us/library/…【参考方案2】:
介绍说明:
此答案涵盖赏金问题;即:我们如何 将多个文件转换为 1 个 tiff?例如,假设有 pdf, jpeg、png,我想用它们创建 1 个 tiff? 在这个答案中,我使用 https://imagemagick.org/index.php 的 .net 实现来进行图像处理,并使用 Ghostscript 来帮助读取 AI/EPS/PDF/PS 文件,以便我们可以将其转换为可信且官方来源的图像文件。李> 在我回答了这个问题后,我在电子邮件中收到了一些额外的问题,询问其他合并选项,因此我扩展了我的答案。
IMO 有两个步骤可以实现您的目标:
-
安装 pdf 转换所需的工具
从源中获取所有图像,包括 pdf 格式的文件,并将它们合并在一起
在一个 tiff 文件中。
1。安装有助于 Pdf 到图像转换的工具:
仅当您打算转换 AI/EPS/PDF/PS 文件格式时才需要执行第 1 步。否则直接跳到第2步。
为了使将 pdf 转换为任何图像格式成为可能,我们需要一个可以读取 pdf 文件的库,并且我们需要一个将其转换为图像类型的工具。为此,我们需要安装Ghostscript(GNU Affero 通用公共许可证)。
此后,我们需要在 Visual Studio 中为 .net 安装 ImageMagick.net,nuget link。
到目前为止一切顺利。
2。代码部分
第二步也是最后一步是我们需要从文件夹位置读取文件(png、jpg、bmp、pdf 等)并将每个文件添加到MagickImageCollection
,然后我们有几个选项可以合并使用AppendHorizontally
、AppendVertically
、Montage
或多页 Tiff。 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);
这是 C:\temp\Images 中的 4 个输入文件:
运行代码后,我们在 C:\temp\Output 下得到 4 个新文件,如下所示:
4页多页Tiff
4张图片垂直合并
4张图片水平合并
4 图像蒙太奇合并
最后说明:
可以使用 System.Drawing 将多个图像合并到 tiff;并使用 System.Drawing.Imaging;不使用 ImageMagick,但 pdf 确实需要第三方转换库或工具,因此我将 Ghostscript 和 ImageMagick 用于 C#。 ImageMagick 有很多功能,所以您可以更改输出文件的分辨率、大小等。它是公认的库。
免责声明:这个答案的一部分来自我的个人网站https://itbackyard.com/how-to-convert-ai-eps-pdf-ps-to-image-file/,源代码在 github。
【讨论】:
ImageMagick 可以将输出合并到一个多页 tiff 中,而无需先合并输入图像。看我的回答。 我看到了,事情是 OP 要求提供 C# 代码,据我所知 ImageMagick 功能可以用不同的语言实现,这里包括 C#。我的观点是更改代码而不是合并,而是制作多个 tiff 页面。但正如我在 OP 的 cmets 中所理解的那样,他需要将它们合并到一个 tiff 文件中,而不是多页。如果是多页,我会更新我的答案,但我也在等待从 OP 获得一些 cmets。这不会改变 OP 需要使用 imageMagick 将 pdf 转换为图像的事实。【参考方案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());
【讨论】:
这如何回答这个问题,它会转换 pdf 吗?它会按照 OP 的要求合并文件吗? 将pdf转tiff。使用PDF转图片转换器SDK 这正是问题所在,OP想要将包括pdf在内的多个文件转换为一个tiff文件。 创建 PQScan.PDFToImage.PDFDocument 对象的实例。加载本地 PDF 文件。获取总页数。将 PDF 文件页面转换为图像。将图像保存为 tiff 图像文件类型。 赏金问题:我们如何将多个文件转换为 1 个 tiff?例如,假设有 pdf、jpeg、png,我想从中创建 1 个 tiff?【参考方案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 用于 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
【讨论】:
【参考方案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;
【讨论】:
如果文件是Stream
怎么办?
它会转换 pdf 吗?【参考方案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);
【讨论】:
它是否按照 OP 的要求将 pdf 转换为图像 @maytham-ɯɐɥʇʎɐɯ 否,因为 OP 要求转换为 TIFF。他已经有了 OCR 软件。 我的理解是这是一个老问题,所以赏金问题确实提出了以下问题:寻找来自可靠和/或官方来源的答案。我们如何将多个文件转换为 1 个 tiff?例如,假设有 pdf、jpeg、png,我想从中创建 1 个 tiff? @maytham-ɯɐɥʇʎɐɯ 我认为你是对的。 OP 正在询问 TIFF,但赏金者希望将多个图像和 pdf 合并到一个文件中。没有阅读 cmets... 如果可以的话,我会尝试创建一个解决方案。以上是关于将不同的图片格式(jpg、gif、png等)转换为TIFF格式的主要内容,如果未能解决你的问题,请参考以下文章
怎么将.jpg .bmp .gif 图片转换成 iso exe res dll 等格式?