怎么建立位图文件
位图文件(BMP)

位图⽂件(BMP)位图⽂件简介BMP(Bitmap-File)格式是最常⽤的图像⽂件存取格式之⼀,是微软为其Windows环境设置的标准图像格式,BMP位图⽂件默认的⽂件扩展名是“.BMP”或者“.bmp”,有时它也会以“.DIB”或者“RLE”为扩展名。
⽤BMP格式存放的图像⼏乎可以被所有的图像显⽰软件读取。
BMP图形⽂件是Windows采⽤的图像⽂件格式,在Windows环境下运⾏的所有图像软件都⽀持BMP图像⽂件格式。
Windows系统内部个图像绘制操作都是以BMP为基础的。
Windows3.0以前的BMP⽂件格式与显⽰设备有关,因此把这种BMP图像⽂件格式称为设备相关位图(Device Dependent Bitmap,DDB)⽂件格式。
Windows3.0以后的BMP⽂件都与显⽰设备⽆关,因此把这种BMP⽂件格式称为设备⽆关位图(Device Independent Bitmap,DIB)格式。
BMP⽂件格式摘要每个BMP⽂件只能存放⼀张图像。
图像数据是否采⽤压缩⽅式存放,取决于⽂件的⼤⼩与格式,即压缩处理是BMP图像⽂件的⼀个选项,⽤户可以根据需要进⾏选择。
其中,⾮压缩格式是BMP图像⽂件所采⽤的⼀种通⽤格式,它按照⼀定的顺序忠实的记录图像中每⼀个像素的颜⾊值。
如果⽤户确定将BMP⽂件格式压缩处理,则Windows设计了⼀种压缩⽅式:如果位图为16⾊模式,则采⽤RLE4压缩⽅式,如果图像为256⾊模式,则采⽤RLE8压缩⽅式。
BMP图像数据⽂件格式可以存储为单⾊,16⾊,256⾊和真彩⾊四种图像数据,其数据的排列顺序与⼀般⽂件不同,它以图像的左下⾓作为起点存储图像,⽽不是以图像的坐上⾓为起点。
⽽且BMP图像⽂件格式中还存在另外⼀个与众不同的特点,即其调⾊板数据所采⽤的数据结构中,红,绿,蓝三种基⾊数据的排列顺序也恰好与其他图像⽂件格式相反。
总之,BMP图像⽂件格式拥有许多适合于Windows环境的新特⾊,⽽且随着Windows版本的不断更新,微软也在不断的改进BMP图像⽂件格式。
绘制BMP位图文件

绘制BMP位图文件BMP文件由三部分组成:有关文件信息的BITMAPFILEHEADER,有关位图信息的BITMAPINFO以及位图的图象数据。
其中BITMAPINFO又由位图信息头BITMAPINFOHEADER和颜色表组成,颜色表不是必须的。
几个结构的定义可查看联机帮助。
一旦把BMP位图读入内存后,只要用上一篇介绍的显示位图的方法就可以显示了。
函数1:装载位图文件,生成位图GDI对象,用DDB方法显示。
// LoadBMPImage - 装载BMP位图,创建位图GDI对象同时创建位图调色板// Returns - 返回TRUE成功// sBMPFile - 全路经BMP文件// bitmap - 将被初始化的位图对象// pPal - 将被初始化的位图调色板,可为NULLBOOL LoadBMPImage( LPCTSTR sBMPFile, CBitmap& bitmap, CPalette *pPal ) {CFile file;if( !file.Open( sBMPFile, CFile::modeRead) )return FALSE;BITMAPFILEHEADER bmfHeader;//读文件头if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) !=sizeof(bmfHeader))return FALSE;// 文件类型标志是否为‘BM’if (bmfHeader.bfType != ((WORD) ('M' << 8) | 'B'))return FALSE;//获得文件将需的内存数DWORD nPackedDIBLen = file.GetLength() -sizeof(BITMAPFILEHEADER);HGLOBAL hDIB= ::GlobalAlloc(GMEM_FIXED, nPackedDIBLen);if (hDIB == 0)return FALSE;// 读余下的位图文件if (file.ReadHuge((LPSTR)hDIB, nPackedDIBLen) != nPackedDIBLen ){::GlobalFree(hDIB);return FALSE;}BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;// 位图颜色数intnColors = bmiHeader.biClrUsed ? bmiHeader.biClrUsed :1<<bmiHeader.biBitCount;LPVOID lpDIBBits;if(bmInfo.bmiHeader.biBitCount> 8 )lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors + bmInfo.bmiHeader.biClrUsed) +((bmInfo.bmiHeader.biCompression ==BI_BITFIELDS) ? 3 : 0));elselpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);// 创建逻辑调色板if(pPal != NULL ){if(nColors<= 256 ){UINT nSize = sizeof(LOGPALETTE) +(sizeof(PALETTEENTRY) * nColors);LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];pLP->palVersion = 0x300;pLP->palNumEntries = nColors;for(int i=0; i <nColors; i++){pLP->palPalEntry[i].peRed =bmInfo.bmiColors[i].rgbRed;pLP->palPalEntry[i].peGreen =bmInfo.bmiColors[i].rgbGreen;pLP->palPalEntry[i].peBlue =bmInfo.bmiColors[i].rgbBlue;pLP->palPalEntry[i].peFlags = 0;}pPal->CreatePalette( pLP );delete[] pLP;}}CClientDCdc(NULL);CPalette* pOldPalette = NULL;if(pPal ){pOldPalette = dc.SelectPalette( pPal, FALSE );dc.RealizePalette();}HBITMAP hBmp = CreateDIBitmap( dc.m_hDC, // 设备句柄&bmiHeader, // pointer to bitmap size and format dataCBM_INIT, // initialization flaglpDIBBits, // pointer to initialization data&bmInfo, // pointer to bitmap color-format dataDIB_RGB_COLORS); //color-data usagebitmap.Attach(hBmp );if(pOldPalette )dc.SelectPalette(pOldPalette, FALSE );::GlobalFree(hDIB);return TRUE;}函数2:装载位图文件,生成位图设备句柄,用DIB方法显示。
BMP位图文件结构及操作

---- 2. 申请内存空间用于存放位图文件
---- GlobalAlloc(GHND,FileLength);
---- 3. 位图文件读入所申请内存空间中
---- LoadFileToMemory( mpBitsSrc,mFileName);
---- 4. 在OnPaint等函数中用DrawDibRealize(),DrawDibDraw()显示位图
typedef struct tagRGBQUAD {
BYTErgbBlue;// 蓝色的亮度(值范围为0-255)
BYTErgbGreen; // 绿色的亮度(值范围为0-255)
BYTErgbRed; // 红色的亮度(值范围为0-255)
BYTErgbReserved;// 保留,必须为0
---- 三、BMP位图缩放显示
---- 用DrawDib视频函数来显示位图,内存占用少,速度快,而且还可以对图形进行淡化(Dithering )处理。淡化处理是一种图形算法,可以用来在一个支持比图像所用颜色要少的设备上显示彩色图像。BMP位图显示方法如下:
---- 1. 打开视频函数DrawDibOpen(),一般放在在构造函数中
DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数
DWORD biClrImportant;// 位图显示过程中重要的颜色数
} BITMAPINFOHEADER;
---- 4. 颜色表
---- 颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:
>biHeight, SRCCOPY);
创建位图

//////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
// int bpl = (nwidth*8+31)/32*4;
// int imageSize = nheight*bpl;
int iBMPPitch = (nwidth *bit +31) /32 *4;
int iSrcPitch = nwidth *bit /8;
// int pline=WIDTHBYTES(nwidth*8);
if(fBMP == INVALID_HANDLE_VALUE)
{
return;
}
DWORD dwWritten = 0;
WriteFile(fBMP, &bfh, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
}
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
bih.biClrUsed = 0;
bih.biClrImportant = 0;
BYTE* imgData = NULL;
if(bit == 24)
{
imgData = new BYTE[bih.biSizeImage];
ZeroMemory((void*)imgData, bih.biSizeImage);
BYTE* pSrc = buffer;
第28章 创建和编辑位图

“大小”:设置刷子笔尖的大小。 “边缘”:指定刷子笔尖的柔度。 “形状”:设置圆形或方形刷子笔尖形状。 “强度”:设置模糊或锐化量。 (3)在要模糊的像素上拖动工具。 注意:按住Alt键可以切换工具的行为。
6.锐化工具 锐化工具对于修复存在扫描问题或聚焦不准的照片很有用,它是用来将图像相邻 颜色的反差加大,使图像的边缘更锐利。锐化工具的使用方法和模糊工具的使用 方法相同。其属性面板也一样。用鼠标在图像内反复拖动,即可锐化图像。 7.涂抹工具 使用涂抹工具可以使图像产生涂抹的效果,其操作如下: (1)选择涂抹工具。 (2)在属性面板中设置工具选项,其属性面板如图所示,各项含义如下:
3.替换颜色工具 “替换颜色”工具可以选择一种颜色,并用另外一种颜色覆盖此颜色进行绘画。 若要使用颜色样本用一种颜色替换另一种颜色,操作步骤如下: (1)选择“替换颜色”工具。 (2)在“属性”面板的“源色”框中,单击“样本”,如图所示。
(3)单击“源色”选色表选择颜色样,并从弹出菜单中选择一种颜色以指定要替 换的颜色。 (4)单击“属性”面板中的“替换色”选色表,并从弹出菜单中选择一种颜色。 (5)在“属性”检查器中设置其他笔触属性。各选项的含义如下。 “大小”设置刷子笔尖的大小。 “形状”设置圆形或方形刷子笔尖形状。 “容差”确定要替换的颜色范围(0 表示只替换“替换色”颜色;255 表示替换所 有与“替换色”颜色相似的颜色)。 “强度”确定将替换多少“更改”颜色。 “彩色化”用“替换色”颜色替换“更改”颜色。取消选择“彩色化”可以用 “更改”颜色对“源色”颜色进行涂染,并保持一部分“更改”颜色不变。 (6)将该工具拖动到要替换的颜色上。
1.利用其他软件(例如Photoshop)中的图像创建新位图图像 (1)将其他软件中的图像或部分图像复制到剪贴板中。 (2)执行“编辑/粘贴”菜单命令。 2.利用Fireworks中的图像创建新位图图像 (1)使用选取框工具或其他创建选区的工具在画布中创建一 个选区。 (2)执行“编辑/复制/剪切”菜单命令。 (3)执行“编辑/插入/通过复制创建位图或通过剪切创建位 图”菜单命令,即可将选区中所选图像插入到一个新位图图 层中。
位图文件(BMP)格式分析以及程序实现

inf.read((char*)&header, sizeof(header));if(header.bfType != 0x4D42)return false;这个很简单,没有什么好说的。
2、加载位图信息头//Load the image information headerBITMAPINFOHEADER infoheader;memset(&infoheader, 0, sizeof(infoheader));inf.read((char*)&infoheader, sizeof(infoheader));m_iImageWidth = infoheader.biWidth;m_iImageHeight = infoheader.biHeight;m_iBitsPerPixel = infoheader.biBitCount;这里我们得到了3各重要的图形属性:宽,高,以及每个像素颜色所占用的位数。
3、行对齐由于Windows在进行行扫描的时候最小的单位为4个字节,所以当图片宽X 每个像素的字节数!= 4的整数倍时要在每行的后面补上缺少的字节,以0填充(一般来说当图像宽度为2的幂时不需要对齐)。
位图文件里的数据在写入的时候已经进行了行对齐,也就是说加载的时候不需要再做行对齐。
但是这样一来图片数据的长度就不是:宽X 高X 每个像素的字节数了,我们需要通过下面的方法计算正确的数据长度://Calculate the image data sizeint iLineByteCnt = (((m_iImageWidth*m_iBitsPerPixel) + 31) >> 5) << 2;m_iImageDataSize = iLineByteCnt * m_iImageHeight;4、加载图片数据对于24位和32位的位图文件,位图数据的偏移量为sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER),也就是说现在我们可以直接读取图像数据了。
点位图生成方式

点位图生成方式1、将野外搜集数据导出,放入电子表格,只需要横坐标、纵坐标和点号。
顺序为:横坐标、纵坐标、点号。
2、把横纵坐标转化和GIS匹配。
例如:1/5万将横纵坐标都除以50。
3、将转化后的坐标复制到另一个工作表,在第一行插入notgrid。
4、把工作表另存为逗号分隔格式,再用记事本打开所存的逗号分隔的文件,将notgrid后的两个逗号去掉。
5、再另存为det文件,在GIS空间分析DTM分析中打开所存的det文件,在工具栏中单击高程点标注,设置点参数。
6、将该文件另存点文件。
7、在GIS图形处置输入编辑中打开,删除不需要的点文件,然后保留。
8、感动工作图,把保留后的点文件添加即可。
Mapsource与Excel、Mapgis相结合在化探工作中的应用摘要:目前GPS、Mapsource、Mapgis、Excel等已在地质工作中取得普遍的应用。
本文通过论述手持GPS坐标数据经mapsource、Excel进行转换和整理;利用Mapgis地理分析系统中的空间分析模型子系统、投影变换模型子系统及输入编辑子模型系统,实现化探测点自动标注、化探异样图的自动圈定。
拓展了Mapgis在地质工作中的应用空间,极大的方便了地质人员野外工作,减少人为误差,提高了工作效率。
关键词:GPS;Mapsource;Mapgis;Excel;地球化学测量中图分类号:文献标识码:矿产地质普查中常常需要进行一系列地球化学测量工作,从而形成大量的分析数据。
如何借助于运算机对这些数据进行处置,编制相应的地球化学图件,一直以来都是野外生产一线地质人员所追求的目标。
本文表达的是作者在利用mapsource、Excel、mapgis软件处置化探数据,编制相关地球化学图件进程中的一点体会和体会,供同行们参考。
不妥的地方请批评指正。
1.地球化学勘查经常使用图件图1 Mapsource中的单位设置Fig.1 In Mapsource unit establishment地球化学勘查的要紧图件有[一、2]:实际材料图、原始数据图、符号图、直方图、等值线图、地球化学剖面图、地球化学平面剖面图、地球化学异样图(单元素、多元素)、推断解译图、综合异样图等10种图件。
SharpDX之Direct2D教程II——加载位图文件和保存位图文件

绘制位图是绘制操作的不可缺少的一部分。
在Direct2D中绘制位图,必须先利用WIC组件将位图加载到内存中,再绘制到RenderTarget中去在SharpDX中绘制位图,分成两个部分:利用WIC在SharpDX中加载位图,生成Bitmap对象利用RenderTarget对象的DrawBitmap方法把Bitmap对象绘制到RenderTarget中去利用WIC在SharpDX中加载位图文件利用WIC在SharpDX中绘制位图文件的核心内容就是把位图文件转换为Bitmap对象。
它的操作过程如下:1、创建WIC的ImagingFactory类。
2、根据位图文件创建BitmapDecoder对象(实际上调用系统解码器解析位图文件)。
BitmapDecoder对象有1个属性和1个函数FrameCount属性:只读属性,说明该位图对象包含的帧数。
一般gif文件能包含多个帧,其余格式的一般只有1个帧GetFrame函数:返回指定帧对象。
参数index是整形,说明是第几帧(从0开始)。
返回的是BitmapFrameDecode对象3、利用BitmapDecoder对象的GetFrame函数,返回指定帧的BitmapFrameDecode对象。
(参数index一般是0,返回第1帧)一般情况下,到此就可以了。
但是,位图格式有很多,你可能不是很确定你的位图格式是否兼容SharpDX的Bitmap对象。
因此,比较好的做法是继续下面的步骤,将位图格式转换为兼容SharpDX 的Bitmap对象4、创建FormatConverter对象。
该对象负责进行格式转换。
5、调用FormatConverter对象的Initialize方法,进行格式转换。
6、最后,利用Bitmap对象的FromWicBitmap函数将之前的FormatConverter对象转换为SharpDX的Bitmap对象和Windows API Code Pack 1.1中的Direct2D略有不同的是,BitmapFrameDecode对象和FormatConverter对象都继承BitmapSource对象,省去了一个转换的过程下面是代码Protected Function LoadBitmap(Render As D2D.RenderTarget, File As String, FrameIndex As Integer) As D2D.BitmapDim Decoder As New WIC.BitmapDecoder(_ImagingFactory, File,DX.IO.NativeFileAccess.Read, WIC.DecodeOptions.CacheOnLoad)If FrameIndex > Decoder.FrameCount - 1 OrElse FrameIndex <0 Then FrameIndex = 0Dim Source As WIC.BitmapFrameDecode = Decoder.GetFrame(FrameIndex)Dim Converter As New WIC.FormatConverter(_ImagingFactory)Converter.Initialize(Source, WIC.PixelFormat.Format32bppPBGRA)Return D2D.Bitmap.FromWicBitmap(Render, Converter)End Function利用RenderTarget对象的DrawBitmap方法把Bitmap对象绘制到RenderTarget中去下面是DrawBitmap方法的原型定义:Public Sub DrawBitmap(bitmap As D2D.Bitmap,destinationRectangle As DX.RectangleF, opacity As Single,interpolationMode As D2D.BitmapInterpolationMode,sourceRectangle As DX.RectangleF)Public Sub DrawBitmap(bitmap As D2D.Bitmap, opacity As Single, interpolationMode As D2D.BitmapInterpolationMode)Public Sub DrawBitmap(bitmap As D2D.Bitmap,destinationRectangle As DX.RectangleF, opacity As Single,interpolationMode As D2D.BitmapInterpolationMode)Public Sub DrawBitmap(bitmap As D2D.Bitmap, opacity As Single, interpolationMode As D2D.BitmapInterpolationMode,sourceRectangle As DX.RectangleF)参数的意义如下:bitmap:要绘制的Bitmap对象destinationRectangle:绘制在RenderTarget对象上的目标范围。