读取txt文档创建位图

来源:互联网 发布:数控折弯机如何编程 编辑:程序博客网 时间:2024/03/29 02:57

读取txt文档创建位图
有些朋友希望通过自定义图象的方式来产生一幅bmp图象,那这篇文章对大家可能会有些帮助。
我们采用读取txt文档得到图象象素数据。
本文只以8位灰度图为例,其他格式类似。
初步设定没3位确定一个象素的值,从0~256,没有负数大于255的数设为255。
具体步骤:
1. 读取文档,得到字符串数据,转换成数字信息,构成图象数据数组。将得到的数据作为正方形图象,不足以255补位,如果有需要也可以自定义宽高。
2. 申请内存,创建bmp文件头,根据图象数据数组写入bmp数据区,同时显示在屏幕上。
3. 设置保存。
关键程序如下。
void CCreatBMPDoc::OnFileOpen()
{
ReadText();
CreatBMP();
UpdateAllViews(NULL);
}
第一步:读取文档,得到字符串数据,转换成数字信息,构成图象数据数组。
//把文本字符串读过来放到数组里面
//把文本字符串读过来放到数组里面
BYTE* DestArray;
long FileLength;
long PixTotal;
long i,j;

CString result;
CStdioFile file;
    CFileException fe;

CString lpszPathName;
    CFileDialog dlg(TRUE,"*.txt",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"Text Files (*.txt)|*.txt|",NULL);
   
if(dlg.DoModal()!=IDOK)
  return ;
lpszPathName=dlg.GetPathName();

   

if(!file.Open((LPCTSTR)lpszPathName,CFile::modeRead|CFile::shareDenyWrite|CFile::typeText ,&fe))
{
  return;
}
FileLength=file.GetLength();

    PixTotal=FileLength/3+1;

DestArray=new BYTE[PixTotal];

char buf[4];

for (i=0;i<PixTotal;i++)
{
 
  TRY
  {
   file.ReadString( buf,4 ); 
   DestArray[i]=(BYTE)(atoi(buf)> 255 ? 255:atoi(buf));
  }
 
  CATCH(CFileException,eLoad )
  {
   file.Abort();
   return;
  }
  END_CATCH
}

double num = sqrt(PixTotal);

while( num>=1 )
{
  num--;
}

if( num == 0 )
{
  lWidth = lHeight = (long)sqrt(PixTotal);
}
else
{
  lWidth = lHeight = (long)( sqrt(PixTotal)+1 );
}

LineBits = WIDTHBYTES(8*lWidth);
Length = LineBits*lHeight;

if( lpBits )
  delete [] lpBits;
lpBits = new BYTE [Length];
for( i=0;i<Length;i++ )
{
  lpBits[i] = 255;
}
for( i=0;i<lHeight;i++ )
{
  for( j=0;j<lWidth;j++ )
  {
   if( i*lWidth+j < PixTotal && DestArray[i*lWidth+j]<256 )
   {
    lpBits[ (lHeight-1-i)*LineBits+j ]
     = DestArray[ i*lWidth+j ];
   }
  }
}//需要注意存储的方式
Length是图象数据数组的长度。
lpBits指向图象数据的指针。
第二步:创建bmp,申请内存,创建bmp文件头,根据图象数据数组写入bmp数据区,同时显示在屏幕上。
void CCreatBMPDoc::CreatBMP()
{
long i;

lpHead = new BYTE [sizeof(BITMAPFILEHEADER)
  +sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)
  +Length] ;
CreatInfo();

for( i=0;i<Length;i++ )
{
  *(lpHead+1078+i) = lpBits[i];
}
}
void CCreatBMPDoc::CreatInfo()
{
m_FileLength = 1078 + Length;
LineBits = WIDTHBYTES(8*lWidth);

m_pBitmapFileHeader = (BITMAPFILEHEADER*)lpHead;
m_pBitmapInfoHeader = (BITMAPINFOHEADER*)(lpHead+14);
m_pRGBQuad = (RGBQUAD*)( lpHead + 54 );

m_pBitmapFileHeader->bfType = 0x4d42;//0x012304e0;//0x424D
m_pBitmapFileHeader->bfOffBits = 1078;
m_pBitmapFileHeader->bfSize = m_pBitmapFileHeader->bfOffBits+m_FileLength;
m_pBitmapFileHeader->bfReserved1 = 0;
m_pBitmapFileHeader->bfReserved2 = 0;

m_pBitmapInfoHeader->biBitCount = 8;
m_pBitmapInfoHeader->biClrImportant = 0;
m_pBitmapInfoHeader->biClrUsed = 0;
m_pBitmapInfoHeader->biCompression = BI_RGB;
m_pBitmapInfoHeader->biHeight = lHeight;
m_pBitmapInfoHeader->biWidth = lWidth;
m_pBitmapInfoHeader->biPlanes = 1;
m_pBitmapInfoHeader->biSize  = 40;
m_pBitmapInfoHeader->biSizeImage = lHeight*LineBits;
m_pBitmapInfoHeader->biXPelsPerMeter = 3799;
m_pBitmapInfoHeader->biYPelsPerMeter = 3799;

m_pBitmapInfo = (BITMAPINFO *) (m_pBitmapInfoHeader);
m_pBitmapInfo->bmiHeader = *m_pBitmapInfoHeader;

for( int i=0;i<256;i++ )
{
  m_pRGBQuad[i].rgbBlue= i;
  m_pRGBQuad[i].rgbGreen = i;
  m_pRGBQuad[i].rgbRed =i;
  m_pRGBQuad[i].rgbReserved = 0;
}
}

在OnDraw调用
void CCreatBMPView::OnDraw(CDC* pDC)
{
CCreatBMPDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
lpDIBBits = pDoc->lpBits;
lWidth = pDoc->lWidth;
lHeight = pDoc->lHeight;
Length = pDoc->Length;
m_pBitmapInfo = pDoc->m_pBitmapInfo;


if( lpDIBBits )
{
  StretchDIBits(pDC->m_hDC,
   0, 0, lWidth, lHeight,
   0, 0, lWidth, lHeight,
   lpDIBBits, m_pBitmapInfo, DIB_RGB_COLORS, SRCCOPY);
  SetScrollSizes(MM_TEXT, CSize(lWidth, lHeight));
}

 


}
即可完成显示。
第三步设置保存。
void CCreatBMPDoc::OnFileSaveAs()
{
CString pFilePath;
CFileDialog filedlg(FALSE,"*.bmp",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  "Bitmap Files (*.bmp)|*.bmp||",NULL);

filedlg.DoModal();
pFilePath = filedlg.GetPathName();

Store((LPCTSTR) pFilePath);

delete filedlg;

}
void Store(LPCTSTR lpszPathName)
{
CFile file;
file.Open((LPCTSTR) lpszPathName,
  CFile::modeCreate|CFile::modeReadWrite,NULL);

file.SeekToBegin();
CreatInfo();
CString str;
file.Write(lpHead,m_FileLength);

file.Close();
}

至此完成bmp图象的创建显示和保存。
时间仓促难免有错误,请大家指正。
以上只是主要算法,经编译通过。
没有写上变量的初始化以及内存的释放,这点请大家注意。
如有疑问可以联系puhuofeie@hotmail.com