题
我试图从现有图像使用代码由Bob鲍威尔一个多页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和添加自己的照片,而不是该帧的。
解决方案 2
看来,这个过程不会改变图像的对象,但它改变了流,所以我应该得到的内存流缓冲和构建另一个图像对象:
var buffer=stream.GetBuffer();
using(var newStream=new MemoryStream(buffer))
{
var result=Image.FromStream(newStream);
}
现在导致将包括所有的帧。
其他提示
[删除第一部分评论后]
我使用 LibTIFF.NET 具有多页的TIFF工作;我发现许多尽皆在使用标准库(存储器相关的和也是一致的崩溃对16位灰度图像)TIFF的处理。
什么是你的测试图像?有你尝试了许多帧TIFF(优选具有大的“1”上的第一帧,在下一等一个“2;这可以帮助你将被包括在文件中的框架上的某些
另一种有用的诊断可以是tiffdump效用,作为包括在二进制文件的libtiff(也为视窗)。这会告诉你,你有什么框架。
[编辑] 如果您想了解.NET的东西:我发现使用标准的.NET功能多页TIFF一个新的资源(虽然我会利用libtiff坚持。 NET): TheCodeProject:影像保存到一个多页TIFF文件... 如果你下载它,在Form1.cs功能saveMultipage(..)的代码片段是不是你的代码相似(但仍略有不同)。特别是进入年底冲洗在不同的充方式完成,并且该文件的第一帧之前删除... 的 [/编辑] 强>
不隶属于 StackOverflow