我在将不同的文件/图像类型转换为 TIFF 格式时遇到了一个小问题。我们使用 Atalasoft,这是一种第三方软件,用于处理我们的文档和有关扫描和查看的图像。
我面临的问题是我在 TiffDocument() 方法中得到一个参数异常。它将文件流传递给该方法。参数异常指出文件不是 TIFF 格式。当我传入 PDF 或 JPEG 时,这是可以理解的。
我已经尝试过无数次尝试转换这些,但无济于事。每当我尝试将 jpeg 转换为 tiff 时,都会出现问题,因为图像是 AtalaImage 而不是 System.Drawing.Image。
对于 JPEG 转换,我从这里的评论部分劫持了这段代码。
public static Image ConvertToJpeg(string fileName)
{
Image retVal = null;
using (FileStream fs = File.OpenRead(fileName))
{
retVal = ConvertToJpeg(fs);
fs.Close();
}
return retVal;
}
/// <summary>
/// Converts the specified image into a JPEG format
/// </summary>
/// <param name="imgStream">The stream of the image to convert</param>
/// <returns>An Image with JPEG data if successful; otherwise null</returns>
public static Image ConvertToJpeg(Stream imgStream)
{
Image retVal = null;
Stream retStream = new MemoryStream();
using (Image img = Image.FromStream(imgStream, true, true))
{
img.Save(retStream, ImageFormat.Jpeg);
retStream.Flush();
}
retVal = Image.FromStream(retStream, true, true);
return retVal;
}
}
}
此外,Atalasoft确实有一个关于将 PDF 转换为 TIFF 的小指令,但是在 Save 方法中引发了 ArgumentException(错误消息:tiff 编解码器错误写入 tiff 流)。下面的代码与链接中的代码相同:
TiffEncoder noAppend = new TiffEncoder(TiffCompression.Default, true);
PdfDecoder pdf = new PdfDecoder();
for(int i=0; i< numPages; i++)
{
AtalaImage img = pdf.Read(inStream, i, null);
noAppend.Save(outStream, img, null);
img.Dispose();
outStream.Seek(0, SeekOrigin.Begin);
}
编辑:上面的代码有效,它成功地将 PDF 转换为 TIFF。
此外,我需要知道该文件的格式,以便可以将其发送到适当的方法进行转换。我曾尝试使用此问题中的代码,但无济于事。
下面是魔术发生的片段。有一个函数调用它,但该函数将图像设置为 WebImageViewer.Image 变量并调用以下方法:
private void Foo(AtalaImage image)
{
/*I have tried converting here, before the file stream, and after the
filestream. */
var url = wiv.ImageUrl;
var path = Page.MapPath(url);
var frame = wiv.CurrentPage - 1;
Stream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
var doc = new TiffDocument(fs); //This is where the error occurs.
var page = new TiffPage(image);
doc.Pages[frame] = page;
doc.Save(path + "_tmp");
fs.Close();
File.Delete(path);
File.Move(path + "_tmp", path);
wtv.OpenUrl(url);
wtv.SelectedIndex = frame;
wiv.OpenUrl(url, frame);
}
任何帮助或思考过程将不胜感激。