gpt4 book ai didi

c# - 如何使用 LibTiff.Net 拆分多页 Tiff

转载 作者:太空狗 更新时间:2023-10-30 00:26:07 25 4
gpt4 key购买 nike

在 LibTiff.Net documentation我发现可以获取 Tiff 文档的特定页面。

但是,是否可以在不知道有多少页的情况下拆分多页 Tiff(使用 LibTiff.Net)?怎么办?

使用 this例如它只返回第一页。

顺便说一句,主要问题是 Windows XP 无法处理不同的 tiff 图像,所以我想将其拆分为 jpeg 图像。

最佳答案

//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 代码来自example :

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;
}

关于c# - 如何使用 LibTiff.Net 拆分多页 Tiff,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13178185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com