关于对图片像素的读取函数:GetPixel的句柄问题!

meteormeng 2009-03-06 11:59:05
using namespace Gdiplus;
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
int k;
int sum[8];

HDC hdc;
Graphics* myGraphics;
Image image(L"reseau1.bmp");
myGraphics->FromImage(&image);

myGraphics = new Graphics(hdc); //我这样写,在这里报错了,怎样写出好的代码来呢?(文件路劲是c:\image\reseau1.bmp)

COLORREF col = ::GetPixel(hdc,i,j);
if (GetRValue(col) == 225&&GetGValue(col) == 0&&GetBValue(col) == 0)
{
sum[k] = i;
++k;
sum[k] = j;
++k;
}
...全文
454 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
meteormeng 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 diannaomingong 的回复:]
引用 5 楼 meteormeng 的回复:

怎么初始化呢?

例如
HDC hDc = GetDC()
[/Quote]
这个我用过了,但是怎么把句柄跟文件路径联系起来呢,毕竟得处理图片上的坐标点才行的。
wxWidgets没用过,而且还有好多后续代码要写,就用GDI+算了。
diannaomingong 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 meteormeng 的回复:]
怎么初始化呢?
[/Quote]
例如
HDC hDc = GetDC()
diannaomingong 2009-03-06
  • 打赏
  • 举报
回复
可能浏览器问题我总看到消息来看不到内容...

图像处理我嫌VC太多烦事,对比了很多图像处理库最后用的wxWidgets那套的wxImage

对于你这个实现我的等价代码大概是这样的

#include "wx/image.h"

//如果你判断颜色的情况有数种操作,增加对应的if
int int_InColorX(unsigned char r,unsigned char g,unsigned char b)
{
int int_whichspace=0;
if ( r==255 && g==0 && b==0)
{
int_whichspace=1;
}
// if...
return int_whichspace;
}

void XX(wxImage *img)
{
int int_imgWidth = img->GetWidth();
int int_imgHeight = img->GetHeight();
wxImage imgBuff = img->Copy();
unsigned char r=0;
unsigned char g=0;
unsigned char b=0;
for (int x = 0; x < int_imgWidth; x++)
{
for (int y= 0; y < int_imgHeight; y++)
{
r=imgBuff.GetRed(x,y);
g=imgBuff.GetGreen(x,y);
b=imgBuff.GetBlue(x,y);
int int_which=int_InColorX(r,g,b);
if (int_which!=0 )
{
// k++ …… sum[k] …… DIY
}
}
}
}

//打开图片和调用XX
wxBitmap *g_TestBitmap = (wxBitmap *) NULL;

wxString f = wxFileSelector(wxT("选择图片(*.bmp)"), (const wxChar *) NULL,
(const wxChar *) NULL, wxT("bmp"),
wxT("BMP files (*.bmp)|*.bmp"));
g_TestBitmap = new wxBitmap(f, wxBITMAP_TYPE_BMP);
if ( g_TestBitmap && g_TestBitmap->Ok() )
{
wxImage *img = new wxImage(g_TestBitmap->ConvertToImage());
XX(img);
}

一般处理图片的程序都是这个流程,
1.获得图片
2.获得像素rgb
3.自定义操作
meteormeng 2009-03-06
  • 打赏
  • 举报
回复
怎么初始化呢?
meteormeng 2009-03-06
  • 打赏
  • 举报
回复
myGraphics = new Graphics(hdc); //这个下面是个循环(补充!!)
for (int i=0;i<=weight;i++)
{
for (int j=0;j<=height;j++)
{
COLORREF col = ::GetPixel(hdc,i,j);
if (GetRValue(col) == 225&&GetGValue(col) == 0&&GetBValue(col) == 0)
{
sum[k] = i;
++k;
sum[k] = j;
++k;
}
}
}
fairchild811 2009-03-06
  • 打赏
  • 举报
回复
hdc没有初始化
meteormeng 2009-03-06
  • 打赏
  • 举报
回复
warning C4700: uninitialized local variable 'hdc' used
  • 打赏
  • 举报
回复
报的什么错?
meteormeng 2009-03-06
  • 打赏
  • 举报
回复
这样做不是很模糊的搜索结果了,这种方式那也太不靠谱了吧。感觉完全靠几率搜索中了,就才有结果!
diannaomingong 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 meteormeng 的回复:]
引用 14 楼 diannaomingong 的回复:
引用 13 楼 meteormeng 的回复:

12楼代码通过了,但是得到的数据里,没有红色点(255,0,0)数据,也没有差不多范围的数据。
我用工具查找了该图片,存在红色点(252,0,0)等红色,而我实际调试出的像素范围是(15,15,15)左右的,且图片中肉眼看不到的没有的白色(255,255,255)出现的频率很高,这个是为什么呢?求解!!


1.跟你的图片有关
2.一般图片的颜色都很多,表面上你看到的某颜色,…
[/Quote]

我给的程序里有
例如你可以改成这样

//如果你判断颜色的情况有数种操作,增加对应的if
int int_InColorX(unsigned char r,unsigned char g,unsigned char b)
{
int int_whichspace=0;
if ( r>=220 && g>=30 && b>=50)
{
int_whichspace=1;
}
// if...
return int_whichspace;
}

不同的颜色空间返回不同的值,那么遍历图的时候只要调用
int_InColorX(pr,pg,pb),根据返回值作相应处理即可
meteormeng 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 diannaomingong 的回复:]
引用 13 楼 meteormeng 的回复:

12楼代码通过了,但是得到的数据里,没有红色点(255,0,0)数据,也没有差不多范围的数据。
我用工具查找了该图片,存在红色点(252,0,0)等红色,而我实际调试出的像素范围是(15,15,15)左右的,且图片中肉眼看不到的没有的白色(255,255,255)出现的频率很高,这个是为什么呢?求解!!


1.跟你的图片有关
2.一般图片的颜色都很多,表面上你看到的某颜色,放大到像素级其实是一堆颜色混合而成
3.…
[/Quote]
怎么定义呢?我不会,教下我吧
diannaomingong 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 meteormeng 的回复:]
12楼代码通过了,但是得到的数据里,没有红色点(255,0,0)数据,也没有差不多范围的数据。
我用工具查找了该图片,存在红色点(252,0,0)等红色,而我实际调试出的像素范围是(15,15,15)左右的,且图片中肉眼看不到的没有的白色(255,255,255)出现的频率很高,这个是为什么呢?求解!!
[/Quote]

1.跟你的图片有关
2.一般图片的颜色都很多,表面上你看到的某颜色,放大到像素级其实是一堆颜色混合而成
3.图像分析你定义r==xxx && g==yyy && b=zzz 这样非常非常准确的空间会错过很多和其相似的像素
所以要定义一个颜色空间,一般所谓模板。这个颜色空间的定义和逻辑结构密切关系到程序图像识别的能力


meteormeng 2009-03-06
  • 打赏
  • 举报
回复
12楼代码通过了,但是得到的数据里,没有红色点(255,0,0)数据,也没有差不多范围的数据。
我用工具查找了该图片,存在红色点(252,0,0)等红色,而我实际调试出的像素范围是(15,15,15)左右的,且图片中肉眼看不到的没有的白色(255,255,255)出现的频率很高,这个是为什么呢?求解!!
xkyx_cn 2009-03-06
  • 打赏
  • 举报
回复

Graphics* myGraphics;
Image image(L"reseau1.bmp");
myGraphics = Graphics::FromImage(&image);
HDC hdc = myGraphics->GetHDC();

int weight = image.GetWidth();
int height = image.GetHeight();
for (int i=0; i <= weight; i++)
{
for (int j=0; j <= height; j++)
{
COLORREF col = ::GetPixel(hdc, i, j);
if (GetRValue(col) == 225 && GetGValue(col) == 0 && GetBValue(col) == 0)
{
sum[k] = i;
++k;
sum[k] = j;
++k;
}
}
}


以上代码我测试过了,你试试吧
meteormeng 2009-03-06
  • 打赏
  • 举报
回复
有人告诉我吗?
就是做个连接文件的句柄吧,令GetPixel能对图片文件做处理!!
meteormeng 2009-03-06
  • 打赏
  • 举报
回复
删除就报错了,不知道怎么改了。
  • 打赏
  • 举报
回复
Image image(L"reseau1.bmp");
myGraphics->FromImage(&image);
myGraphics = new Graphics(hdc);

第一行确认图片已经加载(可以写全路径)
第二行已经得到一个Graphics 记得delete
第三行删除,为什么要这句呢?

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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