对话框中灰度显示图像

sweedy_cool 2010-06-23 11:00:59
unsigned char *m_recImg中存放着文件数据,图像是1072*1028字的大小,如何显示在对话框中?下面是我从网上找的程序,运行出错.在对话框中还添加了一个picture类型的控件,不知道如何使用。只要灰度显示在对话框中即可,求教高手!谢谢
CDC* pDC;
CBitmap bitmapmatrix;
int i=bitmapmatrix.CreateBitmap(m_iImgWidth,m_iImgHeight,1,32,m_recImg);
CDC dcCompMatrix;
dcCompMatrix.CreateCompatibleDC(pDC); //出错
dcCompMatrix.SelectObject(&bitmapmatrix); //出错
int k=pDC-> BitBlt(0,0,m_iImgWidth,m_iImgHeight,&dcCompMatrix,0,0,SRCCOPY);
...全文
163 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
程老师2088 2010-06-24
  • 打赏
  • 举报
回复
兔子党好强大
stonewater 2010-06-23
  • 打赏
  • 举报
回复
BitBlt函数的前两个参数就是图像相对窗口的起始位置
sweedy_cool 2010-06-23
  • 打赏
  • 举报
回复
谢谢各位。pDC初始化后,图片可以显示。
1 但是不是灰度的,都是绿色的,能看出来一点儿图像的本来面目
2 而且对话框一旦最小化图像就没有了。
3 如何控制图像显示的位置
冰水混合物l 2010-06-23
  • 打赏
  • 举报
回复
正解。pDC不初始化是不能用的。
cdsnpeter 2010-06-23
  • 打赏
  • 举报
回复
void CDlgPaintDlg::OnPaint() 
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc(this); // device context for painting
::CoInitialize(NULL); // COM 初始化
HRESULT hr;
CFile file;

file.Open( "c:\\aa.bmp", CFile::modeRead | CFile::shareDenyNone ); // 读入文件内容
DWORD dwSize = file.GetLength();
HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, dwSize );
LPVOID lpBuf = ::GlobalLock( hMem );
file.Read( lpBuf, dwSize );
file.Close();
::GlobalUnlock( hMem );

IStream * pStream = NULL;
IPicture * pPicture = NULL;

// 由 HGLOBAL 得到 IStream,参数 TRUE 表示释放 IStream 的同时,释放内存
hr = ::CreateStreamOnHGlobal( hMem, TRUE, &pStream );
ASSERT ( SUCCEEDED(hr) );

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 ); // 高

////////原大显示//////
CSize sz( nWidth, nHeight );
dc.HIMETRICtoDP( &sz ); // 转换 MM_HIMETRIC 模式单位为 MM_TEXT 像素单位
pPicture->Render(dc.m_hDC,0,0,sz.cx,sz.cy,
0,nHeight,nWidth,-nHeight,NULL);

if ( pPicture ) pPicture->Release();// 释放 IPicture 指针
if ( pStream ) pStream->Release(); // 释放 IStream 指针,同时释放了 hMem

::CoUninitialize();
CDialog::OnPaint();
}
}


========
贴段IPicture显示图片的例子,你参考参考。
半刻沙漏 2010-06-23
  • 打赏
  • 举报
回复
pDC 没有初始化
healer_kx 2010-06-23
  • 打赏
  • 举报
回复
简单的,你可以使用IPicture接口。

此外VC里面也提供了Image控件什么的,

非要和这个几个API较劲的话,你的pDC貌似没有初始化啊。
Eleven 2010-06-23
  • 打赏
  • 举报
回复
CDC* pDC;
你的指针都没有分配内存就直接用了,
CDC* pDC = GetDC();
sweedy_cool 2010-06-23
  • 打赏
  • 举报
回复
谢谢各位。我的图像数据通过fread到m_recImg中,显示的图像就是绿的,隐约能看到图像。但我做测试把m_recImg中全都赋值从0到255,看到是由浅到深的灰度显示,就不是彩色的了
cdsnpeter 2010-06-23
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20020421/18/664807.html
看看这个链接,或许对你有帮助。
sweedy_cool 2010-06-23
  • 打赏
  • 举报
回复
为什么显示的图像是绿色的,把高低字节颠倒后又变成红色的了,如何灰度显示出来?
昨夜无风 2010-06-23
  • 打赏
  • 举报
回复
在OnDraw函数或OnPaint函数中实现你那个代码,就不会消失了。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧