我正在通过OCR实现从图像中读取文本。它仅支持TIFF格式图像。
所以,我需要将其他格式转换为TIFF格式。可以吗?
请帮忙提供一些参考。
答案 0 :(得分:17)
如果在.NET中创建Image
对象,则可以将其另存为TIFF。这是您可以选择的众多ImageFormat选项之一。
示例:
var png = Image.FromFile("some.png");
png.Save("a.tiff", ImageFormat.Tiff);
您需要在项目中加入System.Drawing
程序集。该程序集将为您提供大量的图像处理功能。希望有所帮助。
答案 1 :(得分:13)
简介注释:
- 此答案涵盖了赏金问题;这是:我们如何 将多个文件转换成1个TIFF文件?例如,假设有pdf文件, jpeg,png和我要从其中创建1个tiff?
- 在这个答案中,我使用https://imagemagick.org/index.php的.net实现进行图像处理,并使用Ghostscript来帮助读取AI / EPS / PDF / PS文件,因此我们可以将其转换为可信的官方图像文件。
- 回答了这个问题后,我的电子邮件中又问了一些其他合并选项,因此我扩大了答案。
IMO,您的目标有2个步骤:
仅当您打算转换AI / EPS / PDF / PS文件格式时才需要步骤1。否则,请跳至步骤2。
要使pdf转换为任何图像格式成为可能,我们需要一个可以读取pdf文件的库,并且需要一个将其转换为图像类型的工具。为此,我们将需要安装Ghostscript(GNU Affero通用公共许可证)。
在此之后,我们需要在Visual Studio中为.net安装ImageMagick.net,使用nuget link。
到目前为止很好。
第二步,最后一步是,我们需要从文件夹位置读取文件(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个新文件,如下所示:
最后的提示:
- 可以使用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的源代码。
答案 2 :(得分:4)
以tif格式隐藏图像。在下面的示例中,将图像转换并设置为文本框。要看到文本框中的图像是(.tif formate)。此源代码正在工作。
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());
}
答案 3 :(得分:3)
ImageMagick命令行可以轻松做到这一点。它在大多数Linux系统上提供,并且也可用于Mac或Windows。参见https://imagemagick.org/script/download.php
mogrify -format tiff -path path/to/output_directory *
或者您可以使用
convert image1.suffix1 image2.suffix2 ... -compress XXX imageN.suffixN output.tiff
ImageMagick支持将多个图像组合成一个多页TIFF。而且图像可以是混合类型,甚至包括PDF。
{{1}}
您可以选择多种压缩格式,也可以选择不压缩。
请参见
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
中列出您可以在同一命令行中轻松处理图像以调整其大小,转换为灰度,过滤(锐化),阈值等。
请参见
答案 4 :(得分: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);
答案 5 :(得分:1)
我用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;
}