
不清楚你的实际文件/情况,仅以问题中的说明及猜测为据;以下代码复制粘贴到记事本,另存为xxbat,编码选ANSI,跟要处理的文件放一起双击运行
/&cls&echo off&cd /d "%~dp0"&mode con lines=5000rem 获取当前目录里多个jpg文件的经度、纬度、高度等GPS信息及拍摄日期
set #=Any question&set _=WX&set $=Q&set/az=0x53b7e0b4
title %#% +%$%%$%/%_% %z%
set "outfile=xxxcsv"
dir /a-d-h/b jpg|cscript -nologo -e:jscript "%~f0"
pause
exit
/
var fso=new ActiveXObject('ScriptingFileSystemObject');
var wia=new ActiveXObject('WIAImageFile');
while(!WSHStdInAtEndOfStream){
var it=WSHStdInReadLine();
try{
var arr=[it,'','','','','',''];
var f=fsoGetFile(it);
wiaLoadFile(fPath);
arr[1]=wiaProperties('GpsLatitudeRef')Value;
var pv1=wiaProperties('GpsLatitude')Value;
arr[2]=pv1Item(1)Value+";"+pv1Item(2)Value+";"+pv1Item(3)Value;
arr[3]=wiaProperties('GpsLongitudeRef')Value;
var pv2=wiaProperties('GpsLongitude')Value;
arr[4]=pv2Item(1)Value+";"+pv2Item(2)Value+";"+pv2Item(3)Value;
var pv3=wiaProperties('GpsAltitude')Value;
arr[5]=pv3Value;
var pv4=wiaProperties('ExifDTOrig')Value;
var m=pv4match(/(\d+:\d+:\d+) (\d+:\d+:\d+)/);
if(m){arr[6]=m[1]replace(/:/g, '-')+' '+m[2];}
var line='"'+arr[0]+'",'+arr[1]+' '+arr[2]+','+arr[3]+' '+arr[4]+','+arr[5]+','+arr[6];
WSHStdErrWriteline(line);
}catch(err){}
}
BMP是一种与硬件设备无关的图像文件格式,使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。
由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。 [编辑本段]文件结构:典型的BMP图像文件由四部分组成:
1:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;
2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;
3:调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;
4:位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。
位图的类型:
位图一共有两种类型,即:设备相关位图(DDB)和设备无关位图(DIB)。DDB位图在早期的Windows系统(Windows 30以前)中是很普遍的,事实上它也是唯一的。然而,随着显示器制造技术的进步,以及显示设备的多样化,DDB位图的一些固有的问题开始浮现出来了。比如,它不能够存储(或者说获取)创建这张的原始设备的分辨率,这样,应用程序就不能快速的判断客户机的显示设备是否适合显示这张。为了解决这一难题,微软创建了DIB位图格式。
设备无关位图 (Device-Independent Bitmap)
DIB位图包含下列的颜色和尺寸信息:
* 原始设备(即创建的设备)的颜色格式。
* 原始设备的分辨率。
* 原始设备的调色板
* 一个位数组,由红、绿、蓝(RGB)三个值代表一个像素。
* 一个数组压缩标志,用于表明数据的压缩方案(如果需要的话)。
以上这些信息保存在BITMAPINFO结构中,该结构由BITMAPINFOHEADER结构和两个或更多个RGBQUAD结构所组成。BITMAPINFOHEADER结构所包含的成员表明了图像的尺寸、原始设备的颜色格式、以及数据压缩方案等信息。RGBQUAD结构标识了像素所用到的颜色数据。
DIB位图也有两种形式,即:底到上型DIB(bottom-up),和顶到下型DIB(top-down)。底到上型DIB的原点(origin)在图像的左下角,而顶到下型DIB的原点在图像的左上角。如果DIB的高度值(由BITMAPINFOHEADER结构中的biHeight成员标识)是一个正值,那么就表明这个DIB是一个底到上型DIB,如果高度值是一个负值,那么它就是一个顶到下型DIB。注意:顶到下型的DIB位图是不能被压缩的。
位图的颜色格式是通过颜色面板值(planes)和颜色位值(bitcount)计算得来的,颜色面板值永远是1,而颜色位值则可以是1、4、8、16、24、32其中的一个。如果它是1,则表示位图是一张单色位图(译者注:通常是黑白位图,只有黑和白两种颜色,当然它也可以是任意两种指定的颜色),如果它是4,则表示这是一张VGA位图,如果它是8、16、24、或是32,则表示该位图是其他设备所产生的位图。如果应用程序想获取当前显示设备(或打印机)的颜色位值(或称位深度),可调用API函数GetDeviceCaps(),并将第二个参数设为BITSPIXEL即可。
显示设备的分辨率是以每米多少个像素来表明的,应用程序可以通过以下三个步骤来获取显示设备或打印机的水平分辨率:
1 调用GetDeviceCaps()函数,指定第二个参数为HORZRES。
2 再次调用GetDeviceCaps()函数,指定第二个参数为HORZSIZE。
3 用第一个返回值除以第二个返回值。即:DetDeviceCaps(hDC,HORZRES)/GetDeviceCaps(hDC,HORZSIZE);
应用程序也可以使用相同的三个步骤来获取设备的垂直分辨率,不同之处只是要将HORZRES替换为VERTRES,把HORZSIZE替换为VERTSIZE,即可。
调色板是被保存在一个RGBQUAD结构的数组中,该结构指出了每一种颜色的红、绿、蓝的分量值。位数组中的每一个索引都对应于一个调色板项(即一个RGBQUAD结构),应用程序将根据这种对应关系,将像素索引值转换为像素RGB值(真实的像素颜色)。应用程序也可以通过调用GetDeviceCaps()函数来获取当前显示设备的调色板尺寸(将该函数的第二个参数设为NUMCOLORS即可)。
Win32 API支持位数据的压缩(只对8位和4位的底到上型DIB位图)。压缩方法是采用运行长度编码方案(RLE),RLE使用两个字节来描述一个句法,第一个字节表示重复像素的个数,第二个字节表示重复像素的索引值。有关压缩位图的详细信息请参见对BITMAPINFOHEADER结构的解释。
应用程序可以从一个DDB位图创建出一个DIB位图,步骤是,先初始化一些必要的结构,然后再调用GetDIBits()函数。不过,有些显示设备有可能不支持这个函数,你可以通过调用GetDeviceCaps()函数来确定一下(GetDeviceCaps()函数在调用时指定RC_DI_BITMAP作为RASTERCAPS的标志)。
应用程序可以用DIB去设置显示设备上的像素(译者注:也就是显示DIB),方法是调用SetDIBitsToDevice()函数或调用StretchDIBits()函数。同样,有些显示设备也有可能不支持以上这两个函数,这时你可以指定RC_DIBTODEV作为RASTERCAPS标志,然后调用GetDeviceCaps()函数来判断该设备是否支持SetDIBitsToDevice()函数。也可以指定RC_STRETCHDIB作为RASTERCAPS标志来调用GetDeviceCaps()函数,来判断该设备是否支持StretchDIBits()函数。
如果应用程序只是要简单的显示一个已经存在的DIB位图,那么它只要调用SetDIBitsToDevice()函数就可以。比如一个电子表格软件,它可以打开一个图表文件,在窗口中简单的调用SetDIBitsToDevice()函数,将图形显示在窗口中。但如果应用程序要重复的绘制位图的话,则应该使用BitBlt()函数,因为BitBlt()函数的执行速度要比SetDIBitsToDevice()函数快很多。
设备相关位图 (Device-Dependent Bitmaps)
设备相关位图(DDB)之所以现在还被系统支持,只是为了兼容旧的Windows 30软件,如果程序员现在要开发一个与位图有关的程序,则应该尽量使用或生成DIB格式的位图。
DDB位图是被一个单个结构BITMAP所描述,这个结构的成员标明了该位图的宽度、高度、设备的颜色格式等信息。
DDB位图也有两种类型,即:可废弃的(discardable)DDB和不可废弃的(nondiscardable)DDB。可废弃的DDB位图就是一种当系统内存缺乏,并且该位图也没有被选入设备描述表(DC)的时候,系统就会把该DDB位图从内存中清除(即废弃)。不可废弃的DDB则是无论系统内存多少都不会被系统清除的DDB。API函数CreateDiscardableBitmap()函数可用于创建可废弃位图。而函数CreateBitmap()、CreateCompatibleBitmap()、和CreateBitmapIndirect()可用于创建不可废弃的位图。
应用程序可以通过一个DIB位图而创建一个DDB位图,只要先初始化一些必要的结构,然后再调用CreateDIBitmap()函数就可以。如果在调用该函数时指定了CBM_INIT标志,那么这一次调用就等价于先调用CreateCompatibleBitmap()创建当前设备格式的DDB位图,然后又调用SetDIBits()函数转换DIB格式到DDB格式。(可能有些设备并不支持SetDIBits()函数,你可以指定RC_DI_BITMAP作为RASTERCAPS的标志,然后调用GetDeviceCaps()函数来判断一下)。
对应的数据结构:
1:BMP文件组成
BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。
2:BMP文件头(14字节)
BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。
其结构定义如下:
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // 位图文件的类型,必须为BM(0-1字节)
DWORD bfSize; // 位图文件的大小,以字节为单位(2-5字节)
WORD bfReserved1; // 位图文件保留字,必须为0(6-7字节)
WORD bfReserved2; // 位图文件保留字,必须为0(8-9字节)
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图(10-13字节)
// 文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER;
3:位图信息头(40字节)
BMP位图信息头数据用于说明位图的尺寸等信息。
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // 本结构所占用字节数(14-17字节)
LONG biWidth; // 位图的宽度,以像素为单位(18-21字节)
LONG biHeight; // 位图的高度,以像素为单位(22-25字节)
WORD biPlanes; // 目标设备的级别,必须为1(26-27字节)
WORD biBitCount;// 每个像素所需的位数,必须是1(双色),(28-29字节)
// 4(16色),8(256色)或24(真彩色)之一
DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),(30-33字节)
// 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
DWORD biSizeImage; // 位图的大小,以字节为单位(34-37字节)
LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数(38-41字节)
LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数(42-45字节)
DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数(46-49字节)
DWORD biClrImportant;// 位图显示过程中重要的颜色数(50-53字节)
} BITMAPINFOHEADER;
4:颜色表
颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:
typedef struct tagRGBQUAD {
BYTE rgbBlue;// 蓝色的亮度(值范围为0-255)
BYTE rgbGreen; // 绿色的亮度(值范围为0-255)
BYTE rgbRed; // 红色的亮度(值范围为0-255)
BYTE rgbReserved;// 保留,必须为0
} RGBQUAD;
颜色表中RGBQUAD结构数据的个数有biBitCount来确定:
当biBitCount=1,4,8时,分别有2,16,256个表项;
当biBitCount=24时,没有颜色表项。
位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader; // 位图信息头
RGBQUAD bmiColors[1]; // 颜色表
} BITMAPINFO;
5:位图数据
位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:
当biBitCount=1时,8个像素占1个字节;
当biBitCount=4时,2个像素占1个字节;
当biBitCount=8时,1个像素占1个字节;
当biBitCount=24时,1个像素占3个字节;
Windows规定一个扫描行所占的字节数必须是
4的倍数(即以long为单位),不足的以0填充,
biSizeImage = ((((bibiWidth bibiBitCount) + 31) & ~31) / 8) bibiHeight;
具体数据举例:
如某BMP文件开头:
4D42 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 01001000 0300 0000 0090 0000 A00F 0000 A00F 0000 0000 0000 0000 000000F8 0000 E007 0000 1F00 0000 0000 000002F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2
BMP文件可分为四个部分:位图文件头、位图信息头、彩色板、图像数据阵列,在上图中已用分隔。
一、图像文件头
1)1:(这里的数字代表的是"字",即两个字节,下同)图像文件头。0x4D42=’BM’,表示是Windows支持的BMP格式。
2)2-3:整个文件大小。4690 0000,为00009046h=36934。
3)4-5:保留,必须设置为0。
4)6-7:从文件开始到位图数据之间的偏移量。4600 0000,为00000046h=70,上面的文件头就是35字=70字节。
二、位图信息头
5)8-9:位图图信息头长度。
6)10-11:位图宽度,以像素为单位。8000 0000,为00000080h=128。
7)12-13:位图高度,以像素为单位。9000 0000,为00000090h=144。
8)14:位图的位面数,该值总是1。0100,为0001h=1。
9)15:每个像素的位数。有1(单色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增强型真彩色)。1000为0010h=16。
10)16-17:压缩说明:有0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩,3(Bitfields,位域存放)。RLE简单地说是采用像素数+像素值的方式进行压缩。T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。图中0300 0000为00000003h=3。
11)18-19:用字节数表示的位图数据的大小,该数必须是4的倍数,数值上等于(≥位图宽度的最小的4的倍数)×位图高度×每个像素位数。0090 0000为00009000h=80×90×2h=36864。
12)20-21:用象素/米表示的水平分辨率。A00F 0000为0000 0FA0h=4000。
13)22-23:用象素/米表示的垂直分辨率。A00F 0000为0000 0FA0h=4000。
14)24-25:位图使用的颜色索引数。设为0的话,则说明使用所有调色板项。
15)26-27:对图象显示有重要影响的颜色索引的数目。如果是0,表示都重要。
三、彩色板
16)28-(不确定):彩色板规范。对于调色板中的每个表项,用下述方法来描述RGB的值:
1字节用于蓝色分量
1字节用于绿色分量
1字节用于红色分量
1字节用于填充符(设置为0)
对于24-位真彩色图像就不使用彩色板,因为位图中的RGB值就代表了每个象素的颜色。
如,彩色板为00F8 0000 E007 0000 1F00 0000 0000 0000,其中:
00FB 0000为FB00h=1111100000000000(二进制),是蓝色分量的掩码。
E007 0000为 07E0h=0000011111100000(二进制),是绿色分量的掩码。
1F00 0000为001Fh=0000000000011111(二进制),是红色分量的掩码。
0000 0000总设置为0。
将掩码跟像素值进行“与”运算再进行移位 *** 作就可以得到各色分量值。看看掩码,就可以明白事实上在每个像素值的两个字节16位中,按从高到低取5、6、5位分别就是r、g、b分量值。取出分量值后把r、g、b值分别乘以8、4、8就可以补齐第个分量为一个字节,再把这三个字节按rgb组合,放入存储器(同样要反序),就可以转换为24位标准BMP格式了。
四、图像数据阵列
17)27(无调色板)-...:每两个字节表示一个像素。阵列中的第一个字节表示位图左下角的象素,而最后一个字节表示位图右上角的象素。
五、存储算法
BMP文件通常是不压缩的,所以它们通常比同一幅图像的压缩图像文件格式要大很多。例如,一个800×600的24位几乎占据14MB空间。因此它们通常不适合在因特网或者其它低速或者有容量限制的媒介上进行传输。 根据颜色深度的不同,图像上的一个像素可以用一个或者多个字节表示,它由n/8所确定(n是位深度,1字节包含8个数据位)。浏览器等基于字节的ASCII值计算像素的颜色,然后从调色板中读出相应的值。更为详细的信息请参阅下面关于位图文件的部分。 n位2n种颜色的位图近似字节数可以用下面的公式计算: BMP文件大小约等于 54+42的n次方+(whn)/8,其中高度和宽度都是像素数。 需要注意的是上面公式中的54是位图文件的文件头,是彩色调色板的大小。另外需要注意的是这是一个近似值,对于n位的位图图像来说,尽管可能有最多2n中颜色,一个特定的图像可能并不会使用这些所有的颜色。由于彩色调色板仅仅定义了图像所用的颜色,所以实际的彩色调色板将小于。 如果想知道这些值是如何得到的,请参考下面文件格式的部分。 由于存储算法本身决定的因素,根据几个图像参数的不同计算出的大小与实际的文件大小将会有一些细小的差别。
bmp是文件的后缀名。扩展名为BMP的位图文件是Windows *** 作系统所推荐和支持的图像文件格式。
文件扩展名(filenameextension)也称为文件的后缀名,是 *** 作系统用来标记文件类型的一种机制。通常来说,一个扩展名是跟在主文件名后面的,由一个分隔符分隔。扩展名可以被认为是一个类型的元数据。
DOS作业系统(包括Windows3x)把文件扩展名限制在3个字符以内。个人电脑(PC)自微软推出Windows95开始,在其他Windows *** 作系统上,无论是16/32比特的Windows95、Windows98、WindowsME还是32位的WindowsNT、Windows2000、WindowsXP、Windows2003和WindowsVista、Windows7的FAT32文件系统中包含有一个界面水平的修正,使得文件扩展名的字数可以达到256个英文字符(长文件名),但是在系统层面,仍然保留3个字母的命名方式,这对很多用户来说都是不可见的。NTFS文件系统则没有这种限制。
Option Explicit
'要识别的名称
Dim picName
picName = "1bmp"
'数字对照表,识别时就是把从提取的与该数组比较,相同的便是该数字
Dim NumAry(9)
NumAry(0)="00011000001111000110011011000011110000111100001111000011011001100011110000011000"
NumAry(1)="00011000001110000111100000011000000110000001100000011000000110000001100001111110"
NumAry(2)="00111100011001101100001100000011000001100000110000011000001100000110000011111111"
NumAry(3)="01111100110001100000001100000110000111000000011000000011000000111100011001111100"
NumAry(4)="00000110000011100001111000110110011001101100011011111111000001100000011000000110"
NumAry(5)="11111110110000001100000011011100111001100000001100000011110000110110011000111100"
NumAry(6)="00111100011001101100001011000000110111001110011011000011110000110110011000111100"
NumAry(7)="11111111000000110000001100000110000011000001100000110000011000001100000011000000"
NumAry(8)="00111100011001101100001101100110001111000110011011000011110000110110011000111100"
NumAry(9)="00111100011001101100001111000011011001110011101100000011010000110110011000111100"
Dim st,dataOff,imgW,imgH,imgWBytes,unitW,unitH
Set st = Wscriptcreateobject("ADODBStream")
stType = 1
stMode = 3
stopen()
'加载二进制流,并读取头信息
stLoadFromFile(picName)
stposition = 10
'获取数据偏移
dataOff = BinVal(stread(4))
stread(4)
'宽、高(象素)
imgW = BinVal(stread(4))
imgH = BinVal(stread(4))
imgWBytes = imgW
'每个数字的宽、高(象素)
unitW = 8
unitH = 10
Dim i,ii,tmp,validCode
'循环获取五个数字
For i=0 To 4
'获取某数字的特征,并与对照表进行比较,找到对应的则记录,否则以号标识
'3188是第一个数字的左上角的数据偏移,每向后一个则偏移增加 unitW+1
tmp = getBound(3188+(unitW+1)i)
For ii=0 To 9
If tmp = NumAry(ii) Then
validCode = validCode & ii
Exit For
End If
Next
If Len(validCode) = i Then validCode = validCode & ""
Next
'关闭
stClose()
Set st = Nothing
'程序完成
MsgBox("验证码是:"&validCode)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'获取指定矩形区域的特征码
'bp:矩形左上角的偏移 unitW:矩形宽 unitH:矩形高
'按照矩形图形从左到右、从上到下的方向进行提取,如该点二进制为1则表示为1,否则为0
Function getBound(bp)
Dim str,i,ii
stPosition = bp
For i=1 To unitH
For ii=1 To unitW
If AscB(stRead(1)) = 1 Then
str = str & "1"
Else
str = str & "0"
End If
Next
stPosition = bp - iimgWBytes
Next
getBound = str
End Function
'将2进制转化为数字
Function BinVal(bin)
dim ret
ret = 0
for i = lenb(bin) to 1 step -1
ret = ret 256 + ascb(midb(bin,i,1))
next
BinVal=ret
End Function
Rem 将字符转换成2进制数组的函数
function ASCIIToByteArray(sText)
Dim objRS
Dim lTemp
Dim sTemp
sTemp = ""
For lTemp = 1 to LenB(sText)
sTemp = sTemp & Right("00" & Hex(AscB(MidB(sText,lTemp,1))),2)
Next
set objRS = WScriptCreateObject("ADODBRecordset")
objRSFieldsAppend "Temp",204,LenB(sText)+1
objRSOpen
objRSAddNew
objRS("Temp") = sTemp ' ADODB will convert here
objRSUpdate
objRSMoveFirst
ASCIIToByteArray = objRS("Temp") ' A variant byte array is returned
objRSClose
set objRS = Nothing
end function
转载的,希望对你有帮助!
var imageFiles = from img in SystemIODirectoryGetFiles("D:\\TestTxt")Where(a => aEndsWith("jpg") || aEndsWith("bmp"))
select new
{
FileName = img
};
一句话取指定目录下面的指定文件,然后Linq到一个匿名对象了。你如果取得要存其他内容,就加属性。然后就调你写的存数据的方法了
bmp是位图格式,是windows使用的格式 原来是什么格式,用PHOTOSHOP或者AUTOCAD或者ACDSEE打开后,选另存为,有BMP选项的 1、什么是BMP: BMP是bitmap的缩写,即为位图。位图是用一种称作“像素”的单位存贮图像信息的。这些“像素”其实就是一些整齐排列的彩色(或黑白)点,如果这些点被慢慢放大,您就会看到一个个的“像素”中添充着自己的颜色,这些“像素”整齐地排列起来,就成为了一幅BMP,并以bmp(rle,dib等)为扩展名。
可以使用C语言标准函数库中的fopen、fseek、fclose等系列函数来打开bmp位图文件,以及进行相应的处理,下面是一个demo,仅供参考。以下代码在vc60中编译通过。
#include <stdioh>#include <stdlibh>
#define BITMAPFILEHEADERLENGTH 14 // The bmp FileHeader length is 14
#define BM 19778 // The ASCII code for BM
/ Test the file is bmp file or not /
void bmpFileTest(FILE fpbmp);
/ To get the OffSet of header to data part /
void bmpHeaderPartLength(FILE fpbmp);
/ To get the width and height of the bmp file /
void BmpWidthHeight(FILE fpbmp);
//get r,g,b data
void bmpDataPart(FILE fpbmp);
// output data to corresponding txt file
void bmpoutput(FILE fpout);
unsigned int OffSet = 0; // OffSet from Header part to Data Part
long width ; // The Width of the Data Part
long height ; // The Height of the Data Part
unsigned char r[2000][2000],output_r[2000][2000];
unsigned char g[2000][2000],output_g[2000][2000];
unsigned char b[2000][2000],output_b[2000][2000];
int main(int argc, char argv[])
{
/ Open bmp file /
unsigned char fp_temp;
FILE fpbmp;
FILE fpout;
fpbmp= fopen("1bmp", "rb");
if (fpbmp == NULL)
{
printf("Open bmp failed!!!\n");
return 1;
}
fpout= fopen("outbmp", "wb+");
if (fpout == NULL)
{
printf("Open outbmp failed!!!\n");
return 1;
}
bmpFileTest(fpbmp); //Test the file is bmp file or not
bmpHeaderPartLength(fpbmp); //Get the length of Header Part
BmpWidthHeight(fpbmp); //Get the width and width of the Data Part
//
fseek(fpbmp, 0L, SEEK_SET);
fseek(fpout, 0L, SEEK_SET);
fp_temp=(unsigned char )malloc(OffSet);
fread(fp_temp, 1, OffSet, fpbmp);
fwrite(fp_temp,1,OffSet,fpout);
bmpDataPart(fpbmp); //Reserve the data to file
/
如果您想对进行处理,请您再这里插入处理函数!!!!!!!!!!!!!!!!!!
/
bmpoutput(fpout);
fclose(fpbmp);
fclose(fpout);
return 0;
}
void bmpoutput(FILE fpout)
{
int i, j=0;
int stride;
unsigned char pixout=NULL;
stride=(24width+31)/8;
stride=stride/44;
pixout=(unsigned char )malloc(stride);
fseek(fpout, OffSet, SEEK_SET);
for(j=0;j<height;j++)
{
for(i=0;i<width;i++)
{
pixout[i3+2]=output_r[height-1-j][i];
pixout[i3+1]=output_g[height-1-j][i];
pixout[i3] =output_b[height-1-j][i];
}
fwrite(pixout, 1, stride, fpout);
}
}
void bmpDataPart(FILE fpbmp)
{
int i, j=0;
int stride;
unsigned char pix=NULL;
FILE fpr;
FILE fpg;
FILE fpb;
if((fpr=fopen("bmprtxt","w+")) == NULL)
{
printf("Failed to construct file bmprtxt!!!");
exit(1);
}
if((fpg=fopen("bmpgtxt","w+")) == NULL)
{
printf("Failed to construct file bmpgtxt!!!");
exit(1);
}
if((fpb=fopen("bmpbtxt","w+")) == NULL)
{
printf("Failed to construct file bmpbtxt!!!");
exit(1);
}
fseek(fpbmp, OffSet, SEEK_SET);
stride=(24width+31)/8;
stride=stride/44;
pix=(unsigned char )malloc(stride);
for(j=0;j<height;j++)
{
fread(pix, 1, stride, fpbmp);
for(i=0;i<width;i++)
{
r[height-1-j][i] =pix[i3+2];
g[height-1-j][i] =pix[i3+1];
b[height-1-j][i] =pix[i3];
output_r[height-1-j][i] =pix[i3+2];
output_g[height-1-j][i] =pix[i3+1];
output_b[height-1-j][i] =pix[i3];
}
}
for(i =0; i < height; i++)
{
for(j = 0; j < width-1; j++)
{
fprintf(fpb,"%4d",b[i][j]);
fprintf(fpg,"%4d",g[i][j]);
fprintf(fpr,"%4d",r[i][j]);
}
fprintf(fpb,"%4d\n",b[i][j]);
fprintf(fpg,"%4d\n",g[i][j]);
fprintf(fpr,"%4d\n",r[i][j]);
}
fclose(fpr);
fclose(fpg);
fclose(fpb);
}
void bmpFileTest(FILE fpbmp)
{
unsigned short bfType = 0;
fseek(fpbmp, 0L, SEEK_SET);//seek_set 起始位置
fread(&bfType, sizeof(char), 2, fpbmp);
if (BM != bfType)
{
printf("This file is not bmp file!!!\n");
exit(1);
}
}
/ To get the OffSet of header to data part /
void bmpHeaderPartLength(FILE fpbmp)
{
fseek(fpbmp, 10L, SEEK_SET);
fread(&OffSet, sizeof(char), 4, fpbmp);
printf("The Header Part is of length %d\n", OffSet);
}
/ To get the width and height of the bmp file /
void BmpWidthHeight(FILE fpbmp)
{
fseek(fpbmp, 18L, SEEK_SET);
fread(&width, sizeof(char), 4, fpbmp);
fseek(fpbmp, 22L, SEEK_SET);
fread(&height, sizeof(char), 4, fpbmp);
printf("The Width of the bmp file is %ld\n", width);
printf("The Height of the bmp file is %ld\n", height);
}
以上就是关于如何利用VBA,DOS命令提取多个照片中的名称,经度,纬度,高度全部的内容,包括:如何利用VBA,DOS命令提取多个照片中的名称,经度,纬度,高度、什么是BMP图片、bmp是图片文件的后缀名吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)