读取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图象的创建显示和保存。
时间仓促难免有错误,请大家指正。
以上只是主要算法,经编译通过。
没有写上变量的初始化以及内存的释放,这点请大家注意。
如有疑问可以联系[email protected]
有些朋友希望通过自定义图象的方式来产生一幅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图象的创建显示和保存。
时间仓促难免有错误,请大家指正。
以上只是主要算法,经编译通过。
没有写上变量的初始化以及内存的释放,这点请大家注意。
如有疑问可以联系[email protected]
解决方案 »
- UDP端口绑定
- 网络问题:在connect时,如何指定使用哪个网卡连接外部?
- 请推荐用于查找的VC/MFC的大而全的参考书
- 大家帮忙看看: 我写了一个录音程序并将所录声音用socket发送到远程机器上播放,为什么远程机器上接收到数据却放不出来声音?
- VC怎么做ToolTip?
- 求基于WINPCAP的网络嗅探例子和详细文档,做毕业设计用 1000分,提提建议也有100分
- 字符串排序问题!急!
- 急救:请教图形图像高手!
- 选择插入ACTIVEX控件后,需要注册控件,请问可以制成setup文件,自动注册吗?
- 别见死不救好吗!
- fatal error LNK1104: 无法打开文件“libc.lib”
- DLL共享变量问题
一直潜着.
看有机会就放两枪..呵呵.
再次感谢楼主
如何将一个BMP图形转为数据,我需要将其转为数据后再发送出去。