最近用到这个FreeImage.DLL,之前只是在C++里面调用,现在需要在C#里调用,于是学习了一点点,总结一下:
在FreeImage中,要用到几个参数,在C#中定义如下:
private enum FREE_IMAGE_FORMAT { FIF_UNKNOWN = -1, FIF_BMP = 0, FIF_ICO = 1, FIF_JPEG = 2, FIF_JNG = 3, FIF_KOALA = 4, FIF_LBM = 5, FIF_IFF = FIF_LBM, FIF_MNG = 6, FIF_PBM = 7, FIF_PBMRAW = 8, FIF_PCD = 9, FIF_PCX = 10, FIF_PGM = 11, FIF_PGMRAW = 12, FIF_PNG = 13, FIF_PPM = 14, FIF_PPMRAW = 15, FIF_RAS = 16, FIF_TARGA = 17, FIF_TIFF = 18, FIF_WBMP = 19, FIF_PSD = 20, FIF_CUT = 21, FIF_XBM = 22, FIF_XPM = 23, FIF_DDS = 24, FIF_GIF = 25, FIF_HDR = 26 } [StructLayout(LayoutKind.Sequential)] private struct RGBQUAD { internal byte Blue; internal byte Green; internal byte Red; internal byte Reserved; }接下来,对DLL中的函数进行申明如下:
[DllImport("FreeImage.dll", EntryPoint = "_FreeImage_Load@12", SetLastError = true)] private static extern IntPtr FreeImage_Load(FREE_IMAGE_FORMAT fif, string FileName, int Flag); [DllImport("FreeImage.dll", EntryPoint = "_FreeImage_GetFileType@8", SetLastError = true)] private static extern FREE_IMAGE_FORMAT FreeImage_GetFileType(string FileName, int Size); [DllImport("FreeImage.dll", EntryPoint = "_FreeImage_GetFIFFromFilename@4", SetLastError = true)] private static extern FREE_IMAGE_FORMAT FreeImage_GetFIFFromFilename(string FileName); [DllImport("FreeImage.dll", EntryPoint = "_FreeImage_FIFSupportsReading@4", SetLastError = true)] private static extern FREE_IMAGE_FORMAT FreeImage_FIFSupportsReading(FREE_IMAGE_FORMAT fif); [DllImport("FreeImage.dll", EntryPoint = "_FreeImage_GetWidth@4", SetLastError = true)] private static extern int FreeImage_GetWidth(IntPtr Dib); [DllImport("FreeImage.dll", EntryPoint = "_FreeImage_GetHeight@4", SetLastError = true)] private static extern int FreeImage_GetHeight(IntPtr Dib); [DllImport("FreeImage.dll", EntryPoint = "_FreeImage_GetPalette@4", SetLastError = true)] private static extern RGBQUAD* FreeImage_GetPalette(IntPtr Dib); [DllImport("FreeImage.dll", EntryPoint = "_FreeImage_GetBPP@4", SetLastError = true)] private static extern int FreeImage_GetBPP(IntPtr Dib); [DllImport("FreeImage.dll", EntryPoint = "_FreeImage_GetDIBSize@4", SetLastError = true)] private static extern int FreeImage_GetDIBSize(IntPtr Dib); [DllImport("FreeImage.dll", EntryPoint = "_FreeImage_GetColorsUsed@4", SetLastError = true)] private static extern int FreeImage_GetColorsUsed(IntPtr Dib); [DllImport("FreeImage.dll", EntryPoint = "_FreeImage_GetPitch@4", SetLastError = true)] private static extern int FreeImage_GetPitch(IntPtr Dib); [DllImport("FreeImage.dll", EntryPoint = "_FreeImage_GetBits@4", SetLastError = true)] private static extern IntPtr FreeImage_GetBits(IntPtr Dib); [DllImport("FreeImage.dll", EntryPoint = "_FreeImage_Unload@4", SetLastError = true)] private static extern int FreeImage_Free(IntPtr Dib); [DllImport("FreeImage.dll", EntryPoint = "_FreeImage_FlipVertical@4", SetLastError = true)] private static extern int FreeImage_FlipVertical(IntPtr Dib);
Bitmap Bmp = null; FREE_IMAGE_FORMAT fif = FREE_IMAGE_FORMAT.FIF_UNKNOWN; ; fif = FreeImage_GetFileType(FileName, 0);//获取加载图像的格式 if (fif == FREE_IMAGE_FORMAT.FIF_UNKNOWN) { fif = FreeImage_GetFIFFromFilename(FileName); } if ((fif != FREE_IMAGE_FORMAT.FIF_UNKNOWN) && (FreeImage_FIFSupportsReading(fif) != 0)) { IntPtr Dib = FreeImage_Load(fif, FileName, 0); //获取图像数据指针 int Bpp = FreeImage_GetBPP(Dib);//获取图像深度 PixelFormat PF; int Width, Height, Stride; switch (Bpp) { case 1: PF = PixelFormat.Format1bppIndexed; break; case 4: PF = PixelFormat.Format4bppIndexed; break; case 8: PF = PixelFormat.Format8bppIndexed; break; case 16: PF = PixelFormat.Format16bppRgb555; break; case 24: PF = PixelFormat.Format24bppRgb; break; case 32: PF = PixelFormat.Format32bppArgb; break; default: FreeImage_Free(Dib); return null; } Width = FreeImage_GetWidth(Dib); // 图像宽度 Height = FreeImage_GetHeight(Dib); // 图像高度 Stride = FreeImage_GetPitch(Dib); // 图像扫描行的大小,必然是4的整数倍
1.直接用copy函数
int copycount = Width * Height * 4; IntPtr Bits = FreeImage_GetBits(Dib); byte[] line1 = new byte[Width * Height * 4]; System.Runtime.InteropServices.Marshal.Copy(Bits, line1, 0, copycount);//copy 图像数据
byte[] line = new byte[Width * Height * 4]; byte temp; //32位 RGBA格式图像信息 BitmapData bdata = Bmp.LockBits(new Rectangle(0, 0, Bmp.Width, Bmp.Height), ImageLockMode.ReadWrite, PF); { unsafe { byte* ptr = (byte*)(bdata.Scan0); IntPtr ptr1 = bdata.Scan0; System.Runtime.InteropServices.Marshal.Copy(ptr1,line,0,copycount); } }
Bmp.UnlockBits(bdata);