IPicture * pPicture = NULL;
RECT m_PicRect; // 保存图片验证码矩形区域 BITMAPFILEHEADER filehead;
BITMAPINFOHEADER fileinfo;
RGBTRIPLE *rgb=NULL; ::CoInitialize(NULL); // 初始化COM
HRESULT hr,hr2;
CFile file;
//CPaintDC dc(this);
CClientDC dc(this); IStream *pStream = NULL; file.Open(strPath, CFile::modeRead | CFile::shareDenyNone); DWORD dwSize = file.GetLength();
HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, dwSize );
//LPVOID lpBuf = ::GlobalLock( hMem ); LPBYTE lpTemp=(LPBYTE)::GlobalLock( hMem );; //全图字节数的一个数组
file.Read(lpTemp, dwSize);
file.Close();
::GlobalUnlock( hMem ); // 由HGLOBAL得到IStream,参数TRUE 表示释放IStream的同时,释放内存
hr = ::CreateStreamOnHGlobal(hMem, TRUE, &pStream ); //
ASSERT(SUCCEEDED(hr));
BYTE gray;
hr = ::OleLoadPicture(pStream, dwSize, TRUE, IID_IPicture, (LPVOID *)&pPicture);
ASSERT(hr == S_OK); //-------------------------------------------------------------------------------------------------------------------------------------
long nWidth,nHeight; // 宽高 MM_HIMETRIC模式,单位是0.01毫米
pPicture->get_Width( &nWidth ); // 宽
pPicture->get_Height( &nHeight ); // 高 pPicture->Release(); long nPicWidth = MulDiv(nWidth, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSX), HIMETRIC_PER_INCH);
long nPicHeight = MulDiv(nHeight, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSY), HIMETRIC_PER_INCH);
DWORD i=0;
DWORD count=nPicWidth*nPicHeight; //象素数 while(i<count)
{
gray=(BYTE)((float)lpTemp[0]*0.299+(float)lpTemp[1]*0.587+(float)lpTemp[2]*0.114);
//gray=(lpTemp[0]+lpTemp[1]+lpTemp[2])/3;
*lpTemp++=gray;
*lpTemp++=gray;
*lpTemp++=gray; // *lpTemp=*lpTemp+gray;
i++;
} /**/ CSize sz(nWidth, nHeight); // 原大显示
dc.HIMETRICtoDP(&sz); // 转换MM_HIMETRIC模式单位为MM_TEXT像素单位
OLE_XPOS_HIMETRIC xSrc; // 图片中当前显示区域的x
OLE_YPOS_HIMETRIC ySrc; // 图片中当前显示区域的y
OLE_XSIZE_HIMETRIC cxSrc = nPicWidth; // 图片中当前显示区域的宽度
OLE_YSIZE_HIMETRIC cySrc = nPicHeight; // 图片中当前显示区域的高度 pPicture->Render(dc.m_hDC, 135, 680, nPicWidth, nPicHeight, 0, nHeight, nWidth, -nHeight, NULL);
CRect rect(10,100,sz.cx + 10,sz.cy + 100); // 将图片区域保存,以便后面只刷新图片区域
m_PicRect = rect;
if(pPicture) // 释放IPicture指针
pPicture->Release(); if(pStream) // 释放IStream指针,同时释放hMem
pStream->Release();
::CoUninitialize();
RECT m_PicRect; // 保存图片验证码矩形区域 BITMAPFILEHEADER filehead;
BITMAPINFOHEADER fileinfo;
RGBTRIPLE *rgb=NULL; ::CoInitialize(NULL); // 初始化COM
HRESULT hr,hr2;
CFile file;
//CPaintDC dc(this);
CClientDC dc(this); IStream *pStream = NULL; file.Open(strPath, CFile::modeRead | CFile::shareDenyNone); DWORD dwSize = file.GetLength();
HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, dwSize );
//LPVOID lpBuf = ::GlobalLock( hMem ); LPBYTE lpTemp=(LPBYTE)::GlobalLock( hMem );; //全图字节数的一个数组
file.Read(lpTemp, dwSize);
file.Close();
::GlobalUnlock( hMem ); // 由HGLOBAL得到IStream,参数TRUE 表示释放IStream的同时,释放内存
hr = ::CreateStreamOnHGlobal(hMem, TRUE, &pStream ); //
ASSERT(SUCCEEDED(hr));
BYTE gray;
hr = ::OleLoadPicture(pStream, dwSize, TRUE, IID_IPicture, (LPVOID *)&pPicture);
ASSERT(hr == S_OK); //-------------------------------------------------------------------------------------------------------------------------------------
long nWidth,nHeight; // 宽高 MM_HIMETRIC模式,单位是0.01毫米
pPicture->get_Width( &nWidth ); // 宽
pPicture->get_Height( &nHeight ); // 高 pPicture->Release(); long nPicWidth = MulDiv(nWidth, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSX), HIMETRIC_PER_INCH);
long nPicHeight = MulDiv(nHeight, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSY), HIMETRIC_PER_INCH);
DWORD i=0;
DWORD count=nPicWidth*nPicHeight; //象素数 while(i<count)
{
gray=(BYTE)((float)lpTemp[0]*0.299+(float)lpTemp[1]*0.587+(float)lpTemp[2]*0.114);
//gray=(lpTemp[0]+lpTemp[1]+lpTemp[2])/3;
*lpTemp++=gray;
*lpTemp++=gray;
*lpTemp++=gray; // *lpTemp=*lpTemp+gray;
i++;
} /**/ CSize sz(nWidth, nHeight); // 原大显示
dc.HIMETRICtoDP(&sz); // 转换MM_HIMETRIC模式单位为MM_TEXT像素单位
OLE_XPOS_HIMETRIC xSrc; // 图片中当前显示区域的x
OLE_YPOS_HIMETRIC ySrc; // 图片中当前显示区域的y
OLE_XSIZE_HIMETRIC cxSrc = nPicWidth; // 图片中当前显示区域的宽度
OLE_YSIZE_HIMETRIC cySrc = nPicHeight; // 图片中当前显示区域的高度 pPicture->Render(dc.m_hDC, 135, 680, nPicWidth, nPicHeight, 0, nHeight, nWidth, -nHeight, NULL);
CRect rect(10,100,sz.cx + 10,sz.cy + 100); // 将图片区域保存,以便后面只刷新图片区域
m_PicRect = rect;
if(pPicture) // 释放IPicture指针
pPicture->Release(); if(pStream) // 释放IStream指针,同时释放hMem
pStream->Release();
::CoUninitialize();
lpTemp是指针啊,有变化的啊
gray=(BYTE)((float)lpTemp[0]*0.299+(float)lpTemp[1]*0.587+(float)lpTemp[2]*0.114);
你是否应该对没个Index值都要进行转换,而不是第一个呢?
gray=(BYTE)((float)lpTemp[i]*0.299+(float)lpTemp[i+1]*0.587+(float)lpTemp[i+2]*0.114);而且这样看感觉这副Bmp图要是24Bit才对,楼主为何不直接解Bmp图像格式去转.
IPicture * pPicture = NULL;
RECT m_PicRect; // 保存图片验证码矩形区域BITMAPFILEHEADER filehead;
BITMAPINFOHEADER fileinfo;
RGBTRIPLE *rgb=NULL;::CoInitialize(NULL); // 初始化COM
HRESULT hr,hr2;
CFile file;
//CPaintDC dc(this);
CClientDC dc(this);IStream *pStream = NULL;file.Open(strPath, CFile::modeRead | CFile::shareDenyNone);DWORD dwSize = file.GetLength();
HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, dwSize );
//LPVOID lpBuf = ::GlobalLock( hMem ); LPBYTE lpTemp=(LPBYTE)::GlobalLock( hMem );; //全图字节数的一个数组
file.Read(lpTemp, dwSize);
file.Close();
::GlobalUnlock( hMem ); // 由HGLOBAL得到IStream,参数TRUE 表示释放IStream的同时,释放内存
hr = ::CreateStreamOnHGlobal(hMem, TRUE, &pStream ); //
ASSERT(SUCCEEDED(hr));
BYTE gray;
hr = ::OleLoadPicture(pStream, dwSize, TRUE, IID_IPicture, (LPVOID *)&pPicture);
ASSERT(hr == S_OK); //-------------------------------------------------------------------------------------------------------------------------------------
long nWidth,nHeight; // 宽高 MM_HIMETRIC模式,单位是0.01毫米
pPicture->get_Width( &nWidth ); // 宽
pPicture->get_Height( &nHeight ); // 高pPicture->Release();long nPicWidth = MulDiv(nWidth, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSX), HIMETRIC_PER_INCH);
long nPicHeight = MulDiv(nHeight, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSY), HIMETRIC_PER_INCH);
DWORD i=0;
DWORD count=nPicWidth*nPicHeight; //象素数 gray=(BYTE)((float)lpTemp[0]*0.299+(float)lpTemp[1]*0.587+(float)lpTemp[2]*0.114);
//gray=(lpTemp[0]+lpTemp[1]+lpTemp[2])/3;
*lpTemp++=gray;
*lpTemp++=gray;
*lpTemp++=gray; 因为图片是从网站下载的,下载下来就是24位图片,但是不知道为何这个图片不是标准的24位那种格式,如果采用ie的图片另存为,保存下来的就是标准的bmp格式。所以现在要采用ipicture来显示,然后转换成灰度图像
gray=(BYTE)((float)lpTemp[0]*0.299+(float)lpTemp[1]*0.587+(float)lpTemp[2]*0.114);
//gray=(lpTemp[0]+lpTemp[1]+lpTemp[2])/3;
*lpTemp++=gray;
*lpTemp++=gray;
*lpTemp++=gray; 因为图片是从网站下载的,下载下来就是24位图片,但是不知道为何这个图片不是标准的24位那种格式,如果采用ie的图片另存为,保存下来的就是标准的bmp格式。所以现在要采用ipicture来显示,然后转换成灰度图像
24bit位图一个像素有3Byte, 3 * 8 = 24,
因此:你想这样:
你转换的过程是一个像素一个像素转换,因此单位要是3, 即 i += 3;