GetPixel为什么不能获取到颜色。 GetDIBits 也不行。是我写的有问题吗 各位大哥。帮忙下 谢谢

CasstielGod 2015-02-20 02:41:37
void main()
{

if(!AfxWinInit(::GetModuleHandle(NULL),NULL,::GetCommandLine(),0))
{
cout<<1<<endl;

}

CBitmap bitmap;
// load bitmap
CBitmap Bitmap;
Bitmap.LoadBitmapW(103);
BITMAP bmp;
Bitmap.GetBitmap(&bmp);
cout<<"宽度"<<bmp.bmWidth<<endl;
cout<<"高度"<<bmp.bmHeight<<endl;
cout<<"颜色位数"<<bmp.bmBitsPixel<<endl;
cout<<"bmBits"<<bmp.bmBits<<endl;
cout<<"一行像素所占的字节数"<<bmp.bmWidthBytes<<endl;
cout<<"调色板颜色数"<<bmp.bmPlanes<<endl;
cout<<"类型"<<bmp.bmType<<endl;
CDC memDC;
CBitmap *pOldBitmap;
HDC hDC = ::GetDC(NULL); //用参数NULL表示获取屏幕DC的句柄
CDC *pDC = CDC::FromHandle(hDC);
memDC.CreateCompatibleDC(pDC);
pOldBitmap = memDC.SelectObject(&Bitmap);
int x=23;
int y=5;
COLORREF clr = memDC.GetPixel(x, y);
BYTE R = GetRValue(clr);
BYTE G = GetGValue(clr);
BYTE B = GetBValue(clr);
cout<<R<<endl;
BITMAPINFOHEADER bih = {0};//位图信息头,所有域初始化为0
//Specifies the number of bits required to indicate the color of a pixel.
bih.biBitCount = bmp.bmBitsPixel;
bih.biCompression = BI_RGB;
bih.biHeight = bmp.bmHeight;
bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight ;

bih.biWidth = bmp.bmWidth;
char * p = new char[400];
p[1]=12;
//HBITMAP h_bmp=(HBITMAP)::SelectObject(NULL,(HBITMAP)Bitmap);
HBITMAP h_bmp = (HBITMAP)Bitmap;


GetDIBits(memDC.m_hDC,h_bmp, 0, bmp.bmHeight, p,(LPBITMAPINFO)&bih, DIB_RGB_COLORS);

int i = (bmp.bmHeight - y - 1) * bmp.bmWidthBytes + x * 32;
R = p[i+2];
G = p[i+1];
B = p[i];


}
...全文
109 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "afxwin.h"
void main()
{
 
  
 
	CBitmap    bitmap;
	// load bitmap
	CBitmap Bitmap;
	HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL,_T("task4.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
	Bitmap.Attach(hBitmap);
	BITMAP bmp;
	Bitmap.GetBitmap(&bmp);
	
	CDC memDC;
	CBitmap *pOldBitmap;
	HDC hDC = ::GetDC(NULL); //用参数NULL表示获取屏幕DC的句柄
	CDC *pDC = CDC::FromHandle(hDC);
	memDC.CreateCompatibleDC(pDC);
	pOldBitmap = memDC.SelectObject(&Bitmap);
	int x=0;
	int y=0;
	COLORREF clr = memDC.GetPixel(x, y);
	BYTE R = GetRValue(clr);
	BYTE G = GetGValue(clr);
	BYTE B = GetBValue(clr);
	
	BITMAPINFOHEADER bih = {0};//位图信息头,所有域初始化为0
	//Specifies the number of bits required to indicate the color of a pixel.
	bih.biBitCount = bmp.bmBitsPixel;
	bih.biCompression = BI_RGB; 
	bih.biHeight = bmp.bmHeight;
	bih.biPlanes = 1; 
	bih.biSize = sizeof(BITMAPINFOHEADER);
	bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight ;
 
	bih.biWidth = bmp.bmWidth;
	char * p = new char[400]; 
	p[1]=12;
	//HBITMAP h_bmp=(HBITMAP)::SelectObject(NULL,(HBITMAP)Bitmap);  
	HBITMAP h_bmp = (HBITMAP)Bitmap;
 
 
	GetDIBits(memDC.m_hDC,h_bmp, 0, bmp.bmHeight, p,(LPBITMAPINFO)&bih, DIB_RGB_COLORS);
 
	int i = (bmp.bmHeight - y  - 1) * bmp.bmWidthBytes + x  * 32;
	R = p[i+2];
	G = p[i+1];
	B = p[i];
 
 
}
我这里可以啊 ···
CasstielGod 2015-02-20
  • 打赏
  • 举报
回复
引用 1 楼 zzz3265 的回复:
这个可能有问题 pOldBitmap = memDC.SelectObject(&Bitmap); 调试看看 pOldBitmap 这个返回值是否是NULL, 表示是否成功 SelectObject 需要DC和位图的格式兼容, 否则会失败
返回不是null 不知道为什么就是不行 。。纠结了1周了 。。
Yofoo 2015-02-20
  • 打赏
  • 举报
回复
这个可能有问题 pOldBitmap = memDC.SelectObject(&Bitmap); 调试看看 pOldBitmap 这个返回值是否是NULL, 表示是否成功 SelectObject 需要DC和位图的格式兼容, 否则会失败

16,372

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧