怎么建立位图文件
- 格式:doc
- 大小:23.50 KB
- 文档页数:1
位图⽂件(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文件由三部分组成:有关文件信息的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方法显示。
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种图件。
绘制位图是绘制操作的不可缺少的一部分。
在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对象上的目标范围。
CAD教程:位图插入与剪贴处理在CAD设计过程中,我们经常需要将位图插入到绘图中,并进行一些剪贴处理。
本教程将介绍如何在AutoCAD软件中实现位图插入与剪贴处理的基本操作步骤和常用技巧。
第一步:位图插入1. 打开AutoCAD软件,新建一个绘图文件。
2. 在插入选项卡中的“参考”面板上,点击“图像”图标,或在命令行中输入“image”,然后按回车键。
3. 弹出的“插入图像”对话框中,点击“浏览”按钮,选择要插入的位图文件并点击“打开”。
4. 在“插入图像”对话框中,设置插入的位置和尺寸,并点击“确定”按钮。
可以直接点击确定,使用默认设置。
5. 位图将被插入到绘图中,根据需要可以通过移动、缩放和旋转等操作调整位图的位置和大小。
第二步:位图剪贴1. 选中要进行剪贴处理的位图,点击“修改”选项卡中的“图像”面板上的“剪贴”图标,或在命令行中输入“clip”,然后按回车键。
2. 在命令行中提示选择剪贴边界的方式时,选择“矩形”或“多边形”。
3. 根据选择的方式,用鼠标指定矩形或多边形的边界点,然后按回车键确认。
4. 位图将被剪贴为指定的边界形状。
常用技巧:1. 位图插入的比例:在插入图像对话框中,可以设置插入的比例。
默认情况下,CAD会尝试将位图按原始比例插入。
如果需要按比例缩放,可以先勾选“锁定纵横比”选项,然后设置缩放比例。
2. 位图的位置和大小调整:插入位图后,可以使用移动、缩放和旋转等操作调整位图的位置和大小。
选中位图后,点击“修改”选项卡中的“修改”面板上的相应操作图标,或在命令行中输入相应的命令进行操作。
3. 多次剪贴处理:可以多次使用“剪贴”命令进行位图的进一步处理。
根据需要可以选择不同的剪贴边界形状,并重复执行剪贴命令。
4. 剪贴设置:在剪贴操作中,可以根据需要设置剪贴的边界形状和是否保留原始位图。
在命令行中输入“设置”命令,打开“选项”对话框,点击“解图像”选项卡,在“剪切设置”中进行设置。