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;

您还可以在结构定义中重载&lt; 运算符,而不是编写独立的比较函数。

然后调用 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文件结构的读取的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Batch 中对字段进行处理时读取新文件

4.VC按钮显示图片

在 C++ 中读取 .bmp 文件

BMP文件结构(转)

用c#编写一个程序读取一张bmp图片的数据并转化为灰度图保存到文件中

VC6.0把读取的图像另存为bmp图片在电脑D盘,怎么弄?