C# 保存多帧TIFF
我从C#应用程序中的流中加载一个多帧TIFF,然后使用Image.save方法保存它。但是,这只保存第一帧的TIFF-如何让它保存多帧TIFF?因为您没有提供任何详细信息。。。只是一些一般提示: 多帧TIFF是非常复杂的文件-例如,每个帧可以有不同的编码。。。单个C# 保存多帧TIFF,c#,tiff,C#,Tiff,我从C#应用程序中的流中加载一个多帧TIFF,然后使用Image.save方法保存它。但是,这只保存第一帧的TIFF-如何让它保存多帧TIFF?因为您没有提供任何详细信息。。。只是一些一般提示: 多帧TIFF是非常复杂的文件-例如,每个帧可以有不同的编码。。。单个位图/图像无法保存包含此类文件所有相关信息(如编码和类似信息)的所有帧,一次只能保存一个 对于加载,您需要设置参数,该参数告诉类要加载哪个帧,否则它只加载第一帧。。。有关一些代码,请参阅 保存多帧TIFF时也会出现类似问题-此处您需要使
位图
/图像
无法保存包含此类文件所有相关信息(如编码和类似信息)的所有帧,一次只能保存一个
对于加载,您需要设置参数,该参数告诉类要加载哪个帧,否则它只加载第一帧。。。有关一些代码,请参阅
保存多帧TIFF时也会出现类似问题-此处您需要使用和使用等-有关一些工作代码,请参阅。由于@Yahia提供的代码链接已断开,我决定发布我最终使用的代码 在我的例子中,多帧TIFF已经存在,我需要做的就是加载图像,按EXIF旋转(如果需要)并保存。我不会在这里发布EXIF旋转代码,因为它与这个问题无关
using (Image img = System.Drawing.Image.FromStream(sourceStream))
{
using (FileStream fileStream = System.IO.File.Create(filePath))
{
int pages = img.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);
if (pages == 1)
{
img.Save(fileStream, img.RawFormat); // if there is just one page, just save the file
}
else
{
var encoder = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders().First(x => x.MimeType == fileInfo.MediaType);
var encoderParams = new System.Drawing.Imaging.EncoderParameters(1);
encoderParams.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, Convert.ToInt32(System.Drawing.Imaging.EncoderValue.MultiFrame));
img.Save(fileStream, encoder, encoderParams); // save the first image with MultiFrame parameter
for (int f = 1; f < pages; f++)
{
img.SelectActiveFrame(FrameDimension.Page, f); // select active page (System.Drawing.Image.FromStream loads the first one by default)
encoderParams.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, Convert.ToInt32(System.Drawing.Imaging.EncoderValue.FrameDimensionPage));
img.SaveAdd(img, encoderParams); // save add with FrameDimensionPage parameter
}
}
}
}
使用(Image img=System.Drawing.Image.FromStream(sourceStream))
{
使用(FileStream FileStream=System.IO.File.Create(filePath))
{
int pages=img.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);
如果(页数==1)
{
Save(fileStream,img.RawFormat);//如果只有一个页面,只需保存文件即可
}
其他的
{
var encoder=System.Drawing.Imaging.ImageCodeInfo.GetImageEncoders().First(x=>x.MimeType==fileInfo.MediaType);
var encoderParams=新系统.绘图.成像.编码参数(1);
encoderParams.Param[0]=新的System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag,Convert.ToInt32(System.Drawing.Imaging.EncoderValue.MultiFrame));
Save(fileStream、encoder、encoderParams);//使用MultiFrame参数保存第一个图像
对于(int f=1;f
- sourceStream是一个System.IO.MemoryStream,它保存文件内容的字节数组
- filePath是缓存目录的绝对路径(类似于'C:/cache/multiframe.tiff')
- fileInfo是一个保存实际字节数组、文件名、媒体类型和其他数据的模型