那位高手可以帮助小女子,我将感激不尽。
解决方案 »
- 悠视互动科技这个公司怎么样?
- 88分求一个【适合初学者的源码网站】小弟从VB过来的,太复杂的代码看不懂,想看看代码熟悉下vc的套路
- 使用ado操作数据库时出错,有代码
- VC中时间的运算。(超级菜问题)
- 如何打开任务栏右下角电源管理及喇叭的系统托盘图标(回帖请注意实时系统托盘图标)
- 服务器端向客户端传送数组的问题
- 怎么样在程序中播放声音文件?
- 怎样让一个项目,编译成32位和编译成64位时用的函数不同?
- 如何使得快捷菜单不出对话框边界
- 关于字体问题!我怎么把大小从logical units转化为像素的数值呢???
- Unhandle exception in test.exe :0xC0000005 access violation
- 我想在一个对话框里实现一个快速启动条,对经常用的应用程序可以用鼠标拖拽到启动条上,请高手指点,50分,急!
*
* 函数名称:
* MedianFilter()
*
* 参数:
* HDIB hDIB - 待处理的DIB
*
* 返回值:
* 无返回值
*
* 说明:
* 该函数将彩色位图进行中值滤波处理
*
************************************************************************/void CSpaceFilter::MedianFilter(HDIB hDIB)
{
// 循环变量
LONG i;
LONG j;
LONG k;
LONG l; // 掩码模版
unsigned char mask_r[9];
unsigned char mask_g[9];
unsigned char mask_b[9];
COLORREF mask[9]; // 指向DIB的指针
LPBYTE lpDIB;
// 指向DIB象素指针
LPBYTE lpDIBBits;
// 锁定DIB
lpDIB = (LPBYTE) ::GlobalLock((HGLOBAL) hDIB); // 找到DIB图像象素起始位置
lpDIBBits = m_clsDIB.FindDIBBits(lpDIB);
// 判断是否是24-bpp位图
if (m_clsDIB.DIBBitCount(lpDIB) != 24)
{
// 提示用户
MessageBox("请先将其转换为24位色位图,再进行处理!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);
// 返回
return;
}
// 更改光标形状
BeginWaitCursor();
// DIB的宽度
LONG lWidth = m_clsDIB.DIBWidth(lpDIB);
// DIB的高度
LONG lHeight = m_clsDIB.DIBHeight(lpDIB); // 计算图像每行的字节数
LONG lLineBytes = WIDTHBYTES(lWidth * 24); // 申请并分配中间缓存
HLOCAL hLocal = LocalAlloc(GHND, lLineBytes * lHeight);
if (hLocal == NULL)
return;
LPBYTE m_temp = (LPBYTE)LocalLock(hLocal); // 复制图象数据到中间缓存
for (i = 0; i < lHeight; i ++)
{
for (j = 0; j < lLineBytes; j ++)
{
*(m_temp + lLineBytes * i + j) = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
j++;
*(m_temp + lLineBytes * i + j) = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
j++;
*(m_temp + lLineBytes * i + j) = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
}
} // 模版滤波
for (i = 0; i < lWidth; i++) //被处理像素在i列
{
for (j = 0; j < lHeight; j++) //被处理像素在j行
{
// 索引
int id = 0; // 进行小区域模版滤波
for (k = i - 1; k < i + 2; k++)
{
for(l = j - 1; l < j + 2; l++)
{
// 防止内存溢出
if (k >= 0 && l >= 0 && k < lWidth && l < lHeight)
{
mask_r[id] = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3);
mask_g[id] = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3 + 1);
mask_b[id] = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3 + 2);
mask[id] = RGB(mask_r[id], mask_g[id], mask_b[id]);
id++;
}
}
}
// 中间变量
unsigned char T;
// 冒泡排序法
for (k = 0; k < 8; k++)
{
for (l = 8; l > k; l--)
{
if (mask_r[l] < mask_r[l - 1])
{
T = mask_r[l];
mask_r[l] = mask_r[l - 1];
mask_r[l - 1] = T;
}
if (mask_g[l] < mask_g[l - 1])
{
T = mask_g[l];
mask_g[l] = mask_g[l - 1];
mask_g[l - 1] = T;
}
if (mask_b[l] < mask_b[l - 1])
{
T = mask_b[l];
mask_b[l] = mask_b[l - 1];
mask_b[l - 1] = T;
}
}
}
m_temp[j * lLineBytes + i * 3] = mask_r[4];
m_temp[j * lLineBytes + i * 3 + 1] = mask_g[4];
m_temp[j * lLineBytes + i * 3 + 2] = mask_b[4];
}
} // 将转换后的中间缓存数据回存到DIB
for (i = 0; i < lHeight; i ++)
{
for (j = 0; j < lLineBytes; j ++)
{
*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
j++;
*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
j++;
*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
}
}
// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);
LocalUnlock(hLocal);
LocalFree(hLocal); // 恢复光标
EndWaitCursor();
}