将图像转换为字符

妙笔生花tys 2015-05-19 01:39:54
将图像转换为字符
void CPictureToTextDlg::OnConvert()
{
CPaintDC dc(this);
long* m_pbmpdata;
long* p_tmp;
BITMAPINFO *m_pbmpinfo,m_bmp;

HBITMAP hbmp=(HBITMAP)LoadImage(::AfxGetResourceHandle(),"bitmap.bmp",
IMAGE_BITMAP,0, 0,LR_DEFAULTCOLOR|LR_LOADFROMFILE);
m_bmp.bmiHeader.biSize=sizeof(m_bmp.bmiHeader);
m_bmp.bmiHeader.biBitCount=0;

int bmpWidth;
int bmpHeight;
GetDIBits(dc.GetSafeHdc(),hbmp,0,1,NULL,&m_bmp,DIB_RGB_COLORS);
bmpWidth=m_bmp.bmiHeader.biWidth;
bmpHeight=m_bmp.bmiHeader.biHeight;

p_tmp=(long*)malloc(bmpWidth*bmpHeight*m_bmp.bmiHeader.biBitCount+sizeof(BITMAPINFO));
m_pbmpinfo=(BITMAPINFO*)p_tmp;
m_pbmpdata=p_tmp+sizeof(BITMAPINFO);
memcpy(p_tmp,(const void*)&m_bmp,sizeof(BITMAPINFOHEADER));
GetDIBits(dc.GetSafeHdc(),hbmp,0,m_bmp.bmiHeader.biHeight,m_pbmpdata,
m_pbmpinfo,DIB_RGB_COLORS);

long lngBackColor=RGB(255,255,255);
long lTemp;
int r,g,b;
CString strChar,strTemp;
for(int i=bmpHeight;i>1;i--)
{
for(int j=1;j<bmpWidth;j++)
{
lTemp=m_pbmpdata[(j-1)+(i-1)*bmpWidth];

r=GetRValue(lTemp);
g=GetGValue(lTemp);
b=GetBValue(lTemp);

if(r>224 || g >224 || r >224)
strChar=" ";
else if(r>192 || g >192 || r >192 )
strChar="#";
else if(r>160 || g >160 || r >160 )
strChar="%";
else if(r>128 || g >128 || r >128 )
strChar="$";
else if(r>96 || g >96 || r >96 )
strChar="8";
else if(r>64 || g >64 || r >64 )
strChar="X";
else if(r>32 || g >32 || r >32 )
strChar="?";
else
strChar="?";
m_edit.GetWindowText(strTemp);
strTemp=strTemp+strChar;
m_edit.SetWindowText(strTemp);

}
m_edit.GetWindowText(strTemp);
strTemp=strTemp+"\r\n";
m_edit.SetWindowText(strTemp);
}
}

我的问题是:如何把前面代码换成直接获取图像上下文那样的,怎么做?
就跟下面灰度化实例类似的
void CTang511Dlg::OnOK()
{
CDC* pDC = m_image.GetDC();
CRect m_rect ;
m_image.GetClientRect(m_rect);

COLORREF m_color;
DWORD m_gray;
BYTE r,g,b;
for (int i = 0; i<m_rect.right;i++)
for (int j = 0;j<m_rect.bottom;j++)
{
m_color = pDC->GetPixel(i,j);
r = GetRValue(m_color);
g = GetGValue(m_color);
b = GetRValue(m_color);

m_gray = (0.38*r+0.49*g+0.1*b);

m_color = RGB(m_gray,m_gray,m_gray);
pDC->SetPixel(i,j,m_color);
}
}
...全文
150 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
妙笔生花tys 2015-05-19
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
它那个代码是一直运行,不显示结果,好像无限循环进去了 我想请教一下怎么把前面获取图片的代码改成这样子 CDC* pDC = m_image.GetDC(); CRect m_rect ; m_image.GetClientRect(m_rect);
赵4老师 2015-05-19
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
妙笔生花tys 2015-05-19
  • 打赏
  • 举报
回复
顶上去,希望有人能指点,谢谢
妙笔生花tys 2015-05-19
  • 打赏
  • 举报
回复
然后我想把前面那个图像读取的代码,改成这样 void CTang511Dlg::OnConvert() { CDC* pDC = m_image.GetDC(); CRect m_rect ; m_image.GetClientRect(m_rect); COLORREF m_color; BYTE r,g,b; CString strChar,strTemp; for (int i = 0; i<m_rect.right;i++) { for (int j = 0;j<m_rect.bottom;j++) { m_color = pDC->GetPixel(i,j); r = GetRValue(m_color); g = GetGValue(m_color); b = GetRValue(m_color); if(r>224 || g >224 || r >224) strChar=" "; else strChar="●"; m_edit.GetWindowText(strTemp); strTemp=strTemp+strChar; m_edit.SetWindowText(strTemp); j=j+8; } m_edit.GetWindowText(strTemp); strTemp=strTemp+"\r\n"; m_edit.SetWindowText(strTemp); i=i-7; } } 代码编译无误,一运行崩溃了,想请教怎么修改
妙笔生花tys 2015-05-19
  • 打赏
  • 举报
回复

这个代码我修改成这样的
void CTang511Dlg::OnConvert()
{
CPaintDC dc(this);
long* m_pbmpdata;
long* p_tmp;
BITMAPINFO *m_pbmpinfo,m_bmp;

HBITMAP hbmp=(HBITMAP)LoadImage(::AfxGetResourceHandle(),"bitmap.bmp",
IMAGE_BITMAP,0, 0,LR_DEFAULTCOLOR|LR_LOADFROMFILE);
m_bmp.bmiHeader.biSize=sizeof(m_bmp.bmiHeader);
m_bmp.bmiHeader.biBitCount=0;

int bmpWidth;
int bmpHeight;
GetDIBits(dc.GetSafeHdc(),hbmp,0,1,NULL,&m_bmp,DIB_RGB_COLORS);
bmpWidth=m_bmp.bmiHeader.biWidth;
bmpHeight=m_bmp.bmiHeader.biHeight;

p_tmp=(long*)malloc(bmpWidth*bmpHeight*m_bmp.bmiHeader.biBitCount+sizeof(BITMAPINFO));
m_pbmpinfo=(BITMAPINFO*)p_tmp;
m_pbmpdata=p_tmp+sizeof(BITMAPINFO);
memcpy(p_tmp,(const void*)&m_bmp,sizeof(BITMAPINFOHEADER));
GetDIBits(dc.GetSafeHdc(),hbmp,0,m_bmp.bmiHeader.biHeight,m_pbmpdata,
m_pbmpinfo,DIB_RGB_COLORS);

long lngBackColor=RGB(255,255,255);
long lTemp;
int r,g,b;
CString strChar,strTemp;
for(int i=bmpHeight;i>1;i--)
{
for(int j=1;j<bmpWidth;j++)
{
lTemp=m_pbmpdata[(j-1)+(i-1)*bmpWidth];

r=GetRValue(lTemp);
g=GetGValue(lTemp);
b=GetBValue(lTemp);

if(r>224 || g >224 || r >224)
strChar=" ";
else
strChar="●";
m_edit.GetWindowText(strTemp);
strTemp=strTemp+strChar;
m_edit.SetWindowText(strTemp);
j=j+8;
}
m_edit.GetWindowText(strTemp);
strTemp=strTemp+"\r\n";
m_edit.SetWindowText(strTemp);
i=i-7;
}
}
运行结果是这样

zgl7903 2015-05-19
  • 打赏
  • 举报
回复
少量变量类型 static char szCharIndex[] = { "??X8$%# " }; strChar = (char)szCharIndex [max(max(r,g),b) / 32];
zgl7903 2015-05-19
  • 打赏
  • 举报
回复
都是32的倍数
/*if(r>224 || g >224 || r >224)
strChar=" ";
else if(r>192 || g >192 || r >192 )
strChar="#";
else if(r>160 || g >160 || r >160 )
strChar="%";
else if(r>128 || g >128 || r >128 )
strChar="$";
else if(r>96 || g >96 || r >96 )
strChar="8";
else if(r>64 || g >64 || r >64 )
strChar="X";
else if(r>32 || g >32 || r >32 )
strChar="?";
else
strChar="?";
*/
static szCharIndex[] = { "??X8$%# " };
strChar = szCharIndex [max(max(r,g),b) / 32];

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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