本来看到nim语言有个图像处理的wrapper的, 就是lib页面的 freeimage, 地址 https://github.com/barcharcraz/nim-FreeImage
实用nimble install freeimage 之后, 再下载上面的源码里的test和图片, 编译通过, 运行报错!
could not import: FreeImage_Initialise
真是百思不得其解, 后来我摸索不出来结果. 也就暂时搁置了. 知道看到nim的官方论坛上有人提起这个事情, http://forum.nim-lang.org/t/1721
才知道不是我一个人遇到这个问题.
问题的根源在于, windows的dll, 32位和64为的dll内部函数名字命名规则不一样, 32为的函数, 默认在函数的名字前加了一个下划线, 而64位的不加下划线. 这个wrapper作者用的是64位的, 因此没有问题, 但是32位的就有问题了.
因此解决的方法很简单, 把FreeImage_Initialise 替换为 _FreeImage_Initialise@4 即可.
问题来了, @符号是什么意思, 这个不管, 是win32的dll自动命名加的, 那么4是啥意思, 就是FreeImage_Initialise(参数), 这个函数的参数占用几个字节的意思.
然后, 剩下的问题就是, 逐个替换 freeimage.nim中的函数名字了.
这里, 我已经替换完了, 地址在 https://github.com/encorehu/nim-FreeImage
替换的方法是打开freeimage.dll, 然后搜索 FreeImage_Initialise, 就会发现, 在 FreeImage_Initialise的附近, 有很多的函数, 都是前面带下划线的, 后面带@符号和参数占用字节数的. 我开始手工替换了几十个, 后来发现太累了, 后来写了个脚本来替换.
脚本在这: http://blog.csdn.net/huyoo/article/details/49690457
然后覆盖C:\Documents and Settings\Administrator\.nimble\pkgs\nim-freeimage-0.1 下的freeimage.nim文件
再到BasicTest.nim所在目录, 删掉nimcache这个编译的cache目录, 然后重新编译 nim c BasicTest
再运行 basictest
得到结果了:
D:\DEV>basictest ref 006f0168 --> [biSize = (invalid data!), biWidth = 1280, biHeight = 960, biPlanes = 1, biBitCount = 32, biCompression = (invalid data!), biSizeImage = (invalid data!), biXPelsPerMeter = 2835, biYPelsPerMeter = 2835, biClrUsed = (invalid data!), biClrImportant = (invalid data!)]