void JiHeBianHuanDib::Yuzhichuli()//对图像进行运算
{
// 指向DIB象素指针
LPBYTE p_data;
// 指向源图像的指针
LPBYTE lpSrc;
// 指向缓存图像的指针
LPBYTE lpDst;
// 指向缓存DIB图像的指针
LPBYTE temp;
//循环变量
int i;
int j;
// 找到DIB图像象素起始位置
p_data = GetData();
// DIB的宽度
LONG wide =GetWidth();
// DIB的高度
LONG height = GetHeight();
if (m_pBitmapInfoHeader->biBitCount<9)//灰度图像
{    
// 暂时分配内存,以保存新图像
temp = new BYTE[wide*height];
// 初始化新分配的内存,设定初始值为255
lpDst = (LPBYTE)temp;
memset(lpDst, (BYTE)255, wide * height); for (j = 0; j < height; j++)
{
for (i = 0; i < wide; i ++)
{
// 指向源图像倒数第j行,第i个象素的指针
lpSrc = (unsigned char *)(p_data + wide * j + i);
// 指向目标图像倒数第j行,第i个象素的指针
lpDst = (unsigned char *)(temp + wide * j + i);

if (*lpSrc <= 127)
*lpDst = 255;
else
*lpDst = 0;
}
}
// 复制处理后的图像
memcpy(p_data, temp, wide * height);
// 释放内存
delete temp;
}
}
简单的阈值处理,就是在处理的效果图中,原图最上面三排像素没有被处理,望帮看下,自己找不出错了那里!问题解决后会速度结帖!……

解决方案 »

  1.   

    我也没有看出哪有问题,除非你说的最上面三排如果是前三行没有处理,那只有一个原因,那就是得到图像象素起始位置  p_data = GetData();这行代码有问题,得到的头指针不对,跳过了三行。再一个你上面的最后的释放内存delete temp;要写成delete []temp;
      

  2.   

    你的wide是否就是和行对齐的wide一样大小,要注意行对齐
      

  3.   

    好像是CDib的问题,明天看下那个DIBAPI的!都是从网上找的空白模板……先请教下:// 指向DIB第i行,第j个象素的指针
    lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - j) + i;上面的API中的与下面的这个有什么区别?还有怎么一个是坐标减1再减j(lHeight - 1 - j),一个却只是j。// 指向源图像倒数第j行,第i个象素的指针            
    lpSrc = (unsigned char *)(p_data + wide * j + i);请说的详细点,我连菜都不是!谢谢……
      

  4.   

    很郁闷,昨天不对,今天又能处理显示了!再问下,就是退出程序会显示Windows的提示:
    "0x7c930a19"指令引用的“0x00000000"内存。该内存不能为"read"。
    要终止程序,请单击“确定”。
    这个问题一般会是什么导致的,程序处理的是256色位图。只打开原图后再关闭,不会有这提示。
    但只要对图像做了操作后,就会有这个提示!
      

  5.   

    指针非法操作。使用指针的时候,记得初始化,使用完之后释放同时置为NULL。使用时,进行有效性验证。
      

  6.   


    谢过了哈!请帮忙再看下http://topic.csdn.net/u/20100303/11/c50dd259-f1e4-4080-8a8a-a6aa8b1c64bc.html这个问题哈!