代码之家  ›  专栏  ›  技术社区  ›  Beatles1692

生成多页tiff不起作用

  •  1
  • Beatles1692  · 技术社区  · 16 年前

    我正在尝试使用以下命令从现有图片生成多页TIFF文件: code by Bob Powell

    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,并添加我自己的图片,而不是该帧。

    2 回复  |  直到 5 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    [评论后删除第一部分]

    LibTIFF.NET ; 我在使用标准库处理TIFF时发现了许多quicks(16位灰度图像上的内存相关和一致崩溃)。

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

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

    Using LibTiff from c# to access tiled tiff images

    [编辑] TheCodeProject : Save images into a multi-page TIFF file... [/编辑]

        2
  •  0
  •   Beatles1692    16 年前

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

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

    现在,结果将包括所有帧。

    推荐文章