找色 第二个问题~~~~~~~~~~~~~~~~~~~~~~~
easyx吧
全部回复
仅看楼主
level 8
Sail丶Man 楼主
这次仅仅去掉了saveimage(_T("f:\\testq1.bmp"), &img);loadimage(&img, "f:\\testq1.bmp");程序就识别不了这个img 就找不到色 ,就是 按Y 后 没反应了。
——————————————————————————
# include <graphics.h>
# include <stdio.h>
int start(void);
void Quit(void);
void CaptureDesktop(IMAGE *pimg)
{int w = GetSystemMetrics(SM_CXSCREEN) ;
int h = GetSystemMetrics(SM_CYSCREEN) ;
Resize(pimg, w, h);HDC aa = GetDC(NULL);
HDC dstDC = GetImageHDC(pimg);
BitBlt(dstDC, 0, 0, w, h, aa, 0, 0, SRCCOPY);}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{COLORREF cr;cr = start();
initgraph(200,60);
TCHAR s2[20];
sprintf(s2, _T("%#x"), cr);
TCHAR s1[30]="已确定你要找的颜色值为:";
outtextxy(0, 0, s1);
outtextxy(0, 20, s2);
TCHAR s[30]="按Y键开始找色,按B键退出";
outtextxy(0, 40, s);
int w = GetSystemMetrics(SM_CXSCREEN) ;
int h = GetSystemMetrics(SM_CYSCREEN) ;
while (true){if (GetAsyncKeyState('Y'))
{closegraph();break;}Quit();}
while (true)
{IMAGE img;
CaptureDesktop(&img);
/*initgraph(640, 480);putimage(0, 0, &img);*/
DWORD* p = GetImageBuffer(&img);
POINT point;for(int i = 0; i < w * h; i++)
if (p[i] == BGR(cr) ){point.y = i / (w * 1.0);
point.x = i - point.y * w ;Sleep(100);
SetCursorPos(point.x, point.y);break;}
DeleteFile("f:\\testq1.bmp");Quit();}return 0;}
int start(void){initgraph(150,80);
HDC hdc = GetDC(NULL);COLORREF cr;
POINT point;TCHAR s[20];TCHAR s1[20]="横坐标:";TCHAR s2[20]="纵坐标:";
TCHAR s3[20]="颜色值:";
TCHAR s4[30]="按A键确定,按B键退出";
while(true){GetCursorPos(&point);
sprintf(s, _T("%05d"), point.x);
outtextxy(0, 0, s1);outtextxy(55, 0, s);
sprintf(s, _T("%05d"), point.y);outtextxy(0, 20, s2);
outtextxy(55, 20, s);Sleep(10);
cr = GetPixel(hdc, point.x, point.y);
sprintf(s, _T("%#x"), cr);outtextxy(0, 40, s3);
outtextxy(55, 40, s);outtextxy(0, 60, s4);
if (GetAsyncKeyState('A')){closegraph();ReleaseDC(NULL,hdc);return cr;}Quit();}}
void Quit(void){if(GetAsyncKeyState('B'))
{if(MessageBox(NULL, "你确定要退出吗?","提示", MB_YESNO) == IDYES)
exit(0);}return ;}
2013年09月27日 00点09分 1
level 12
参见第一个问题,先把无关代码删掉,仅保留一个可以编译并能体现问题的最简代码。
2013年09月27日 16点09分 2
level 12
是不是说,在 CaptureDesktop(&img); 语句之后,直接调用 initgraph(640, 480);putimage(0, 0, &img); 会看不到任何输出呢?如果是这样,那么后面的语句都不需要写出来吧。
2013年09月29日 02点09分 3
level 12
我想我找到问题了。以下是我精简后的代码:
#include <graphics.h>
#include <stdio.h>
void CaptureDesktop(IMAGE *pimg)
{
int w = GetSystemMetrics(SM_CXSCREEN) ;
int h = GetSystemMetrics(SM_CYSCREEN) ;
Resize(pimg, w, h);HDC aa = GetDC(NULL);
HDC dstDC = GetImageHDC(pimg);
BitBlt(dstDC, 0, 0, w, h, aa, 0, 0, SRCCOPY);
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
initgraph(200,60);
closegraph();
IMAGE img;
CaptureDesktop(&img);
initgraph(640, 480);
putimage(0, 0, &img);
Sleep(3000); closegraph(); return 0;
}
2013年09月29日 03点09分 4
level 12
4楼代码应该和你的问题一样。我详细排查一下,稍后告诉你结果。
2013年09月29日 03点09分 5
level 12
通过 4 楼的代码,我初步估计是个 bug。不出所料,果真如此。我已经将修改后的版本重新发布了,20130929(beta),直接官网下载就好。
这个 bug 让你困扰了好几天,十分抱歉。
2013年09月29日 03点09分 6
没事,能为easyx做点贡献 感觉很好啊~
2013年09月29日 05点09分
回复 Sail丶Man :其实我当时得出的结论是IMAGE img;必须放在while里面才行,只是不知道怎么说就 一直没有说呵呵~~~~~~~~~~~·
2013年09月29日 05点09分
回复 Sail丶Man :不过你好像有点弄错了,你修复的那个bug 一次性解决了两个问题就是: 第一个问题和第三个问题。第二个问题依然存在哦~
2013年09月29日 05点09分
level 8
Sail丶Man 楼主
我估计这还有个bug:
CaptureDesktop(&img);
完了后。
DWORD* p = GetImageBuffer(&img);//这句中的img也没有成功。
我是在你修改bug后试的 还是不行。必须要saveimage和loadimage
但截图是成功了的。
2013年09月29日 06点09分 7
level 12
如果还存在问题,你可不可以写一个测试代码?
我测试,直接 putimage 是可以显示出内容的,那么找色部分的代码就无所谓了吧?
2013年09月29日 06点09分 8
ok~~以下是测试码。
2013年09月29日 06点09分
level 12
关于 GetImageBuffer 的验证代码:
#include <graphics.h>
#include <stdio.h>
void CaptureDesktop(IMAGE *pimg)
{
int w = GetSystemMetrics(SM_CXSCREEN) ;
int h = GetSystemMetrics(SM_CYSCREEN) ;
Resize(pimg, w, h);
HDC aa = GetDC(NULL);
HDC dstDC = GetImageHDC(pimg);
BitBlt(dstDC, 0, 0, w, h, aa, 0, 0, SRCCOPY);
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
initgraph(200,60);
closegraph();
IMAGE img;
CaptureDesktop(&img);
int w = img.getwidth();
// 在显存中画黑色矩形
DWORD* p = GetImageBuffer(&img);
for(int x = 0; x < 10; x++)
for(int y = 0; y < 10; y++)
p[x + y * w] = 0;
initgraph(640, 480);
putimage(0, 0, &img);
Sleep(3000);
closegraph();
return 0;
}
2013年09月29日 06点09分 9
这个代码是在 4 楼代码的基础上,增加了显存操作,没有任何问题。
2013年09月29日 06点09分
level 8
Sail丶Man 楼主
再有saveimage和loadimage你可以在f盘找到两个图片
注释掉saveimage和loadimagef盘就没有图片。
# include <graphics.h>
# include <stdio.h>
void CaptureDesktop(IMAGE *pimg)
{int w = GetSystemMetrics(SM_CXSCREEN) ;
int h = GetSystemMetrics(SM_CYSCREEN) ;
Resize(pimg, w, h);HDC aa = GetDC(NULL);
HDC dstDC = GetImageHDC(pimg);
BitBlt(dstDC, 0, 0, w, h, aa, 0, 0, SRCCOPY);}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{int w = GetSystemMetrics(SM_CXSCREEN) ;
int h = GetSystemMetrics(SM_CYSCREEN) ;
HDC hdc = GetDC(NULL);
SetPixel(hdc, 2, 2, RED);
Sleep(1000);
IMAGE img;CaptureDesktop(&img);
saveimage(_T("f:\\testq1.bmp"), &img);
loadimage(&img, "f:\\testq1.bmp");
DWORD* p = GetImageBuffer(&img);
for(int i = 0; i < w * h; i++)if (p[i] == BGR(RED) )
{saveimage(_T("f:\\testq2222.bmp"), &img);}
return 0;}
2013年09月29日 06点09分 10
程序就是:在先在桌面左上角 打上一个红点再让它来找 找着了就再发盘保存一个testq2222图片
2013年09月29日 06点09分
level 12
你在 10 楼的代码,我是这样测试的,和你的功能应该类似,但是代码简单一些。我测试没有什么问题的,可以正确输出 2,2 坐标的值:
#include <graphics.h>
#include <stdio.h>
void CaptureDesktop(IMAGE *pimg)
{
int w = GetSystemMetrics(SM_CXSCREEN) ;
int h = GetSystemMetrics(SM_CYSCREEN) ;
Resize(pimg, w, h);
HDC aa = GetDC(NULL);
HDC dstDC = GetImageHDC(pimg);
BitBlt(dstDC, 0, 0, w, h, aa, 0, 0, SRCCOPY);
}
int main()
{
int w = GetSystemMetrics(SM_CXSCREEN) ;
int h = GetSystemMetrics(SM_CYSCREEN) ;
HDC hdc = GetDC(NULL);
SetPixel(hdc, 2, 2, RED);
IMAGE img;
// 抓图
CaptureDesktop(&img); // 获取显存指针
DWORD* p = GetImageBuffer(&img);
// 获取坐标 (2, 2) 的值
printf("%x\n", p[2 + 2 * img.getwidth()]);
return 0;
}
2013年09月29日 07点09分 11
我测试你9楼的 代码也没有问题 , 但就是10楼 那代码就是有问题, 你别改 就那样测试 就会出问题。
2013年09月29日 07点09分
回复 Sail丶Man :你11楼的 代码 我又没问题, 我10楼那代码也不复杂 也许不是 GetImageBuffer(&img);问题 你再仔细看看~
2013年09月29日 07点09分
level 8
Sail丶Man 楼主
或者 你改成这个也可以看出来 找到没有。
DWORD* p = GetImageBuffer(&img);
for(int i = 0; i < w * h; i++)if (p[i] == BGR(RED) )
{
initgraph(200, 200);
Sleep(550);
}return 0;
}
2013年09月29日 07点09分 12
level 8
Sail丶Man 楼主
或者 就用 你那个 但是这样就不行了
# include <graphics.h>
# include <stdio.h>
void CaptureDesktop(IMAGE *pimg)
{
int w = GetSystemMetrics(SM_CXSCREEN) ;
int h = GetSystemMetrics(SM_CYSCREEN) ;
Resize(pimg, w, h);HDC aa = GetDC(NULL);
HDC dstDC = GetImageHDC(pimg);
BitBlt(dstDC, 0, 0, w, h, aa, 0, 0, SRCCOPY);
}
int main()
{int w = GetSystemMetrics(SM_CXSCREEN) ;
int h = GetSystemMetrics(SM_CYSCREEN) ;
HDC hdc = GetDC(NULL);
SetPixel(hdc, 2, 2, RED);
Sleep(1000);
IMAGE img;CaptureDesktop(&img);
//saveimage(_T("f:\\testq1.bmp"), &img);
//loadimage(&img, "f:\\testq1.bmp");
DWORD* p = GetImageBuffer(&img);
for(int i = 0; i < w * h; i++)
if (p[i] == BGR(RED) )
{
printf("%x\n", p[2 + 2 * img.getwidth()]);
}return 0;
}
2013年09月29日 07点09分 13
那问题 就是出在 for 上
2013年09月29日 07点09分
level 12
我再发一个更仔细一些的,在你 13 楼的代码基础上,增加一条:
DWORD* p = GetImageBuffer(&img);
printf("%x, %x\n", p[2 + 2 * img.getwidth()], BGR(RED)); // 增加这行
这回看到问题了吗?
2013年09月29日 08点09分 14
level 12
所以判断语句,你应该这么写:
if ((p[i] & 0xffffff) == BGR(RED) )
2013年09月29日 08点09分 15
回复 Sail丶Man :好神奇 为什么这样就可以了?
2013年09月29日 09点09分
回复 Sail丶Man :。。。。我在easyx也经常看到这种: if (GetAsyncKeyState(VK_LEFT) & 0x8000) 但我一般都自己去掉了0x8000还是感觉没问题。
2013年09月29日 09点09分
回复 Sail丶Man :p[i] & 0xffffff 不管什么和1相与都不变嘛 感觉不是多吃一举么。但这一步的用处怎么还真这么大啊!
2013年09月29日 10点09分
回复 Sail丶Man : 注意,这是3个字节,写完整应该是 0x00ffffff,这下明白了吧,目的是屏蔽掉最高位的一个字节。
2013年09月30日 04点09分
1