有一幅32位的bmp真彩图像,像素为352*288,如何获取图像中的每一个像素值,包括R值,G值和B值。MFC,急求

有一幅32位的bmp真彩图像,像素为352*288,如何获取图像中的每一个像素值,包括R值,G值和B值。MFC,急求,第1张

噗,352x288,这不是pal制式的vcd的分辨率吗

其实本来看到“急啊”什么的实在很烦躁,

不过看你也急了一天没人回了……

HBITMAP hBmp;

HDC hDC;

BITMAPINFO biBmp;

int nBmpWidth, nBmpHeight;

int i, j;

hBmp = (HBITMAP) LoadImage(NULL, TEXT("c:\\11bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);

hDC = GetDC(NULL);

hDC = CreateCompatibleDC(hDC);

ZeroMemory(&biBmp, sizeof(biBmp));

biBmpbmiHeaderbiSize = sizeof(biBmpbmiHeader);

GetDIBits(hDC, hBmp, 0, 0, NULL, &biBmp, DIB_RGB_COLORS);

nBmpWidth = biBmpbmiHeaderbiWidth;

nBmpHeight = biBmpbmiHeaderbiHeight;

SelectObject(hDC, (HGDIOBJ) hBmp);

for (j = 0; j < nBmpHeight; ++j) {

    for (i = 0; i < nBmpWidth; ++i) {

        COLORREF c;

        c = GetPixel(hDC, i, j);

        //于是你拿到这个像素的颜色存入c了。然后爱干嘛干嘛……

    }

}    

DeleteObject((HGDIOBJ) hBmp);

DeleteDC(hDC);

另:32位不确定gdi能不能搞得定,24位没问题就是了。32位如果gdi搞不定的话,你用gdi+吧。没有直接写gdi+的代码是因为现在好多人还在用vc6然后又不会装、配gdi+的库,万一遇到了实在很自找麻烦……

你的思路不对

第一  直接把WriteLog里的值赋值给m_Log 然后刷新edit值就可以看见

第二  直接写个WriteLog函数 把内容赋值给m_Log 刷新edit值也可以

在初始化函数里你什么都没有  也不明白你说的关联是什么意思

把一个函数跟一个变量关联? 怎么个关联法?

m_RichEditSetEventMask(ENM_CHANGE | m_RichEditGetEventMask());

加到OnInitDialog最后,return之前

载入位图可以用LoadBitmap()有两种重载形式

BOOL LoadBitmap( LPCTSTR lpszRecourceName );

BOOL LoadBitmap( UINT nIDResource );

参数: lpszResourceName 指向一个包含了位图资源名字的字符串(该字符串以null结尾)。

nIDResource 指定位图资源中资源的ID号。

获取位图可以用GetBitmapBits()

DWORD GetBitmapBits( DWORD dwCount, LPVOID lpBits ) const;

CBitmap::GetBitmap

int GetBimap( BITMAP pBitMap );

返回值:调用成功时返回非零值,否则为0。

参数: pBitMap 指向BITMAP结构的一个指针,不能为NULL。

说明:

本函数用于查看CBitmap对象的信息。返回的信息存放在pBitMap指向的BITMAP结构中。

BITMAP结构如下:

BITMAP结构具有如下形式:

typedef struct tagBITMAP

{ / bm /

int bmType;

int bmWidth;

int bmHeight;

int bmWidthBytes;

BYTE bmPlanes;

BYTE bmBitsPixel;

LPVOID bmBits;

} BITMAP;

BITMAP结构定义了逻辑位图的高,宽,颜色格式和位值。

成员: bmType 指定了位图的类型。对于逻辑位图,这个成员必须为0。

bmWidth 指定了位图的宽度,以像素为单位。宽度必须大于0。

bmHeight 指定了位图的高度,以扫描行为单位。高度必须大于0。

bmWidthBytes 指定了每个扫描行中字节的数目。这个值必须是个偶数,因为图形设备接口(GDI)假定位图中的位值构成一个整数(2字节)数组。换句话说,bmWidthBytes8必须是16的倍数,大于或等于bmWidth与bmBitsPixel相乘所得的值。

bmPlanes 指定了位图中颜色平面的数目。

bmBitsPixel 指定了每个位平面中用于定义一个像素所需的颜色位数。

bmBits 指向位图中位值的位置。bmBits成员必须是一个指向单字节数组的长指针。

注释:

现在使用的位图格式有单色的和彩色的。单色的位图使用每个位平面一位的格式。每个扫描线是16的倍数。

对于一个高度为n的单色位图,扫描线是按照如下方式组织的:

Scan 0

Scan 1

Scan n-2

Scan n-1

单色设备上的像素不是黑就是白。如果位图中对应的位是1,则像素就被打开(白)。如果对应的位是0,则像素被关闭(黑)。

所有具有RC_BITBLT位的设备都支持位图,该位是在CDC::GetDeviceCaps成员函数的RASTERCAPS索引中设置的。

每个设备都有它自己的颜色格式。为了在不同的设备间传递位图,使用Windows的GetDIBits和SetDIBits函数。

给你举个例子:

CBitmap m_bmp;

BITMAP pBitMap;

m_bmpLoadBitmap("d:\\\\示例\\flowerbmp");//加载位图

m_bmpGetBitmap(pBitMap);//获取位图信息

int i,j;

DWORD color=pBitMap->bmBits[ipBitMap->bmHeight+pBitMap->bmWidth];//访问第i行第j列像素点的颜色值

Graphics graphics(m_hWnd);

Image img(L"xxxxjpg");

graphicsTranslateTransform(600,10);//平移

graphicsRotateTransform(25);//旋转

graphicsDrawImages(&img,0,0,a,b);//a,b放大的大小

另外,站长团上有产品团购,便宜有保证

以上就是关于有一幅32位的bmp真彩图像,像素为352*288,如何获取图像中的每一个像素值,包括R值,G值和B值。MFC,急求全部的内容,包括:有一幅32位的bmp真彩图像,像素为352*288,如何获取图像中的每一个像素值,包括R值,G值和B值。MFC,急求、如何用VC++2010编写一个获取屏幕分辨率的MFC 以下是我的编写过程,实在进行不下去了,求指导!、MFC实时获取编辑框里的字符数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9774341.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存