******************对彩色图像进行灰度化********/void CReadBMP2View::OnImageGray()
{
CClientDC pDC(this);
HDC hDC=pDC.GetSafeHdc();
SetStretchBltMode(hDC,COLORONCOLOR);
BYTE* lpBits;
BYTE* lpbi;
HDIB hDib;
WORD wNumColors;
CReadBMP2Doc* pDoc = GetDocument();
hDib=pDoc->m_hDIB;//hDib内存包括位图信息头文件和位图象素值
if(hDib==NULL)
{
return;
}
lpbi=(BYTE*)::GlobalLock((HGLOBAL)hDib);
wNumColors=::DIBNumColors((LPSTR)lpbi);
::GlobalUnlock((HGLOBAL)hDib);
//下面得到指向位图象素值的指针
if(wNumColors!=0)
{
lpBits=lpbi+sizeof(BITMAPINFOHEADER)+wNumColors*sizeof(RGBQUAD); }
else lpBits=lpbi+sizeof(BITMAPINFOHEADER);
BYTE* lpDstBits;
HANDLE lpDstBitsHandle;
lpDstBitsHandle=::GlobalAlloc(GMEM_SHARE,WIDTHBYTES(dwWidth*8*dwHeight));
//申请存放处理后的象素值的缓冲区
lpDstBits=(BYTE*)::GlobalLock(HGLOBAL(lpDstBits));
::GlobalFree(lpDstBits);
Gray(lpBits,lpDstBits,dwWidth,dwHeight,1);//把源区域的数据转化成灰度值放在缓冲区
CxImage GrayImage;//建立cximage类的一个变量
GrayImage.CreateFromArray(lpDstBits,dwWidth,dwHeight,8,(DWORD)((dwWidth+3)/4*4),false);//用缓冲区的数据建立一个灰度图像
CRect rc1;
rc1.top=0;
rc1.left=dwWidth+10;
rc1.right=2*dwWidth+10;
rc1.bottom=dwHeight;
GrayImage.Draw2(pDC.GetSafeHdc(), rc1);//显示在屏幕上
}
编译通过,能够打开保存图像,但是点击灰度化按钮时就出现“0x00406c71”指令引用的“0x01120048”内存,该内存不能为“read”,调试后出现下面的提示:
Loaded symbols for 'F:\study\vc++\新项目\ReadBMP2\Debug\ReadBMP2.exe'
Loaded 'C:\WINDOWS\system32\ntdll.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found.
Loaded symbols for 'C:\WINDOWS\system32\MFC42D.DLL'
Loaded symbols for 'C:\WINDOWS\system32\MSVCRTD.DLL'
Loaded 'C:\WINDOWS\system32\gdi32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\user32.dll', no matching symbolic information found.
Loaded symbols for 'C:\WINDOWS\system32\MFCO42D.DLL'
Loaded 'C:\WINDOWS\system32\imm32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\advapi32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\rpcrt4.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\secur32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\lpk.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\usp10.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msvcrt.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\mfc42loc.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\uxtheme.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\MSCTF.dll', no matching symbolic information found.
Loaded 'C:\KAV2007\KMailOEBand.DLL', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\comctl32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\shell32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\shlwapi.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\ole32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\oleaut32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msvcr71.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msvcp71.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03\comctl32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\apphelp.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\MSCTFIME.IME', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\WINABC.IME', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\comdlg32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\clbcatq.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\comres.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\version.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\setupapi.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\userenv.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\ntshrui.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\atl.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\netapi32.dll', no matching symbolic information found.
The thread 0x78C has exited with code 0 (0x0).
The thread 0x964 has exited with code -1073741819 (0xC0000005).
The thread 0xFC has exited with code -1073741819 (0xC0000005).
The thread 0xCA0 has exited with code -1073741819 (0xC0000005).
The thread 0xBE0 has exited with code -1073741819 (0xC0000005).
The thread 0xC44 has exited with code -1073741819 (0xC0000005).
The program 'F:\study\vc++\新项目\ReadBMP2\Debug\ReadBMP2.exe' has exited with code -1073741819 (0xC0000005).请大家帮帮忙,初学的我搞了很久都不知道怎样修改!
{
CClientDC pDC(this);
HDC hDC=pDC.GetSafeHdc();
SetStretchBltMode(hDC,COLORONCOLOR);
BYTE* lpBits;
BYTE* lpbi;
HDIB hDib;
WORD wNumColors;
CReadBMP2Doc* pDoc = GetDocument();
hDib=pDoc->m_hDIB;//hDib内存包括位图信息头文件和位图象素值
if(hDib==NULL)
{
return;
}
lpbi=(BYTE*)::GlobalLock((HGLOBAL)hDib);
wNumColors=::DIBNumColors((LPSTR)lpbi);
::GlobalUnlock((HGLOBAL)hDib);
//下面得到指向位图象素值的指针
if(wNumColors!=0)
{
lpBits=lpbi+sizeof(BITMAPINFOHEADER)+wNumColors*sizeof(RGBQUAD); }
else lpBits=lpbi+sizeof(BITMAPINFOHEADER);
BYTE* lpDstBits;
HANDLE lpDstBitsHandle;
lpDstBitsHandle=::GlobalAlloc(GMEM_SHARE,WIDTHBYTES(dwWidth*8*dwHeight));
//申请存放处理后的象素值的缓冲区
lpDstBits=(BYTE*)::GlobalLock(HGLOBAL(lpDstBits));
::GlobalFree(lpDstBits);
Gray(lpBits,lpDstBits,dwWidth,dwHeight,1);//把源区域的数据转化成灰度值放在缓冲区
CxImage GrayImage;//建立cximage类的一个变量
GrayImage.CreateFromArray(lpDstBits,dwWidth,dwHeight,8,(DWORD)((dwWidth+3)/4*4),false);//用缓冲区的数据建立一个灰度图像
CRect rc1;
rc1.top=0;
rc1.left=dwWidth+10;
rc1.right=2*dwWidth+10;
rc1.bottom=dwHeight;
GrayImage.Draw2(pDC.GetSafeHdc(), rc1);//显示在屏幕上
}
编译通过,能够打开保存图像,但是点击灰度化按钮时就出现“0x00406c71”指令引用的“0x01120048”内存,该内存不能为“read”,调试后出现下面的提示:
Loaded symbols for 'F:\study\vc++\新项目\ReadBMP2\Debug\ReadBMP2.exe'
Loaded 'C:\WINDOWS\system32\ntdll.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found.
Loaded symbols for 'C:\WINDOWS\system32\MFC42D.DLL'
Loaded symbols for 'C:\WINDOWS\system32\MSVCRTD.DLL'
Loaded 'C:\WINDOWS\system32\gdi32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\user32.dll', no matching symbolic information found.
Loaded symbols for 'C:\WINDOWS\system32\MFCO42D.DLL'
Loaded 'C:\WINDOWS\system32\imm32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\advapi32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\rpcrt4.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\secur32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\lpk.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\usp10.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msvcrt.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\mfc42loc.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\uxtheme.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\MSCTF.dll', no matching symbolic information found.
Loaded 'C:\KAV2007\KMailOEBand.DLL', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\comctl32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\shell32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\shlwapi.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\ole32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\oleaut32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msvcr71.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msvcp71.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03\comctl32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\apphelp.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\MSCTFIME.IME', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\WINABC.IME', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\comdlg32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\clbcatq.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\comres.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\version.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\setupapi.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\userenv.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\ntshrui.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\atl.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\netapi32.dll', no matching symbolic information found.
The thread 0x78C has exited with code 0 (0x0).
The thread 0x964 has exited with code -1073741819 (0xC0000005).
The thread 0xFC has exited with code -1073741819 (0xC0000005).
The thread 0xCA0 has exited with code -1073741819 (0xC0000005).
The thread 0xBE0 has exited with code -1073741819 (0xC0000005).
The thread 0xC44 has exited with code -1073741819 (0xC0000005).
The program 'F:\study\vc++\新项目\ReadBMP2\Debug\ReadBMP2.exe' has exited with code -1073741819 (0xC0000005).请大家帮帮忙,初学的我搞了很久都不知道怎样修改!
刚才调试是时,进入gray函数时出现:unhandled exception in ReadBMP2.exe:0x0000005:Access Violation.无法再调试下去
这句话放到函数最后
最主要的错误是把BYTE*类型强行转成LPSTR
最主要的错误是把BYTE*类型强行转成LPSTR