CSDN博客

img andylin6122

用DIB叠加字符

发表于2008/9/28 10:40:00  130人阅读


#ifndef __ADD_TEXT_H
#define __ADD_TEXT_H
class CAddText
{
public:
 //叠加字符使用
    CFont m_font;
 CFont *m_poldfont;
 CDC m_memdc;
 CBitmap m_memBitmap,*m_poldBitmap;
 BYTE *m_pTextBits;
    int m_nWidth;
 int m_nHeight;
    CAddText(int nWidth,int nHeight);
 CAddText();
 ~CAddText();
 void InitGdiResource();
 void FreeGdiResource();
    void PrintDataInfo(LPBYTE lpDIB,LPCTSTR szRoadName,int x,int y,int nPitch);

};

#endif

 

 

 

#include "stdafx.h"
#include "AddText.h"

CAddText::CAddText(int nWidth,int nHeight)
{
 m_nWidth = nWidth;
 m_nHeight = nHeight;
 InitGdiResource();
}

CAddText::CAddText()
{
 m_nWidth = 768;
 m_nHeight = 16;
 InitGdiResource();
}

CAddText::~CAddText()
{
 FreeGdiResource();
}

void CAddText::InitGdiResource()
{
    VERIFY(m_font.CreateFont(
  m_nHeight,                        // nHeight
  0,                         // nWidth
  0,                         // nEscapement
  0,                         // nOrientation
  FW_BOLD,                 // nWeight
  FALSE,                     // bItalic
  FALSE,                     // bUnderline
  0,                         // cStrikeOut
  ANSI_CHARSET,              // nCharSet
  OUT_DEFAULT_PRECIS,        // nOutPrecision
  CLIP_DEFAULT_PRECIS,       // nClipPrecision
  DEFAULT_QUALITY,           // nQuality
  DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
  _T("宋体")));   
 
 m_memdc.CreateCompatibleDC(NULL);
 m_memBitmap.CreateBitmap(m_nWidth,m_nHeight,1,1,NULL);
 m_poldBitmap = m_memdc.SelectObject(&m_memBitmap);
 m_poldfont = (CFont *)m_memdc.SelectObject(&m_font);
 m_memdc.SetBkColor(0x00);
 m_memdc.SetBkMode(TRANSPARENT);
 m_memdc.SetTextColor(0xffffff);
 m_pTextBits = new BYTE[m_nWidth*m_nHeight/8];
}

void CAddText::FreeGdiResource()
{
    m_memdc.SelectObject(m_poldBitmap);
 m_memdc.SelectObject(m_poldfont);
    m_memBitmap.DeleteObject();
 m_font.DeleteObject();
 m_memdc.DeleteDC();
 delete m_pTextBits;
}

 


//必须保证输入的DIB为768x304
//在图片上打印字符的函数,为了加快速度,并且不破坏原来的图像,采用mask位图的方式
//参数:LPBYTE lpdes, 384*288 24bit位图数据块
//        LPCTSTR szRoadName 要打印的路口名称
void CAddText::PrintDataInfo(LPBYTE lpDIB,LPCTSTR szRoadName,int x,int y,int nPitch)
{
 m_memdc.FillSolidRect(0,0,m_nWidth,m_nHeight,0);
 m_memdc.TextOut(0,0,szRoadName);
 
 BYTE *lpsrc;
    BYTE *lpdes;
 int i,j,k;
 //将掩码位图块拷贝出来
 m_memBitmap.GetBitmapBits(m_nWidth*m_nHeight/8,m_pTextBits);
 lpsrc = m_pTextBits;
 lpdes = lpDIB+nPitch*y+x*3;// + 768*288*3;
 //先将叠加条变成白底色
 INT line = m_nWidth/8;
 for(i=0;i<m_nHeight;i++)
 {
  lpdes = lpDIB+nPitch*(y+i)+x*3;
  for(j=0;j<line;j++)
  {  
   for(k=7;k>=0;k--)
   {
    if((*lpsrc)&(1<<k))
    {
        //叠加蓝色字符,下面的语句相当于 lpdes[0] = 0xff; lpdes[1] = 0x00; lpdes[2] = 0x00;
     *(DWORD *)lpdes = (*(DWORD *)lpdes&0xff0000ff)|0x000000ff; 
    }
    lpdes += 3;
   }
   lpsrc++;
  }

 }
}

0 0

相关博文

我的热门文章

img
取 消
img