我正在尝试使用code by Bob Powell从现有图片生成多页TIFF文件:
picture.SelectActiveFrame(FrameDimension.Page, 0);
var image = new Bitmap(picture);
using (var stream = new MemoryStream())
{
ImageCodecInfo codecInfo = null;
foreach (var imageEncoder in ImageCodecInfo.GetImageEncoders())
{
if (imageEncoder.MimeType != "image/tiff") continue;
codecInfo = imageEncoder;
break;
}
var parameters = new EncoderParameters
{
Param = new []
{
new EncoderParameter(Encoder.SaveFlag, (long) EncoderValue.MultiFrame)
}
};
image.Save(stream, codecInfo, parameters);
parameters = new EncoderParameters
{
Param = new[]
{
new EncoderParameter(Encoder.SaveFlag, (long) EncoderValue.FrameDimensionPage)
}
};
for (var i = 1; i < picture.GetFrameCount(FrameDimension.Page); i++)
{
picture.SelectActiveFrame(FrameDimension.Page, i);
var img = new Bitmap(picture);
image.SaveAdd(img, parameters);
}
parameters = new EncoderParameters
{
Param = new[]
{
new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.Flush)
}
};
image.SaveAdd(parameters);
stream.Flush();
}
但它不起作用(图像中只包含第一帧),我不知道为什么。
我想要做的是更改TIFF文件的特定帧(向其添加注释)。
我不知道是否有更简单的方法,但我想到的是从原始图片创建多页TIFF并添加我自己的图片而不是该帧。
答案 0 :(得分:1)
[评论后删除第一部分]
我正在使用LibTIFF.NET处理多页TIFF;我发现使用标准库(在16位灰度图像上存储器相关且一致的崩溃)处理TIFF有很多快速。
你的测试图像是什么?您是否尝试过多帧tiff(最好在第一帧上使用大'1',在下一帧上使用'2';这可以帮助您确定文件中包含的帧。
另一个有用的诊断可能是tiffdump实用程序,包含在LibTiff二进制文件中(也适用于windows)。这将告诉您具体的帧。
请参阅Using LibTiff from c# to access tiled tiff images
[编辑] 如果你想了解.NET的东西:我在使用标准.NET功能的多页tiffs上找到了一个新资源(尽管我会坚持使用LibTIFF。 NET):TheCodeProject : Save images into a multi-page TIFF file...如果你下载它,Form1.cs函数saveMultipage(..)中的代码片段与你的代码相似(但仍然略有不同)。特别是最后的刷新是以不同的方式完成的,文件在第一帧之前被删除...... 的 [/编辑] 强>
答案 1 :(得分:0)
似乎这个过程不会改变图像对象,但它改变了流,所以我应该得到内存流缓冲区并构建另一个图像对象:
var buffer=stream.GetBuffer();
using(var newStream=new MemoryStream(buffer))
{
var result=Image.FromStream(newStream);
}
现在结果将包括所有帧。