开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1549|回复: 7
收起左侧

[闲聊] 求人翻译一段源码

[复制链接]
结帖率:87% (13/15)
发表于 2012-12-30 16:22:15 | 显示全部楼层 |阅读模式   福建省三明市
终于可以睡觉鸟啊,写一个函数写了那么久,55555
编程真的不好受啊,特意帖出来作为留念,oh yeah
^_^,这个也是【原创】的,发在这里合适吧

BOOL WINAPI EdgeDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
{
// 指向源图像的指针
LPSTR lpSrc;

// 指向缓存图像的指针
LPSTR lpDst;

// 指向缓存DIB图像的指针
LPSTR lpNewDIBBits;
HLOCAL hNewDIBBits;
//循环变量
long i;
long j;
unsigned char n,e,s,w,ne,se,nw,sw;
//像素值
unsigned char pixel;
// 图像每行的字节数
LONG lLineBytes;
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);

//==================================对图像进行轮廓提取================================
// 暂时分配内存,以保存新图像
hNewDIBBits = LocalAlloc(LHND, lLineBytes * lHeight);
if (hNewDIBBits == NULL)
{
  // 分配内存失败
  return FALSE;
}

// 锁定内存
lpNewDIBBits = (char * )LocalLock(hNewDIBBits);
// 初始化新分配的内存,设定初始值为255
lpDst = (char *)lpNewDIBBits;
memset(lpDst, (BYTE)255, lLineBytes * lHeight);
for(j = 1; j <lHeight-1; j++)
{
  for(i = 1;i <lLineBytes-1; i++)
  {
   
   // 指向源图像倒数第j行,第i个象素的指针   
   lpSrc = (char *)lpDIBBits + lLineBytes * j + i;
   
   // 指向目标图像倒数第j行,第i个象素的指针   
   lpDst = (char *)lpNewDIBBits + lLineBytes * j + i;
   
   //取得当前指针处的像素值,注意要转换为unsigned char型
   pixel = (unsigned char)*lpSrc;
   //目标图像中非白的像素值全部变成黑色
   if(pixel != 255)
    *lpSrc = (unsigned char)0;

  }
}

for(j = 1; j <lHeight-1; j++)
{
  for(i = 1;i <lLineBytes-1; i++)
  {
   
   // 指向源图像倒数第j行,第i个象素的指针   
   lpSrc = (char *)lpDIBBits + lLineBytes * j + i;
   
   // 指向目标图像倒数第j行,第i个象素的指针   
   lpDst = (char *)lpNewDIBBits + lLineBytes * j + i;
   
   //取得当前指针处的像素值,注意要转换为unsigned char型
   pixel = (unsigned char)*lpSrc;

   if(pixel == 0)
   {
    *lpDst = (unsigned char)0;
    nw = (unsigned char)*(lpSrc + lLineBytes -1);
    n  = (unsigned char)*(lpSrc + lLineBytes );
    ne = (unsigned char)*(lpSrc + lLineBytes +1);
    w = (unsigned char)*(lpSrc -1);
    e = (unsigned char)*(lpSrc +1);
    sw = (unsigned char)*(lpSrc - lLineBytes -1);
    s  = (unsigned char)*(lpSrc - lLineBytes );
    se = (unsigned char)*(lpSrc - lLineBytes +1);
    //如果相邻的八个点都是黑点
    if(nw+n+ne+w+e+sw+s+se==0)
    {
     *lpDst = (unsigned char)255;
    }                              
   }
  }
}
// 复制腐蚀后的图像
memcpy(lpDIBBits, lpNewDIBBits, lLineBytes * lHeight);
// 释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);


//==================================对图像进行轮廓跟踪================================

        //是否找到起始点及回到起始点
bool bFindStartPoint;
//是否扫描到一个边界点
bool bFindPoint;
//起始边界点与当前边界点
Point StartPoint,CurrentPoint;
//八个方向和起始扫描方向
int Direction[8][2]={{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0}};
int BeginDirect;
// 暂时分配内存,以保存新图像
hNewDIBBits = LocalAlloc(LHND, lLineBytes * lHeight);
if (hNewDIBBits == NULL)
{
  // 分配内存失败
  return FALSE;
}

// 锁定内存
lpNewDIBBits = (char * )LocalLock(hNewDIBBits);
// 初始化新分配的内存,设定初始值为255
lpDst = (char *)lpNewDIBBits;
memset(lpDst, (BYTE)255, lLineBytes * lHeight);
//先找到最左上方的边界点
bFindStartPoint = false;
for (j = 0;j < lHeight && !bFindStartPoint;j++)
{
  for(i = 0;i < lWidth && !bFindStartPoint;i++)
  {
   // 指向源图像倒数第j行,第i个象素的指针   
   lpSrc = (char *)lpDIBBits + lLineBytes * j + i;
   
   //取得当前指针处的像素值,注意要转换为unsigned char型
   pixel = (unsigned char)*lpSrc;
   
   if(pixel == 0)
   {
    bFindStartPoint = true;
    StartPoint.Height = j;
    StartPoint.Width = i;
    // 指向目标图像倒数第j行,第i个象素的指针   
    lpDst = (char *)lpNewDIBBits + lLineBytes * j + i;
    *lpDst = (unsigned char)0;
   }  
  }
}
//由于起始点是在左下方,故起始扫描沿左上方向
BeginDirect = 0;
//跟踪边界
bFindStartPoint = false;
//从初始点开始扫描
CurrentPoint.Height = StartPoint.Height;
CurrentPoint.Width = StartPoint.Width;
while(!bFindStartPoint)
{
  bFindPoint = false;
  while(!bFindPoint)
  {
   //沿扫描方向查看一个像素
   lpSrc = (char *)lpDIBBits + lLineBytes* ( CurrentPoint.Height + Direction[BeginDirect][1])
    + (CurrentPoint.Width + Direction[BeginDirect][0]);
   pixel = (unsigned char)*lpSrc;
   if(pixel == 0)
   {
    bFindPoint = true;
    CurrentPoint.Height = CurrentPoint.Height + Direction[BeginDirect][1];
    CurrentPoint.Width = CurrentPoint.Width + Direction[BeginDirect][0];
    if(CurrentPoint.Height == StartPoint.Height && CurrentPoint.Width == StartPoint.Width)
    {
     bFindStartPoint = true;
    }
    lpDst = (char *)lpNewDIBBits + lLineBytes* CurrentPoint.Height + CurrentPoint.Width;
    *lpDst = (unsigned char)0;
    //扫描的方向逆时针旋转两格
    BeginDirect--;
    if(BeginDirect == -1)
     BeginDirect = 7;
    BeginDirect--;
    if(BeginDirect == -1)
     BeginDirect = 7;
   }
   else
   {
    //扫描方向顺时针旋转一格
    BeginDirect++;
    if(BeginDirect == 8)
     BeginDirect = 0;
   }
  }
}
// 复制腐蚀后的图像
memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);
// 释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);


// 返回
return TRUE;  
}

可以call我 317544294
如果需要 我可以把 http://www.3600gz.cn/thread-13622945-1-1.html 给你.
结帖率:0% (0/1)
发表于 2012-12-31 17:41:45 | 显示全部楼层   河南省洛阳市
哎 这个是真不会~~
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 2012-12-31 00:19:00 高大上手机用户 | 显示全部楼层   河北省石家庄市
1反正不是易语言啊,哎大学了在学
回复 支持 反对

使用道具 举报

结帖率:87% (13/15)
 楼主| 发表于 2012-12-30 20:35:05 | 显示全部楼层   福建省三明市
难道论坛没人会?? 这就是 C++语言吧..
回复 支持 反对

使用道具 举报

发表于 2012-12-30 16:51:22 | 显示全部楼层   北京市北京市
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)

签到天数: 2 天

发表于 2012-12-30 16:44:29 | 显示全部楼层   浙江省杭州市
你不如给张 原图 在给张 处理后的图  看下
回复 支持 反对

使用道具 举报

结帖率:100% (60/60)
发表于 2012-12-30 16:27:28 | 显示全部楼层   浙江省嘉兴市
特思软件 发表于 2012-12-30 16:24
不错,顶一个。。。来100精币。。。。

这个是什么语言貌似没见过

点评

if() } else { //扫描方向顺时针旋转一格 BeginDirect++; if(... 你见过几个语言有这种。。   重庆市重庆市  发表于 2012-12-30 16:33
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2012-12-30 16:24:22 | 显示全部楼层   重庆市重庆市
QQ截图20121230162254.png

不错,顶一个。。。{:soso__14347937040236606360_1:}来100精币。。。。

点评

我咧个去、羡慕嫉妒恨   北京市北京市  发表于 2012-12-30 16:42
尼玛吓我一跳 回帖100   福建省三明市  发表于 2012-12-30 16:40
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表