读取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
- 读取txt文档创建位图
- MFC创建读取txt文档Dialog
- txt文本文档的创建和读取
- VBA 读取数据创建选择分支,输出txt文档
- python(一)读取外包txt文档,并创建数据
- matlab txt文档读取
- java读取txt文档
- Android 读取txt文档
- TXT文档读取
- java读取txt文档
- 读取txt文档
- C读取txt文档
- 读取txt文档并分页
- 使用oledb读取txt文档
- 读取txt文档并分页
- JavaScript 读取、写入Txt文档
- JavaScript 读取、写入Txt文档
- matlab读取txt文档行数
- 谈谈面向对象
- 什么是脚本语言
- 關於Eclipse的提示 The serializable class XXXXXX does not declare a static final serialVersionUID field of type long
- GetClientRect,ClientToScreen,ClipCursor
- 以前的东西
- 读取txt文档创建位图
- 感伤
- 各科复习指南
- 关于嵌入式系统方向
- 在vs.net 2003中编译ns2(5):编译ns2
- JS应用(资料很全)
- 完全无法集中精力
- 矢量图形技术
- 理解Asp.net中的View state