首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何利用LibTiff.Net拆分多页Tiff

如何利用LibTiff.Net拆分多页Tiff
EN

Stack Overflow用户
提问于 2012-11-01 13:33:36
回答 1查看 5.4K关注 0票数 5

在LibTiff.Net 文档中,我发现可以获得Tiff文档的特定页面。

但是,如果可以在不知道存在多少页的情况下拆分多页Tiff (使用),则可以使用吗?怎么做?

使用示例,它只返回第一页。

顺便说一句,主要的问题是Windows不能处理不同的tiff映像,所以我想将它分成jpeg映像。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-01 14:09:08

代码语言:javascript
复制
//open tif file
var tif = Tiff.Open(@"file", "r");

//get number of pages
var num = tif.NumberOfDirectories();

for (short i = 0; i < num; i++)
{
    //set current page
    tif.SetDirectory(i); 

    Bitmap bmp = GetBitmapFormTiff(tif);
    bmp.Save(string.Format(@"newfile{0}.bmp", i));
}

GetBitmapFormTiff的代码来自示例

代码语言:javascript
复制
private static Bitmap GetBitmapFormTiff(Tiff tif)
        {
            FieldValue[] value = tif.GetField(TiffTag.IMAGEWIDTH);
            int width = value[0].ToInt();

            value = tif.GetField(TiffTag.IMAGELENGTH);
            int height = value[0].ToInt();

            //Read the image into the memory buffer
            var raster = new int[height * width];
            if (!tif.ReadRGBAImage(width, height, raster))
            {
                return null;
            }

            var bmp = new Bitmap(width, height, PixelFormat.Format32bppRgb);

            var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);

            BitmapData bmpdata = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
            var bits = new byte[bmpdata.Stride * bmpdata.Height];

            for (int y = 0; y < bmp.Height; y++)
            {
                int rasterOffset = y * bmp.Width;
                int bitsOffset = (bmp.Height - y - 1) * bmpdata.Stride;

                for (int x = 0; x < bmp.Width; x++)
                {
                    int rgba = raster[rasterOffset++];
                    bits[bitsOffset++] = (byte)((rgba >> 16) & 0xff);
                    bits[bitsOffset++] = (byte)((rgba >> 8) & 0xff);
                    bits[bitsOffset++] = (byte)(rgba & 0xff);
                    bits[bitsOffset++] = (byte)((rgba >> 24) & 0xff);
                }
            }

            System.Runtime.InteropServices.Marshal.Copy(bits, 0, bmpdata.Scan0, bits.Length);
            bmp.UnlockBits(bmpdata);

            return bmp;
        }
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13178185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档