VC++图像处理中对BItmap文件结构的读取
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++图像处理中对BItmap文件结构的读取相关的知识,希望对你有一定的参考价值。
如题,我想对一张BMP位图进行处理,算法我大致知道,但不知道相关函数。我知道Bitmap包括BitmapFileHeader,BitmapInfoHeader,调色板,像素索引值表这四个部分,我有两个方面的问题:1、怎样得到这四部份的具体数据,如(22,32)这个点的RGB值。我先建立CBitmap 对象bmp,再bmp.LoadBitmap(我的图片)。然后怎么搞呢?CBitmap没有封装相关函数啊?MFC中BITMAP结构体也没有后面3部分啊????2、怎样从内存创建一张位图文件并显示???不需要保存到磁盘。就是说,我自己凭想象创建BitmapFileHeader,BitmapInfoHeader这两个结构体,调色板用二维数组,像素索引值表用一维数组,用具体数据填充这四部份。怎样用这四部份组建一个Bitmap文件,并获取他的句柄HBitmap?????
如果位图已经通过LoadBitmap加载到内存,则内存中的图像与显示设备紧密相关,比如原图是彩色图片,显示器是黑白色,通过bmp.LoadBitmap(我的图片)后,内存中的图像数据是黑白色的数据,而且还与显示器位数有关。如果需要在原位图数据上进行图像处理,就不要bmp.LoadBitmap来加载位图,而是打开文件获取位图数据。如果仅仅是在当前显示设备下进行效果处理,则可以使用bmp.LoadBitmap加载位图,通过CBitmap的GetBitmapBit函数可以获取位图数据,如果是24位显示器,则每3个字节表示一个像素,其中第一个字节是B,第二个字节是G,第3个字节是R;如果是32位的显示器,每4个字节表示一个像素,一般前3个字节与24位显示器一样,第4个字节一般没有什么意义。
Microsoft Visual C++,(简称Visual C++、MSVC、VC++或VC)是Microsoft公司推出的开发Win32环境程序,面向对象的可视化集成编程系统。它不但具有程序框架自动生成、灵活方便的类管理、代码编写和界面设计集成交互操作、可开发多种程序等优点,而且通过简单的设置就可使其生成的程序框架支持数据库接口、OLE2,WinSock网络、3D控制界面。
它以拥有“语法高亮”,IntelliSense(自动完成功能)以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及建置系统以预编译头文件、最小重建功能及累加连结著称。这些特征明显缩短程式编辑、编译及连结花费的时间,在大型软件计划上尤其显著。
参考技术A 你这些问题,我最近也是再做,不过我是读取tif,tiff。。。等等,也可以读取BMP图像文件,你在百度搜一下opencv ,下载一个opencv软件,加载到VS2008,就可以用了,里面很多函数已经封装好了。 参考技术B 1.如果位图已经通过LoadBitmap加载到内存,则内存中的图像与显示设备紧密相关,比如原图是彩色图片,显示器是黑白色,通过bmp.LoadBitmap(我的图片)后,内存中的图像数据是黑白色的数据,而且还与显示器位数有关。如果需要在原位图数据上进行图像处理,就不要bmp.LoadBitmap来加载位图,而是打开文件获取位图数据。如果仅仅是在当前显示设备下进行效果处理,则可以使用bmp.LoadBitmap加载位图,通过CBitmap的GetBitmapBit函数可以获取位图数据,如果是24位显示器,则每3个字节表示一个像素,其中第一个字节是B,第二个字节是G,第3个字节是R;如果是32位的显示器,每4个字节表示一个像素,一般前3个字节与24位显示器一样,第4个字节一般没有什么意义。2.关于第二个问题,在网上有很多资料,可以搜一下。 参考技术C http://zhidao.baidu.com/question/215255895.html 参考技术D 推荐你看CXIMAGE,做开发并不一定要自己把所有东东都做好,公用的东东好用、安全、功能强大
如何在 VC 6.0 中对结构数组进行排序
【中文标题】如何在 VC 6.0 中对结构数组进行排序【英文标题】:how to sort a structure array in VC 6.0 【发布时间】:2013-04-17 16:31:06 【问题描述】:问题来了。我已经定义了一个结构:
typedef struct
long t;
long M;
long double coeff;
Info;
我只能知道下面程序中结构的数量,因此我写道:
信息 p = (Info) malloc (sizeof(Info) * sum ); (其中 sum 是一个长整数)
现在我想根据 'coeff' 升序对结构数组进行排序。
如何在 VC++6.0 中实现它?
非常感谢!
【问题讨论】:
VC++6 是旧的,但我认为它仍然有std::sort
。
这看起来更像 C 而不是 C++。
【参考方案1】:
你可以实现一个比较函数,然后调用 std::sort。
bool comparator(const Info& p1, const Info& p2)
return p1.coeff < p2.coeff;
您还可以在结构定义中重载<
运算符,而不是编写独立的比较函数。
然后调用 std::sort
std::sort(A, A+sum, comparator);
假设A
是你的结构体数组。
【讨论】:
【参考方案2】:将std::sort 与合适的比较函子一起使用:
bool cmp(const Info& lhs, const Info& rhs)
return lhs.coeff < rhs.coeff;
然后
#include <algorithm>
std::sort(p, p + sum, cmp);
假设p
是指向包含sum
Info
对象的数组的第一个元素的指针。
但在 C++ 中,您通常更喜欢 std::vector
而不是动态分配的数组:
std::vector<Info> v(sum); // contains sum default constructed Infos
然后
std::sort(v.begin(), v.end(), cmp);
您也不需要typedef
语法:
struct Info
long t;
long M;
long double coeff;
;
【讨论】:
非常感谢!我还是 C++ 新手,感谢您向我介绍向量。以上是关于VC++图像处理中对BItmap文件结构的读取的主要内容,如果未能解决你的问题,请参考以下文章