首先项目中引入BitMiracle.LibTiff.NET的dll
命名空间:
using BitMiracle.LibTiff.Classic; using System.Runtime.InteropServices; using System.Windows.Forms;
private static Bitmap TiffToBitmap(string asTiffFile) { Bitmap bmp = null; try { bmp = (Bitmap)Bitmap.FromFile(asTiffFile); return bmp; } catch { } Tiff tif = Tiff.Open(asTiffFile, "r"); if (tif == null) { return null; } // 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();
// Read the image into the memory buffer int[] raster = new int[height * width];
if (!tif.ReadRGBAImage(width, height, raster)) { tif.Close(); tif.Dispose(); return null; } tif.Close(); tif.Dispose(); // bitmap作成 bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb); Rectangle rect = new 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); bmp.UnlockBits(bmpdata); return bmp; }
使用方法:
Bitmap oBmp = TiffToBitmap(asFileName);