//此处修改文件路径
using (Tiff tif = Tiff.Open(@"c:\1.tif", "r"))
{
for (short i = 0; i < tif.NumberOfDirectories(); i++)
{
tif.SetDirectory(i);
// Find the width and height of the image
FieldValue[] value = tif.GetField(TiffTag.IMAGEWIDTH);
int width = value[0].ToInt();
value = tif.GetField(TiffTag.IMAGELENGTH);
int height = value[0].ToInt();
value = tif.GetField(TiffTag.XRESOLUTION);
float dpiX = value[0].ToFloat();
value = tif.GetField(TiffTag.YRESOLUTION);
float dpiY = value[0].ToInt();
// Read the image into the memory buffer
int[] raster = new int[height * width];
if (!tif.ReadRGBAImage(width, height, raster))
{
MessageBox.Show("Could not read image");
return;
}
using (Bitmap bmp = new Bitmap(width, height,PixelFormat.Format24bppRgb))
{
System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpdata = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
byte[] 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);
}
}
Marshal.Copy(bits, 0, bmpdata.Scan0, bits.Length);
//设置DPI
bmp.SetResolution(dpiX, dpiY);
bmp.UnlockBits(bmpdata);
bmp.Save("TiffTo24BitBitmap" + i + ".jpg", ImageFormat.Jpeg);
}
}
}
需要引用BitMiracle.LibTiff.NET.dll 地址BitMiracle,PixelFormat命名控件为System.Drawing.Imaging,Marshal命名空间System.Runtime.InteropServices,该方法是为了解决其他的实现方式在Windows Server 2003下会出现问题。