【问题标题】:Generating a multipage TIFF is not working生成多页 TIFF 不起作用
【发布时间】:2020-12-14 00:57:08
【问题描述】:

我正在尝试使用 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 并添加我自己的图片而不是那个框架。

【问题讨论】:

  • 请解释“它不工作”。发生了什么,什么失败了,你得到了什么错误(如果有的话)?
  • 它只生成一个图像对象,其中只有第一帧,其他帧不添加。
  • 您的代码在我尝试时运行良好。您是否验证了源图像有多个页面?您是否正确保存了 MemoryStream?
  • 是的,我正在测试我的源的图像是多页的。似乎这个源不适用于 Image 对象,而是对内存流进行了更改,所以我应该保存我的内存流并带来它以图像形式返回。感谢您的帮助
  • !!链接坏了!!

标签: c# gdi+ tiff multipage


【解决方案1】:

[评论后删除第一部分]

我正在使用LibTIFF.NET 处理多页 TIFF;在使用标准库处理 TIFF 时,我发现了许多快捷方式(与内存相关的以及 16 位灰度图像上的一致崩溃)。

你的测试图片是什么?您是否尝试过多帧 tiff(最好在第一帧使用大的“1”,在下一帧使用“2”等;这可以帮助您确定文件中包含的帧。

另一个有用的诊断可能是 tiffdump 实用程序,它包含在 LibTiff 二进制文件中(也适用于 Windows)。这将准确地告诉您您拥有哪些框架。

Using LibTiff from c# to access tiled tiff images

[编辑]如果您想了解 .NET 的内容:我发现了一个关于使用标准 .NET 功能的多页 tiff 的新资源(尽管我会坚持使用 LibTIFF。 NET): TheCodeProject : Save images into a multi-page TIFF file... 如果您下载它,Form1.cs 函数 saveMultipage(..) 中的代码 sn-p 与您的代码相似(但仍略有不同)。尤其是最后的刷新以不同的方式完成,文件在第一帧之前被删除...... [/编辑]

【讨论】:

  • 谢谢 Adriaan。您的回答对我帮助很大,因为我不知道那里有开源 tiff 库。我会立即尝试。关于 for 循环:我使用第一帧来构建图像本身:picture.SelectActiveFrame(FrameDimension.Page, 0); var image = new Bitmap(picture);
【解决方案2】:

这个过程似乎没有改变图像对象,但它改变了流,所以我应该获取内存流缓冲区并构建另一个图像对象:

var buffer=stream.GetBuffer();
using(var newStream=new MemoryStream(buffer))
{
var result=Image.FromStream(newStream);
}

现在结果将包括所有帧。

【讨论】:

  • 您好,能否更新一下适合您的解决方案?我尝试了您上面的建议,但对我没有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多