求代码,用c/c++进行bmp图像的处理,处理内容包括旋转,灰度图,二值图等等。
这么巧?发现各种找到的库都非常巨大,抽象层次也很高,不能满足需求自己刚写了一个C++读写bmp的类,支持8位灰度图,24位RGB图。
https://github.com/edimetia3d/simpleBMP
代码很短,其实看源码10分钟就了解干了些什么。
简要说明一下:没有任何抽象,读取就是把bmp里的所有数据(是的,每个字节都用上了)都映射到某个定义过的变量。保存就是把这些变量再写回磁盘。
其实最初是打算完全按照C来写的,对动态内存不太感冒,所以用了vector读写部分用的还是fread fwrite,把vector的部分换成动态内存就完全可以在C下运行了。每个变量的意思见http://www.cnblogs.com/xiekeli/archive/2012/05/09/2491191.html具体映射关系如下。
typedef struct { unsigned short bfType; unsigned long bfSize; unsigned short bfReserved1; unsigned short bfReserved2; unsigned long bfOffBits; } ClBitMapFileHeader; typedef struct { unsigned long biSize; long biWidth; long biHeight; unsigned short biPlanes; unsigned short biBitCount; unsigned long biCompression; unsigned long biSizeImage; long biXPelsPerMeter; long biYPelsPerMeter; unsigned long biClrUsed; unsigned long biClrImportant; } ClBitMapInfoHeader; typedef struct { unsigned char rgbBlue; unsigned char rgbGreen; unsigned char rgbRed; unsigned char rgbReserved; } ClrgbMap; class ClImgBMP { public: ClBitMapFileHeader bmpFileHeaderData; ClBitMapInfoHeader bmpInfoHeaderData; ClrgbMap colorMap[256]; vector<unsigned char> imgData; bool LoadImage(const char* path); bool SaveImage(const char* path); };
1、使用CoCreateInstance创建IWICImagingFactory2、使用IWICImagingFactory::CreateDecoderFromFilename创建一个IWICBitmapDecoder3、使用IWICBitmapDecoder::GetFrame获得一个IWICBitmapFrameDecoder4、使用IWICImagingFactory::CreateFormatConverter创建一个IWICFormatConverter,并使用你喜爱的格式初始化他,使用第三步创建好的对象调用IWICFormatConverter::Initialize函数5、如果第四步成功了,那么就把IWICFormatConverter转成IWICBitmapSource,否则就把IWICBitmapFrameDecoder转成IWICBitmapSource6、使用IWICImagingFactory::CreateBitmapFromSource从IWICBitmapSource获取IWICBitmap
鉴于d2d资料较多,请自行查找。首先就是创建一个空的位图,然后使用这个位图创建ID2D1RenderTarget,然后使用ID2D1RenderTarget::CreateBitmapFromWicBitmap,从刚才获取的IWICBitmap创建出一个ID2D1Bitmap。这样你就拥有了两个bitmap,第一个是从文件里面读进来的,第二个是你创建的一个空白bitmap。最后使用render target的各种effect、shader和函数,就使用你喜欢的任何效果,譬如旋转、灰度、二值等,把读进来的bitmap画到空白的bitmap上去。最后把bitmap一保存,就搞定了。
最困难的部分就是读写文件,效果什么的都是现成的。Direct2D比GDI+还要好用,性能还高,而且绝不兼容Windows XP。
OpenCV吧
我自己一般用这个库https://github.com/nothings/stb
imagick http://www.imagemagick.org
BMP这种格式实在是过于简单了,说句实话,手解都没什么大错。
根据你具体需求的多寡,以及你硬件条件的好坏(极端假设:例如ARM Cortex M0的低档32位单片机),以下任一都是不错的选择:
opencv,本身就是c++库
imagemagick的magick++库 http://www.imagemagick.org/script/magick++.php
各种简单、专门的bmp库,这个选择就很多了,但是通常这些库只能读bmp就是了。 例如我曾经用过EasyBMP http://easybmp.sourceforge.net/
手解解得好也行
实际上最为推荐opencv,这个可以最大限度的获得输入其他文件格式,以及后续各种图形算法的便利。
有两种方式,1 用第三方库,除了上面提到的之外,还可以选skia
2 网上搜一段读bmp到二维数组的代码以及写二维数组到bmp的代码,你需要功能比较简单,完全可以自己实现。旋转靠的是矩阵转换和插值,灰度图和二值图直接根据定义计算就可以了。
STBhttps://github.com/nothings/stbFreeImageNvImage还有个我自己撸的库ImagePPhttps://github.com/lalalaring/ImagePP
opencv gdal
BMP的数据,没有任何压缩,都是放在文件头之后的地方,手解没难度。其主要是文件头+数据。而且文件头也没有什么难度,很清晰,具体地BMP头,楼主可以去搜索一下。
建议楼主如果时间上来得及,可以手解,这样可以更加了解BMP文件的格式。
这么巧?
发现各种找到的库都非常巨大,抽象层次也很高,不能满足需求
自己刚写了一个C++读写bmp的类,支持8位灰度图,24位RGB图。
https://github.com/edimetia3d/simpleBMP
代码很短,其实看源码10分钟就了解干了些什么。
简要说明一下:
没有任何抽象,读取就是把bmp里的所有数据(是的,每个字节都用上了)都映射到某个定义过的变量。
保存就是把这些变量再写回磁盘。
其实最初是打算完全按照C来写的,对动态内存不太感冒,所以用了vector
读写部分用的还是fread fwrite,把vector的部分换成动态内存就完全可以在C下运行了。
每个变量的意思见
http://www.cnblogs.com/xiekeli/archive/2012/05/09/2491191.html
具体映射关系如下。
使用Windows Imaging Component读取图片(兼容bmp、jpg、png等常见格式)
1、使用CoCreateInstance创建IWICImagingFactory
2、使用IWICImagingFactory::CreateDecoderFromFilename创建一个IWICBitmapDecoder
3、使用IWICBitmapDecoder::GetFrame获得一个IWICBitmapFrameDecoder
4、使用IWICImagingFactory::CreateFormatConverter创建一个IWICFormatConverter,并使用你喜爱的格式初始化他,使用第三步创建好的对象调用IWICFormatConverter::Initialize函数
5、如果第四步成功了,那么就把IWICFormatConverter转成IWICBitmapSource,否则就把IWICBitmapFrameDecoder转成IWICBitmapSource
6、使用IWICImagingFactory::CreateBitmapFromSource从IWICBitmapSource获取IWICBitmap
使用Direct2D获取图形
鉴于d2d资料较多,请自行查找。首先就是创建一个空的位图,然后使用这个位图创建ID2D1RenderTarget,然后使用ID2D1RenderTarget::CreateBitmapFromWicBitmap,从刚才获取的IWICBitmap创建出一个ID2D1Bitmap。这样你就拥有了两个bitmap,第一个是从文件里面读进来的,第二个是你创建的一个空白bitmap。最后使用render target的各种effect、shader和函数,就使用你喜欢的任何效果,譬如旋转、灰度、二值等,把读进来的bitmap画到空白的bitmap上去。最后把bitmap一保存,就搞定了。
总结
最困难的部分就是读写文件,效果什么的都是现成的。Direct2D比GDI+还要好用,性能还高,而且绝不兼容Windows XP。
OpenCV吧
我自己一般用这个库
https://github.com/nothings/stb
imagick http://www.imagemagick.org
BMP这种格式实在是过于简单了,说句实话,手解都没什么大错。
根据你具体需求的多寡,以及你硬件条件的好坏(极端假设:例如ARM Cortex M0的低档32位单片机),以下任一都是不错的选择:
opencv,本身就是c++库
imagemagick的magick++库 http://www.imagemagick.org/script/magick++.php
各种简单、专门的bmp库,这个选择就很多了,但是通常这些库只能读bmp就是了。
例如我曾经用过EasyBMP http://easybmp.sourceforge.net/
手解解得好也行
实际上最为推荐opencv,这个可以最大限度的获得输入其他文件格式,以及后续各种图形算法的便利。
有两种方式,
1 用第三方库,除了上面提到的之外,还可以选skia
2 网上搜一段读bmp到二维数组的代码以及写二维数组到bmp的代码,你需要功能比较简单,完全可以自己实现。旋转靠的是矩阵转换和插值,灰度图和二值图直接根据定义计算就可以了。
STB
https://github.com/nothings/stb
FreeImage
NvImage
还有个我自己撸的库
ImagePP
https://github.com/lalalaring/ImagePP
opencv gdal
BMP的数据,没有任何压缩,都是放在文件头之后的地方,手解没难度。其主要是文件头+数据。而且文件头也没有什么难度,很清晰,具体地BMP头,楼主可以去搜索一下。
建议楼主如果时间上来得及,可以手解,这样可以更加了解BMP文件的格式。