最近用到这个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);

接下来就可以调用FreeImage.dll中的函数了,用FreeImage.dll来加载一张图片,代码如下:

   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的整数倍

如果我们想要将图像数据转为BYTE[]格式,有两种方式:

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 图像数据

2.用BitMap中内存操作函数

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

以上就可以实现图像数据的操作了。

C#编程-FreeImage.dll使用方法相关推荐

  1. Delphi环境中编写调用DLL的方法和技巧

    Delphi环境中编写调用DLL的方法和技巧 第一章 为什么要使用动态链接库(DLL) top 提起DLL您一定不会陌生,在Windows中有着大量的以DLL为后缀的文件,它们是保证Windows正常 ...

  2. java dll 调用方法_关于Java调用dll的方法 | 学步园

    Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性. Java调用C/C   写好的DLL库时,由于基本数据类型不同.使用字节 ...

  3. vs调试程序缺少 msvcp140d.dll 解决方法

    vs调试程序缺少 msvcp140d.dll 解决方法 参考文章: (1)vs调试程序缺少 msvcp140d.dll 解决方法 (2)https://www.cnblogs.com/MCSFX/p/ ...

  4. Javascript异步编程的4种方法

    你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排 ...

  5. VS项目中引入dll的方法

    引入dll的方法: 方法1:配置属性->调试->环境:输入path=包含dll文件的文件夹路径 方法2: 1)将dll文件拷贝到生成的.exe所在的文件夹中 2)项目右键,添加引用,选择d ...

  6. 2020-11-23(dll注入方法)

    一般情况下有如下dll注入方法: 1.修改注册表来注入dll: 2.使用CreateRemoteThread函数对运行中的进程注入dll: 3.使用SetWindowsHookEx函数对应用程序挂钩( ...

  7. 《多核与GPU编程:工具、方法及实践》----1.5 并行程序性能的预测与测量

    本节书摘来自华章出版社<多核与GPU编程:工具.方法及实践>一书中的第1章,第1.5节, 作 者 Multicore and GPU Programming: An Integrated ...

  8. win7 安装c语言环境变量,win7下如何配置编程环境变量的方法

    win7下如何配置编程环境变量的方法 由于Win7和Win XP的不同,环境变量的配置也变得有所不同.具体操作: 一.桌面右击[计算机],选择[属性],在弹出的窗体左侧点击[高级系统设置],此时将弹出 ...

  9. 11个提升编程能力的小方法

    编程是当今社会最为实用的技能之一.从能够创造一个公司网站到知道怎么修复一个重定向错误,这些技能带来的价值,不管是对雇主还是对程序员自身,都是无法估量的. 但是,保持你当前的状态,停滞不前,那你永远无法 ...

最新文章

  1. python可视化:matplotlib学习笔记
  2. 【其他】配置JIRA
  3. UA MATH524 复变函数5 代数运算、可微性与积分基础例题
  4. 程序清单8-9 回送所有命令行参数和所有环境字符串
  5. 开发经验分享_05_葫芦画瓢
  6. (王道408考研数据结构)第二章线性表-第一节:线性表的定义和基本操作
  7. 如何通过图片识别用的什么字体?
  8. New-Python-数据类型、字符编码、文件处理
  9. 决策树缺失值python_【机器学习笔记之二】决策树的python实现
  10. Log Explorer 使用简介转
  11. 《数字摄影与摄像》学习笔记——摄影课理论基础
  12. php 队列 api,GitHub - shirakun/think-queue: ThinkPHP 队列支持
  13. 17 类的成员 私有
  14. Python爬取Facebook公共主页帖子
  15. 我的读书笔记 -《鬼谷子》
  16. annotate 函数的用法
  17. 多个div占满整个屏幕(或页面)(待补充及理解)
  18. 【http】微信网站使用的是http80端口或者https443端口访问
  19. 高德坐标系转天地图坐标系(GCJ02转WGS坐标系)
  20. 算符优先分析java程序_算符优先分析

热门文章

  1. 雷卯推荐TVS低漏流100uA,低电压3.3v,功率400W
  2. 联想R9000x网卡显卡驱动
  3. Java课设对对碰_第11章对对碰游戏(图形版)(Java游戏编程原理与实践教程课件).ppt...
  4. DCMTK+VS2012编译简明教程
  5. 2021年全国职业技能大赛:网络系统管理项目
  6. 以“微”知著,用友ISV生态的力量与担当
  7. thinkphp发送邮箱(以thinkphp5作为示例)。
  8. 黑莓省电模式 for BlackBerry 9900 9930 9850 OS7 1
  9. 关于74HC4051的逻辑真值表及延时的重要性/在AD测量中的校准
  10. JavaWeb源码项目蔬菜网上商城+后台管理系统