精华内容
下载资源
问答
  • 如完打开word文件同时要打开某个文件的功能,必须要自己编写一段称之为宏的脚本。具体做法是在“工具”菜单“宏”-“宏”弹出的对话框输入宏名,然后按“创建”按钮会打开visual basic编辑器,你就可以编程了,这个...
  • 调整EXCEL文档格式+NPOI

    千次阅读 2009-10-12 14:20:00
    首先是文件格式的说明文档,你可以去微软的官方网站下载: http://www.microsoft.com/interop/docs/officebinaryformats.mspx 接着是,我和Huseyin共同开发了POIFS Browser,目前的版本是1.2,已经能够识别Excel ...

    private void button1_Click(object sender, EventArgs e)
            {
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
                    Microsoft.Office.Interop.Excel.Worksheet excelWs;
                    Microsoft.Office.Interop.Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(openFileDialog1.FileName,
                    Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                    Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                    Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                    Type.Missing, Type.Missing);

                    excelWs = (Microsoft.Office.Interop.Excel.Worksheet)excelWorkbook.Worksheets.get_Item(1);//取得第一個sheet

                    #region 設定小大位置
                    excelWs.Cells.VerticalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignTop; //垂直調準
                    excelWs.Cells.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignLeft;//水平調準
                    excelWs.Cells.EntireRow.AutoFit(); //自動調整列高
                    excelWs.Cells.EntireColumn.AutoFit(); //自動調整欄寬
                    #endregion

                    #region 設定顏色
                    excelWs.get_Range("B:B", Type.Missing).Font.Color = 255;
                    excelWs.get_Range("D:D", Type.Missing).Font.Color = 255;
                    excelWs.get_Range("E:J", Type.Missing).Font.Color = 255;
                    #endregion

                    #region 調整儲存格格式
                    excelWs.get_Range("B:B", Type.Missing).NumberFormatLocal = "@";
                    excelWs.get_Range("E:F", Type.Missing).NumberFormatLocal = "@";
                    excelWs.get_Range("I:J", Type.Missing).NumberFormatLocal = "@";
                    #endregion

                    ClearCom(excelWs);
                    excelWorkbook.Close(true, Type.Missing, Type.Missing);

                    ClearCom(excelWorkbook);
                    excelApp.Workbooks.Close();
                    excelApp.Quit();
                    ClearCom(excelApp);

                    excelWs = null;
                    excelWorkbook = null;
                    excelApp = null;
                    MessageBox.Show("設定完成");
                }
            }

            static void ClearCom(object o)
            {
                try
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
                }
                catch { }
                finally
                {
                    o = null;
                }
            }

    ===================================================================================

    什么是NPOI?

    NPOI,顾名思义,就是POI的.NET版本。那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,支持的文件格式包括xls, doc, ppt等。目前POI的稳定版本中仅支持Excel文件格式xls,其他的都属于不稳定版本(放在poi的scrachpad目录中)。NPOI是构建在POI 3.x版本之上的,本月发布的NPOI 1.2是对应于POI 3.2 final的,所以它支持Excel文件读写,但由于人手和精力原因,还没有实现读写Word, PowerPoint, Visio的文件格式。

     

    NPOI的官方网站是啥?

    npoi.codeplex.com

     

    为什么用NPOI?

    因为它能够帮助你生成真正的Office文件格式,比如说Excel文件格式。我曾经看到好几个园友发过有关如何生成Excel报表的帖子,大家确实花了很多心思,具体的帖子如下:

    生成Excel高级报表(用的是Office PIA库)

    http://www.cnblogs.com/xiaobier/archive/2008/10/13/1310399.html

    Datagrid数据导出到excel文件的三种方法

    http://www.cnblogs.com/xieduo/articles/606202.html

    其中提到了的2种方法分别是:cvs法、html法

    .net 操作 EXCEL

    http://www.cnblogs.com/jhobo/archive/2009/02/17/1392423.html

    其中提到了Office PIA法、OLEDB法、OPENXML法

     

    特别是其中的cvs法和html法值得提一下,这得感谢Microsoft Office对于格式的强大兼容性,貌似国产某某Office软件就无法正常显示基于html的xls文件。

    好了,回到我们的问题上,为什么要用NPOI呢?

    第一点,你不需要在服务器上安装微软的Office,可以避免版权问题。

    第二点,使用起来比Office PIA的API更加方便,更人性化。

    第三点,你不用去花大力气维护NPOI,NPOI Team会不断更新、改善NPOI,绝对省成本。

    第四点,很多事情是html和cvs法做不到的,比如说公式计算[Cell C1]=A1+B1*A2、单元格高级样式(如文本旋转、对齐、宽度)等,其中公式计算可以适当减轻服务器端的计算压力

    第五点,你很难保证你的客户机器上都安装了Office 2007或Office Compatiblity Pack for Office 2003,出于向前兼容的考虑,还是生成Office 97-2003格式比较可靠

     

    当然有人要说了,那我用myXls等同类产品可不可以?当然可以,纯属个人喜好,这就好比你愿意用NHibernate还是NBear,完全可以自由选择。

     

    NPOI由哪些东西组成?

    NPOI目前主要由以下部分组成

    NPOI.POIFSOLE2 Document File System Library
    NPOI.DDFMicrosoft Office Drawing format Library
    NPOI.HPSFOLE2 Propertyset library (包括SummaryInformation和DocumentSummaryInformation)
    NPOI.HSSFMicrosoft Excel BIFF library
    NPOI.SSFormula Evaluation library
    NPOI.Util基础类库,提供了很多实用功能,可用于其他读写文件格式项目的开发

     

    NPOI目前的版本如何?包括哪些功能?

    目前NPOI的最新版是NPOI 1.2.1,其中包括了以下功能:

    a. 读写OLE2文档

    b. 读写DocummentSummaryInformation和SummaryInformation

    c. 基于LittleEndian的字节读写

    d. 读写Excel BIFF格式

    e. 识别并读写Excel BIFF中的常见Record,如RowRecord, StyleRecord, ExtendedFormatRecord

    f. 支持设置单元格的高、宽、样式等

    g. 支持调用部分Excel内建函数,比如说sum, countif以及计算符号

    h. 支持在生成的Xls内嵌入打印设置,比如说横向/纵向打印、缩放、使用的纸张等

    i. ……  (功能太多,无法一一例举,大家自己研究吧)

    下载地址:http://npoi.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=19351

     

    在开发中哪些地方可以使用NPOI

    a. 生成Excel报表

    b. Excel中的文本提取(主要用于搜索引擎)

    c. 批量生成Excel文件

    d. 基于Excel文件模板生成新的Excel

    e. 研究Excel BIFF文件格式及OLE2文件格式

     

    NPOI的最终目标是什么?

    a. 能够读写几乎所有的Office 97-2003文件格式,至少能够支持Word, PowerPoint, Excel, Visio的格式,其他的会根据实际需求而定。

    b. 作为教学Office文件格式的“活”教材,也可作为研究生阶段研究数据结构的教材。

    即使是目前的1.2版本也很不完善,支持的Excel功能还很有限,没有搞过NPOI的研发,包括我在内的很多人很难想象微软这样一个Excel软件的开发量,其中除了我们常用的基本功能以外,还有很多内置函数的实现、对行进行分组、行的锁定、表单的保护等。说实话有些功能我也是第一次听说,是在开发中一边看Excel界面一边实现的(呵呵,是不是很土)。由于Office 2007为了兼容Office 97-2003,在其基础上增加了很多新的Record,所以要生成真正意义上的全新的Excel BIFF很难(话说微软的开发速度贼快)。

    在NPOI以后的版本中还会支持Pivot表和图表(Chart),其实你在poi的svn中已经可以看到最新的pivot和chart的代码了,只是还在开发中,没有发布正式版本,估计今年中旬会发一个新的版本。

     

    我也想研究Office文件格式,有没有相关的文档和工具可供参考?

    首先是文件格式的说明文档,你可以去微软的官方网站下载:http://www.microsoft.com/interop/docs/officebinaryformats.mspx

    接着是,我和Huseyin共同开发了POIFS Browser,目前的版本是1.2,已经能够识别Excel BIFF了。

    你可以去http://npoi.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=23409下载。

     

    我可以参加NPOI开发组吗?

    当然可以,我非常欢迎大家加入NPOI Team,因为目前狂缺人手,很多事情要做,比如说实现读写Word格式的库,即HWPF;还需要有人帮忙一起写文档、写范例、写教程。目前团队中只有2个人,我和Huseyin(土耳其人),最近Huseyin也很忙,没时间维护NPOI,所以我很需要你的加入。大家有兴趣可以到http://npoi.codeplex.com/Thread/View.aspx?ThreadId=36157回帖,或者直接发邮件给我(具体邮件地址见我blog的左边栏)。

     

    NPOI有教程吗?

    有,该教程是为NPOI 1.2写的,详细目录请见http://www.cnblogs.com/tonyqus/archive/2009/04/12/1434209.html

     

    NPOI Team下一步准备干嘛?

    上一个问题中提到事情真的很多,下面罗列一下:

    a. 使Excel读写库(HSSF)更加稳定

    b. 开发HSSF对Pivot Table和Chart的支持

    c. 开发Word读写库(HWPF)、PowerPoint读写库(HSLF)

    d. 把HSSF的注释补全,把java的注释转成.NET的,便于用NDoc生成文档和智能感知

    e. 写NPOI 1.2的范例(目前只有10个左右,目标是>50个,类似于微软的SDK,这样方便大家学习和理解)

    f.  写NPOI 1.2的教程

    展开全文
  • .obj文件格式与.mtl文件格式

    万次阅读 多人点赞 2015-07-07 17:55:23
    最近在学习obj文件格式,上网查了些资料,很难找到比较全面的文章,尤其是对.mtl文件的说明甚少。今天把最近搜索的资料整合了一下。这里的obj文件格式指的是Wavefront公司为它的一套基于工作站的3D建模和动画软件...
    最近在学习obj文件格式,上网查了些资料,很难找到比较全面的文章,尤其是对.mtl文件的说明甚少。今天把最近搜索的资料整合了一下。


    常见到的*.obj文件有两种:第一种是基于COFF(Common Object File Format)格式的OBJ文件(也称目标文件),这种格式用于编译应用程序;第二种是Alias|Wavefront公司推出的OBJ模型文件。本文对第二种obj模型文件进行分析。

    3D文件格式,常见的有几种 "*.3ds","*.max","*.lw","*.mb","*.dxf","*.obj"。但是,OBJ文件的具体特征,却很少有人能给出较为圆满的描述。很多人认识OBJ文件是从使用Poser开始的,Poser是一款人体建模软件,要把Poser生成的人体导出到其它3D软件中进行再加工,就用到了OBJ文件。OBJ文件是一种标准的3D模型文件格式,很适合用于3D软件模型之间的互导。比如在3dsMax或LightWave中建了一个模型,想把它调到Maya里面渲染或动画,导出OBJ文件就是一种很好的选择。目前几乎所有知名的3D软件都支持OBJ文件的读写,不过很多软件需要通过插件才能做到这一点。 
    另外,作为一种优秀的文件格式,很多游戏引擎也都支持OBJ文件的读取。 3D软件模型之间的互导是一件很常见的事情,不幸的是,目前的3D软件模型导出功能都不那么完美,经常会出现缺面少线的情况,有时还会遇到导出的模型根本打不开的情况。

    OBJ文件是一种文本文件格式,比起二进制文件为主、连每个块的用途也得试探来试探去的3DS,文本文件为主的OBJ对我们更友好。与3DS文件的树状[块结构]不同,OBJ文件只是很单纯的字典状结构,没有块ID来表征名字而是简单地用易懂的表意字符来表示。总之看上去是赏心悦目的样子,而苦处也就只有实际写导入代码的时候才知道了- -。OBJ文件优化了存储但劣化了读写。

    如果Maya自身的模型出错,也可以先转成OBJ格式,修改之后再导回Maya。

    OBJ文件 -- 概念

    OBJ文件是Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种文件格式,这种格式同样也以通过Maya读写。

    OBJ文件是一种文本文件,可以直接用写字板打开进行查看和编辑修改。

    另外,有一种与此相关二进制文件格式(使用".MOD"后缀),二进制格式作为专利未公开,因此在这里我们不作讨论。

    OBJ最近的有文档的版本是v3.0,代替以前的v2.11版本。

    OBJ3.0格式支持多边形(Polygon),直线(Lines),表面(Surfaces),和自由形态曲线(Free-form Curves)。

    直线和多角形通过它们的点来描述,曲线和表面则根据于它们的控制点和依附于曲线类型的额外信息来定义。这些信息支持规则和不规则的曲线,包括那些基于贝塞尔(Bezier)曲线,B样条(B-spline),基数(Cardinal/Catmull-Rom样条),和泰勒方程(Taylor equations)的曲线。

    1、OBJ文件 -- 特点

    (1)OBJ是一种3D模型文件,因此不包含动画、材质特性、贴图路径、动力学、粒子等信息。

    (2)OBJ文件主要支持多边形(Polygons)模型。

    虽然OBJ文件也支持曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials),但Maya导出的OBJ文件并不包括这些信息。

    (3)OBJ文件支持三个点以上的面,这一点很有用。

    很多其它的模型文件格式只支持三个点的面,所以我们导入Maya的模型经常被三角化了,这对于我们对模型的再加工甚为不利。

    (4)OBJ文件支持法线和贴图坐标。

    在其它软件中调整好贴图后,贴图坐标信息可以存入OBJ文件中,这样文件导入Maya后只需指定一下贴图文件路径就行了,不需要再调整贴图坐标了。



    这里的obj文件格式指的是Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种文件格式。
    OBJ文件是一种标准的3D模型文件格式,很适合用于3D软件模型之间的互导。OBJ文件是一种文本文件格式,这就意味着你可以直接用写字板打开进行查看修改。目前几乎所有知名的3D软件都支持OBJ文件的读写,不过很多软件需要通过插件才能 做到这一点。另外,作为一种优秀的文件格式,很多游戏引擎也都支持OBJ文件。
    OBJ3.0格式支持多边形(Polygon),直线(Lines),表面(Surfaces),和自由形态曲线(Free-form Curves)。直线和多角形通过它们的点来描述,曲线和表面则根据于它们的控制点和依附于曲线类型的额外信息来定义。这些信息支持规则和不规则的曲线,包括那些基于贝塞尔 (Bezier)曲线,B样条(B-spline),基数(Cardinal/Catmull-Rom样条),和泰勒方程(Taylor equations)的曲线。 

    OBJ文件特点 
      -1- OBJ是一种3D模型文件,因此不包含动画、材质特性、贴图路径、动力学、粒子等信息。 
      -2- OBJ文件主要支持多边形(Polygons)模型。 
    虽然OBJ文件也支持曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials),但Maya导出的OBJ文件并不包括这些信息。 
      -3- OBJ文件支持三个点以上的面,这一点很有用。 
    很多其它的模型文件格式只支持三个点的面,所以我们导入Maya的模型经常被三角化了,这对于我们对模型的再加工甚为不利。     
           -4- OBJ文件支持法线和贴图坐标。 

    OBJ文件基本结构
    OBJ文件不需要任何种文件头(File Header),尽管经常使用几行文件信息的注释作为文件的开头。OBJ 文件由一行行文本组成,注释行以一个“井”号(#)为开头,空格和空行可以随意加到文件中以增加文件的可读性。有字的行都由一两个标记字母也就是关键字 (Keyword)开头,关键字可以说明这一行是什么样的数据。多行可以逻辑地连接在一起表示一行,方法是在每一行最后添加一个连接符(\)。注意连接符(\)后面不能出现空格或tab格,否则将导致文件出错。 
     
    下列关键字可以在OBJ文件使用【关键字根据数据类型排列,每个关键字有一段简短描述】 
     顶点数据(Vertex data): 
      v  几何体顶点 (Geometric vertices) 
      vt 贴图坐标点 (Texture vertices) 
      vn 顶点法线 (Vertex normals) 
      vp 参数空格顶点 (Parameter space vertices) 

     自由形态曲线(Free-form curve)/表面属性(surface attributes): 
      deg 度 (Degree) 
      bmat 基础矩阵 (Basis matrix) 
      step 步尺寸 (Step size) 
      cstype 曲线或表面类型 (Curve or surface type) 

     元素(Elements): 
      p 点 (Point) 
      l 线 (Line) 
      f 面 (Face) 
      curv 曲线 (Curve) 
      curv2 2D曲线 (2D curve) 
      surf 表面 (Surface) 

     自由形态曲线(Free-form curve)/表面主体陈述(surface body statements): 
      parm 参数值 (Parameter values ) 
      trim 外部修剪循环 (Outer trimming loop) 
      hole 内部整修循环 (Inner trimming loop) 
      scrv 特殊曲线 (Special curve) 
      sp 特殊的点 (Special point) 
      end 结束陈述 (End statement) 

     自由形态表面之间的连接(Connectivity between free-form surfaces): 
      con 连接 (Connect) 

     成组(Grouping): 
      g 组名称 (Group name) 
      s 光滑组 (Smoothing group) 
      mg 合并组 (Merging group) 
      o 对象名称 (Object name) 

      显示(Display)/渲染属性(render attributes): 
      bevel 导角插值 (Bevel interpolation) 
      c_interp 颜色插值 (Color interpolation) 
      d_interp 溶解插值 (Dissolve interpolation) 
      lod 细节层次 (Level of detail) 
      usemtl 材质名称 (Material name) 
      mtllib 材质库 (Material library) 
      shadow_obj 投射阴影 (Shadow casting) 
      trace_obj 光线跟踪 (Ray tracing) 
      ctech 曲线近似技术 (Curve approximation technique) 
      stech 表面近似技术 (Surface approximation technique) 

    ***************************************************************************************************************
    Maya导出的OBJ文件:
      在Maya中创建一个多边形立方体,选中这个立方体,导出格式为OBJ,文件名为"cube.obj".(如果没有此格式,请在Plug-in Manager中载入"objExport.mll") 用写字板打开"cube.obj"。
    可以看到如下代码: 

      # The units used in this file are centimeters. 
      g default 
      v -0.500000 -0.500000 0.500000 
      v 0.500000 -0.500000 0.500000 
      v -0.500000 0.500000 0.500000 
      v 0.500000 0.500000 0.500000 
      v -0.500000 0.500000 -0.500000 
      v 0.500000 0.500000 -0.500000 
      v -0.500000 -0.500000 -0.500000 
      v 0.500000 -0.500000 -0.500000 
      vt 0.000000 0.000000 
      vt 1.000000 0.000000 
      vt 0.000000 1.000000 
      vt 1.000000 1.000000 
      vt 0.000000 2.000000 
      vt 1.000000 2.000000 
      vt 0.000000 3.000000 
      vt 1.000000 3.000000 
      vt 0.000000 4.000000 
      vt 1.000000 4.000000 
      vt 2.000000 0.000000 
      vt 2.000000 1.000000 
      vt -1.000000 0.000000 
      vt -1.000000 1.000000 
      vn 0.000000 0.000000 1.000000 
      vn 0.000000 0.000000 1.000000 
      vn 0.000000 0.000000 1.000000 
      vn 0.000000 0.000000 1.000000 
      vn 0.000000 1.000000 0.000000 
      vn 0.000000 1.000000 0.000000 
      vn 0.000000 1.000000 0.000000 
      vn 0.000000 1.000000 0.000000 
      vn 0.000000 0.000000 -1.000000 
      vn 0.000000 0.000000 -1.000000 
      vn 0.000000 0.000000 -1.000000 
      vn 0.000000 0.000000 -1.000000 
      vn 0.000000 -1.000000 0.000000 
      vn 0.000000 -1.000000 0.000000 
      vn 0.000000 -1.000000 0.000000 
      vn 0.000000 -1.000000 0.000000 
      vn 1.000000 0.000000 0.000000 
      vn 1.000000 0.000000 0.000000 
      vn 1.000000 0.000000 0.000000 
      vn 1.000000 0.000000 0.000000 
      vn -1.000000 0.000000 0.000000 
      vn -1.000000 0.000000 0.000000 
      vn -1.000000 0.000000 0.000000 
      vn -1.000000 0.000000 0.000000 
      s off 
      g pCube1 
      usemtl initialShadingGroup 
      f 1/1/1 2/2/2 4/4/3 3/3/4 
      f 3/3/5 4/4/6 6/6/7 5/5/8 
      f 5/5/9 6/6/10 8/8/11 7/7/12 
      f 7/7/13 8/8/14 2/10/15 1/9/16 
      f 2/2/17 8/11/18 6/12/19 4/4/20 
      f 7/13/21 1/1/22 3/3/23 5/14/24 
      这个文件看起来稍复杂一些,用到了许多关键词,你可以对照前面的列表查看一下每个关键词的意思。
      解释一下:
      "vt 1.000000 0.000000"这句"vt"代表点的贴图坐标。 
      "vn 0.000000 0.000000 -1.000000"这句"vn"代表点的法线。 
      "s off"表示关闭光滑组。 
      "usemtl initialShadingGroup"表示使用的材质。 
      "f 7/13/21"这时在面的数据中多了贴图坐标uv点和法线的索引号,索引号分别用左斜线(/)隔开。 
      格式:"f 顶点索引/uv点索引/法线索引"。 
      "g pCube1"表示组,这里的成组与Maya中的成组不一样,这里的成组是指把"g pCube1"后出现的面都结合到一起,组成一个整的多边形几何体。 
      把"cube.obj"文件修改一下就知道成组的意思了。把"s off"这句后面的代码替换成以下代码: 
      usemtl initialShadingGroup 
      g pCube_Face1 
      f 1/1/1 2/2/2 4/4/3 3/3/4 
      g pCube_Face2 
      f 3/3/5 4/4/6 6/6/7 5/5/8 
      g pCube_Face3 
      f 5/5/9 6/6/10 8/8/11 7/7/12 
      g pCube_Face4 
      f 7/7/13 8/8/14 2/10/15 1/9/16 
      g pCube_Face5 
      f 2/2/17 8/11/18 6/12/19 4/4/20 
      g pCube_Face6 
      f 7/13/21 1/1/22 3/3/23 5/14/24 
      导入Maya后可以看到,立方体的每个面是分离的,每个面的名称分别是"pCube_Face(1~6)",可见组的名称其实就是单独几何体的名称。
    *******************************************************************************************************************
    用中文命名几何体(组)并不总是顺利,把"g 立方体面1"这行改为"g 选择"再试试看,这回导入时模型根本无法出现,只会出现如下的错误信息: 
      // Error: line 1: Your OBJ file contains a line which is too long to be parsed. Please edit your obj file. //
      // Error: line 1: Error reading file. // 
    由此可见,物体命名的不规范也是导致OBJ文件出错的原因之一。关于Maya的物体命名,英文名是很保险的,标点符号中只有下划线(_)可用,数字不能用放到名称的开头,尽量不要用中、日、韩等双字节文字。

    OBJ文件 -- 实例: 
      下面通过实例来具体讲解。 
      OBJ文件记录一个四边形的代码: 
      v -0.58 0.84 0 
      v 2.68 1.17 0 
      v 2.84 -2.03 0 
      v -1.92 -2.89 0 
      f 1 2 3 4

    让我们来创建一个OBJ文件,不过这一回我们不用3D软件,而是用写字板来创建。 
      打开写字板,把上面的5行代码写上去,可以适当加一点注释。 
      保存文件为文本格式,文件名为"myObj.obj",。

    注意:代码最后一定要按一下回车把光标切换到下一行,就是说加一个换行符(\n)。否则会看到如下错误信息: 
      // Error: line 1: OBJ file line 5: index out of range. // 
      // Error: line 1: Error reading file. //

      在Maya中导入"myObj.obj"文件,看见了吧,导入了一个四边形。这个四边形的形状是完全由前面的那5行代码决定的。

                

     下面我们来分析一个这些代码。 

      v -0.58 0.84 0 
      画一个四边形需要四个顶点,这是第一个顶点,"v"表示顶点(vertex),"-0.58"为这个顶点的X轴坐标值,"-0.84"为Y轴坐标值,"0"为Z轴坐标值。这是第一个顶点,它的索引号是1。索引号是画面时要用到的。 
      v 2.68 1.17 0 
      v 2.84 -2.03 0 
      v -1.92 -2.89 0 
      这分别是第二、三、四个顶点,它们的索引号分别是2,3,4。

     现在开始画面,"f"表示面(face),1,2,3,4是前面那四个顶点的索引号。请注意画这个面连接点的顺序,是从第一个点出发,依次连接第二、三、四个点。如果连接的顺序不同所生成的面也会截然不同,例如"f 1 2 4 3"会产生一个交迭的面,如图。 面的连接点是按顺时针排列或逆时针排列,将决定面的法线方向(面的反正)。 例如:"f 1 2 3 4"面的法线向外,"f 4 3 2 1"面的法线向里。 面的连接点顺序错误,是导致导入模型产生碎面的一个重要原因。

    一个面不能出现两个以上相同的顶点,这也是检查OBJ文件出错的一个要点。

    例如:"f 1 2 3 4 3",有两个相同的顶点,索引号是3。一个面出现两个相同顶点,可能造成程序的内存分配错误。




    OBJ文件不支持有孔的多边形面。举个例子: 
      选择 Maya的创建多边形工具(Polygons -> Create Polyon Tool),在视图中画一个四边形,不要按回车,按Ctrl在四边形中间点一下,可以继续在四边形中挖一个洞。把这个有孔的多边形存成OBJ格式,在导入 Maya时,会发现多边形少了一块。如果你把这也看成错误,现在至少你已经知道错误的原因了,就是OBJ文件不支持有孔的多边形面。

    ********************************************************************************************************************
    OBJ文件不包含面的颜色定义信息,不过可以引用材质库材质库信息储存在一个后缀是".mtl"的独立文件中。关键字"mtllib"即材质库的意思。 
      材质库中包含材质的漫射(diffuse),环境(ambient),光泽(specular)的RGB(红绿蓝)的定义值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。 
      "usemtl"指定了材质之后,以后的面都是使用这一材质,直到遇到下一个"usemtl"来指定新的材质。 
      下面的例子说明了指定材质的方法。 
      Cube with Materials: 
      # This cube has a different material 
      # applied to each of its faces. 
      mtllib master.mtl 
      v 0.000000 2.000000 2.000000 
      v 0.000000 0.000000 2.000000 
      v 2.000000 0.000000 2.000000 
      v 2.000000 2.000000 2.000000 
      v 0.000000 2.000000 0.000000 
      v 0.000000 0.000000 0.000000 
      v 2.000000 0.000000 0.000000 
      v 2.000000 2.000000 0.000000 
      # 8 vertices 
      g front 
      usemtl red 
      f 1 2 3 4 
      g back 
      usemtl blue 
      f 8 7 6 5 
      g right 
      usemtl green 
      f 4 3 7 8 
      g top 
      usemtl gold 
      f 5 1 4 8 
      g left 
      usemtl orange 
      f 5 6 2 1 
      g bottom 
      usemtl purple 
      f 2 6 7 3 
      # 6 elements 
    ********************************************************************************************************************
    贝塞尔片面(Bezier Patch): 
      Maya不能导出OBJ格式的贝塞尔片面,却能够导入它。导入的贝塞尔片面自动转换为Nurbs表面。 
      # 3.0 Bezier patch 
      v -5.000000 -5.000000 0.000000 
      v -5.000000 -1.666667 0.000000 
      v -5.000000 1.666667 0.000000 
      v -5.000000 5.000000 0.000000 
      v -1.666667 -5.000000 0.000000 
      v -1.666667 -1.666667 0.000000 
      v -1.666667 1.666667 0.000000 
      v -1.666667 5.000000 0.000000 
      v 1.666667 -5.000000 0.000000 
      v 1.666667 -1.666667 0.000000 
      v 1.666667 1.666667 0.000000 
      v 1.666667 5.000000 0.000000 
      v 5.000000 -5.000000 0.000000 
      v 5.000000 -1.666667 0.000000 
      v 5.000000 1.666667 0.000000 
      v 5.000000 5.000000 0.000000 
      # 16 vertices 
      cstype bezier 
      deg 3 3 
      # Example of line continuation 
      surf 0.000000 1.000000 0.000000 1.000000 13 14 \ 
      15 16 9 10 11 12 5 6 7 8 1 2 3 4 
      parm u 0.000000 1.000000 
      parm v 0.000000 1.000000 
      end  
      # 1 element 
    ***************************************************************************************************************
    基数曲线(Cardinal Curve): 
      Maya好像不支持OBJ格式的曲线,导入时不会出现错误信息,却也不会出现曲线。 
      # 3.0 Cardinal curve 
      v 0.940000 1.340000 0.000000 
      v -0.670000 0.820000 0.000000 
      v -0.770000 -0.940000 0.000000 
      v 1.030000 -1.350000 0.000000 
      v 3.070000 -1.310000 0.000000 
      # 6 vertices 
      cstype cardinal 
      deg 3 
      curv 0.000000 3.000000 1 2 3 4 5 6 
      parm u 0.000000 1.000000 2.000000 3.000000 end 
      # 1 element 
    ******************************************************************************************************************
    贴图映射(Texture-Mapped): 
      # A 2 x 2 square mapped with a 1 x 1 square 
      # texture stretched to fit the square exactly. 
      mtllib master.mtl 
      v 0.000000 2.000000 0.000000 
      v 0.000000 0.000000 0.000000 
      v 2.000000 0.000000 0.000000 
      v 2.000000 2.000000 0.000000 
      vt 0.000000 1.000000 0.000000 
      vt 0.000000 0.000000 0.000000 
      vt 1.000000 0.000000 0.000000 
      vt 1.000000 1.000000 0.000000 
      # 4 vertices 
      usemtl wood 
      # The first number is the point, 
      # then the slash, 
      # and the second is the texture point 
      f 1/1 2/2 3/3 4/4 
      # 1 element 
    ***********************************************************************************************************
    说下顶点索引吧。
    我们知道,对于每一个三角形,都需要用3个顶点来表示。例如在上面的立方体模型中,一共有6×2×3=36个顶点。仔细想想就会知道, 在这36个顶点中,又相当数量的顶点是重合的。如果把这些重合的顶点都一一表示出来,就太浪费存储空间了。于是,我们提出了顶点索引的想法,解决空间占用 问题。顶点索引的思想是建立两个数组,一个数组用于存储模型中所有的顶点坐标值,另一个数组则存储每一个表面所对应的三个顶点在第一个数组中的索引。建立这样的顶点索引显然更加节约存储空间。
    假设Indices:array of Integer是顶点索引数组,Vertices:array of TVertex是顶点数组,使用下面的代码段就可以把整个顶点索引对应的所有三角形绘制出来:
    procedure DrawIndex(Indices:array of Integer;Vertices:array of TVertex);
    var i :Integer;
    begin
       glBegin(GL_TRIANGLES);
       for i := 0 to (High(Vertices)+1) div 3 -1 do
       begin
         glVertex3fv(@Vertices[Indices[i*3]]);
         glVertex3fv(@Vertices[Indices[i*3+1]]);
         glVertex3fv(@Vertices[Indices[i*3+2]]);
       end;
       glEnd;
    end;
    以此类推,我们可以为模型中所有的法线、纹理坐标都建立起相应的索引,以节省更多的空间。而事实上,OBJ文件就是这么做的。

    在一个OBJ文件中,首先有一些以v、vt或vn前缀开头的行指定了所有的顶点、纹理坐标、法线的坐标。然后再由 一些以f开头的行指定每一个三角形所对应的顶点、纹理坐标和法线的索引。在顶点、纹理坐标和法线的索引之间,使用符号“/”隔开的。一个f行可以以下面几 种格式出现:
    f  1 2 3
        这样的行表示以第1、2、3号顶点组成一个三角形。
    f  1/3 2/5 3/4
        这样的行表示以第1、2、3号顶点组成一个三角形,其中第一个顶点的纹理坐标的索引值为3,第二个顶点的纹理坐标的索引值为5,第三个顶点的纹理坐标的索引值为4。
    f  1/3/4 2/5/6 3/4/2 
        这样的行表示以第1、2、3号顶点组成一个三角形,其中第一个顶点的纹理坐标的索引值为3,其法线的索引值是4;第二个顶点的纹理坐标的索引值为5,其法线的索引值是6;第三个顶点的纹理坐标的索引值为6,其法线的索引值是2。
    f  1//4 2//6 3//2 
    这样的行表示以第1、2、3号顶点组成一个三角形,且忽略纹理坐标。其中第一个顶点的法线的索引值是4;第二个顶点的法线的索引值是6;第三个顶点的法线的索引值是2。
    值得注意的是文件中的索引值是以1作为起点的,这一点与Delphi中以0作为起点有很大的不同。在渲染的时候应注意将从文件中读取的坐标值减去1。

    *****************************************************************************************************************
    最后说说.mtl文件

    三维模型处理会要读取.mtl文件来获得材质信息。

       .mtl文件(Material Library File)是材质库文件,描述的是物体的材质信息,ASCII存储,任何文本编辑器可以将其打开和编辑。一个.mtl文件可以包含一个或多个材质定义,对于每个材质都有其颜色,纹理和反射贴图的描述,应用于物体的表面和顶点。
    以下是一个材质库文件的基本结构:
    newmtl mymtl_1
       材质颜色光照定义
       纹理贴图定义
       反射贴图定义
    newmtl mymtl_2
       材质颜色光照定义
       纹理贴图定义
       反射贴图定义
    newmtl mymtl_3
       材质颜色光照定义
       纹理贴图定义
       反射贴图定义
    ……
    注释:每个材质库可含多个材质定义,每个材质都有一个材质名。用newmtl mtlName来定义一个材质。对于每个材质,可定义它的颜色光照纹理反射等描述特征。
    主要的定义格式如下文所示:
    材质颜色光照
    1。环境反射有以下三种描述格式,三者是互斥的,不能同时使用。

    Ka r g b    \\用RGB颜色值来表示,g和b两参数是可选的,如果只指定了r的值,则g和b的值都等于r的值。三个参数一般取值范围为0.0~1.0,在此范围外的值则相应的增加或减少反射率;
    Ka spectral file.rfl factor   \\用一个rfl文件来表示。factor是一个可选参数,表示.rfl文件中值的乘数,默认为1.0;
    Ka xyz x y z   \\用CIEXYZ值来表示,x,y,z是CIEXYZ颜色空间的各分量值。y和z两参数是可选的,如果只指定了x的值,则y和z的值都等于r的值。三个参数一般取值范围为0~1。

    2。漫反射描述的三种格式:
    Kd r g b
    Kd spectral file.rfl factor
    Kd xyz x y z

    3。镜反射描述的三种格式:
    Ks r g b
    Ks spectral file.rfl factor
    Ks xyz x y z

    4。滤光透射率描述的三种格式:
    Tf r g b
    Tf spectral file.rfl factor
    Tf xyz x y z

    5。光照模型描述格式:

    illum illum_#
    指定材质的光照模型。illum后面可接0~10范围内的数字参数。各个参数代表的光照模型如下所示:
    ************************************************************************************************************

    光照模型               属性
     0                   Color on and Ambient off
     1                   Color on and Ambient on
     2                   Highlight on
     3                   Reflection on and Ray trace on
     4                   Transparency: Glass on
                         Reflection: Ray trace on
     5                   Reflection: Fresnel on and Ray trace on
     6                   Transparency: Refraction on
                         Reflection: Fresnel off and Ray trace on
     7                   Transparency: Refraction on
                         Reflection: Fresnel on and Ray trace on
     8                   Reflection on and Ray trace off
     9                   Transparency: Glass on
                         Reflection: Ray trace off
     10                  Casts shadows onto invisible surfaces

    **************************************************************************************************************

    6。渐隐指数描述

    d factor
    参数factor表示物体融入背景的数量,取值范围为0.0~1.0,取值为1.0表示完全不透明,取值为0.0时表示完全透明。当新创建一个物体时,该值默认为1.0,即无渐隐效果。
    与真正的透明物体材质不一样,这个渐隐效果是不依赖于物体的厚度或是否具有光谱特性。该渐隐效果对所有光照模型都有效。

    d -halo factor
    指定一种受观察者影响的渐隐效果。例如,对于一个定义为 d -halo 0.0的球体,在它的中心是完全消隐的,而在表面边界处将逐渐变得不透明。
    其中factor表示应用在材质上的渐隐率的最小值。而材质上具体的渐隐率将在这个最小值到1.0之间取值。其计算公式为:
    dissolve = 1.0 - (N*v)(1.0-factor)

    7。反射指数描述

    Ns exponent
    指定材质的反射指数,定义了反射高光度。
    exponent是反射指数值,该值越高则高光越密集,一般取值范围在0~1000。

    8。清晰度描述

    Sharpness value
    指定本地反射贴图的清晰度。如果材质中没有本地反射贴图定义,则将此值应用到预览中的全局反射贴图上。
    value可在0~1000中取值,默认60。值越高则越清晰。

    9。折射值描述

    Ni ptical density
    指定材质表面的光密度,即折射值。
    ptical density是光密度值,可在0.001到10之间进行取值。若取值为1.0,光在通过物体的时候不发生弯曲。玻璃的折射率为1.5。取值小于1.0的时候可能会产生奇怪的结果,不推荐。

     
    *************************************************************************************************************
    纹理映射
    纹理映射可以对映射的相应材质参数进行修改,这个修改只是对原有存在的参数进行叠加修改,而不是替换原有参数,从而纹理映射在物体表面的表现上有很好的灵活性。
    纹理映射只可以改变以下材质参数:
    - Ka (color)
    - Kd (color)
    - Ks (color)
    - Ns (scalar)
    - d (scalar)
    除了以上参数,表面法线也可以更改。
    纹理文件类型可以是以下几种:
    1.纹理映射文件
    .mpc:颜色纹理文件color texture files ——可改变Ka,Kd,Ks的值
    .mps:标量纹理文件scalar texture files——可改变Ns,d,decal的值
    .mpb:凹凸纹理文件bump texture files——可改变面法线
    2.程序纹理文件:
    程序纹理文件是用数学公式来计算纹理的样本值。有以下几种格式:
    .cxc
    .cxs
    .cxb

    以下是mtl文件中对于纹理映射的描述格式:
    1.map_Ka -options args filename
    为环境反射指定颜色纹理文件(.mpc)或程序纹理文件(.cxc),或是一个位图文件。在渲染的时候,Ka的值将再乘上map_Ka的值。
    而map_Ka的可选项参数有以下几个:
    -blendu on | off
    -blendv on | off
    -cc on | off
    -clamp on | off
    -mm base gain
    -o u v w
    -s u v w
    -t u v w
    -texres value

    2.map_Kd -options args filename
    为漫反射指定颜色纹理文件(.mpc)或程序纹理文件(.cxc),或是一个位图文件。作用原理与可选参数与map_Ka同。

    3.map_Ks -options args filename
    为镜反射指定颜色纹理文件(.mpc)或程序纹理文件(.cxc),或是一个位图文件。作用原理与可选参数与map_Ka同。

    4.map_Ns -options args filename
    为镜面反射指定标量纹理文件(.mps或.cxs)。可选参数如下所示:
    -blendu on | off
    -blendv on | off
    -clamp on | off
    -imfchan r | g | b | m | l | z
    -mm base gain
    -o u v w
    -s u v w
    -t u v w
    -texres value

    5.map_d -options args filename
    为消隐指数指定标量纹理文件(.mps或.cxs)。作用原理和可选参数与map_Ns同。

    6.map_aat on
    打开纹理反走样功能。

    7.decal -options args filename
    指定一个标量纹理文件或程序纹理文件用于选择性地将材质的颜色替换为纹理的颜色。可选参数同map_Ns。
    在渲染期间, Ka, Kd, and Ks和map_Ka, map_Kd, map_Ks的值通过下面这个公式来进行使用:
    result_color=tex_color(tv)*decal(tv)+mtl_color*(1.0-decal(tv))
    其中tv表示纹理顶点,result_color是Ka,Kd和Ks的综合作用值。

    8.disp -options args filename
    指定一个标量纹理文件或程序纹理文件实现物体变形或产生表面粗糙。可选参数同map_Ns。

    9.bump -options args filename
    为材质指定凹凸纹理文件(.mpb或.cxb),或是一个位图文件。
    可选参数可为:
    -bm mult
    -clamp on | off
    -blendu on | off
    -blendv on | off
    -imfchan r | g | b | m | l | z
    -mm base gain
    -o u v w
    -s u v w
    -t u v w
    -texres value

    ******************************************************************************************************
    反射贴图
    在.mtl文件中的定义格式为:
    1.refl -type sphere -options -args filename
    指定一个球体区域将指定的纹理反射映射至物体。filename为一个颜色纹理文件,或可以映射的位图。

    2.refl -type cube_side -options -args filenames
    指定一个立方体区域将指定的纹理反射映射至物体。可以通过以下方式来指定纹理位置:
     refl -type cube_top
     refl -type cube_bottom
     refl -type cube_front
     refl -type cube_back
     refl -type cube_left
     refl -type cube_right

    “refl”可以单独使用,或配合以下参数使用。使用时将参数置于“refl”和“filename”之间。
     -blendu on | off
     -blendv on | off
     -cc on | off
     -clamp on | off
     -mm base gain
     -o u v w
     -s u v w
     -t u v w
     -texres value
    展开全文
  • HTMLTestRunner.py(已调整格式,中文显示)

    千次下载 热门讨论 2016-08-09 09:20:53
    网上流传的HTMLTestRunner生成报告是英文的,而且样式比较难看,比较乱,我进行了简单调整,输出中文格式报告,而且采用bootstrap调整了样式,优化了一下
  • Audio WAV文件格式

    千次阅读 2017-03-02 10:46:55
    WAV文件格式含义、代码生成WAV文件头及修改更新WAV文件

     

    最近需要对多个WAV文件进行拼接,这就涉及到WAV文件头的创建和修改更新。之前的方式是利用第一个WAV的文件头,在最后全部拼接完后再修改文件头中的文件长度及音频数据长度。这个长度如果不修改,最后拼接的文件虽然大小是各WAV文件大小之和,但播放的时候只播放第一段的WAV文件,因为WAV文件头中的大小就是第一段WAV的大小,播放器读取文件头会根据这个大小来显示时长和播放。

    现在需求有变,第一段文件可能是静音空数据,这就导致第一段没有文件头,其实也可以从WAV文件中拷贝头44字节出来,但为搞清楚文件头各字节含义,以及便于统一程序控制(拼装各WAV文件,不用判断该WAV是否需要跳过44字节头)。看代码:

    Android Audio Wav 文件读写操作的封装

        /**
         * @param sampleRate 采样率,如44100
         * @param channels 通道数,如立体声为2
         * @param bitsPerSample 采样精度,即每个采样所占数据位数,如16,表示每个采样16bit数据,即2个字节
         * @param bytePerSecond 音频数据传送速率, 单位是字节。其值为采样率×每次采样大小。播放软件利用此值可以估计缓冲区的大小。
         *                      bytePerSecond = sampleRate * (bitsPerSample / 8) * channels
         * @param fileLenIncludeHeader wav文件总数据大小,包括44字节wave文件头大小
         * @return wavHeader
         */
        private byte[] getWaveFileHeader(int sampleRate, int channels, int bitsPerSample,
                                         int bytePerSecond, long fileLenIncludeHeader) {
            byte[] wavHeader = new byte[44];
            long totalDataLen = fileLenIncludeHeader - 8;
            long audioDataLen = totalDataLen - 36;
    
            //ckid:4字节 RIFF 标志,大写
            wavHeader[0]  = 'R';
            wavHeader[1]  = 'I';
            wavHeader[2]  = 'F';
            wavHeader[3]  = 'F';
    
            //cksize:4字节文件长度,这个长度不包括"RIFF"标志(4字节)和文件长度本身所占字节(4字节),即该长度等于整个文件长度 - 8
            wavHeader[4]  = (byte)(totalDataLen & 0xff);
            wavHeader[5]  = (byte)((totalDataLen >> 8) & 0xff);
            wavHeader[6]  = (byte)((totalDataLen >> 16) & 0xff);
            wavHeader[7]  = (byte)((totalDataLen >> 24) & 0xff);
    
            //fcc type:4字节 "WAVE" 类型块标识, 大写
            wavHeader[8]  = 'W';
            wavHeader[9]  = 'A';
            wavHeader[10] = 'V';
            wavHeader[11] = 'E';
    
            //ckid:4字节 表示"fmt" chunk的开始,此块中包括文件内部格式信息,小写, 最后一个字符是空格
            wavHeader[12] = 'f';
            wavHeader[13] = 'm';
            wavHeader[14] = 't';
            wavHeader[15] = ' ';
    
            //cksize:4字节,文件内部格式信息数据的大小,过滤字节(一般为00000010H)
            wavHeader[16] = 0x10;
            wavHeader[17] = 0;
            wavHeader[18] = 0;
            wavHeader[19] = 0;
    
            //FormatTag:2字节,音频数据的编码方式,1:表示是PCM 编码
            wavHeader[20] = 1;
            wavHeader[21] = 0;
    
            //Channels:2字节,声道数,单声道为1,双声道为2
            wavHeader[22] = (byte) channels;
            wavHeader[23] = 0;
    
            //SamplesPerSec:4字节,采样率,如44100
            wavHeader[24] = (byte)(sampleRate & 0xff);
            wavHeader[25] = (byte)((sampleRate >> 8) & 0xff);
            wavHeader[26] = (byte)((sampleRate >> 16) & 0xff);
            wavHeader[27] = (byte)((sampleRate >> 24) & 0xff);
    
            //BytesPerSec:4字节,音频数据传送速率, 单位是字节。其值为采样率×每次采样大小。播放软件利用此值可以估计缓冲区的大小;
            //bytePerSecond = sampleRate * (bitsPerSample / 8) * channels
            wavHeader[28] = (byte)(bytePerSecond & 0xff);
            wavHeader[29] = (byte)((bytePerSecond >> 8) & 0xff);
            wavHeader[30] = (byte)((bytePerSecond >> 16) & 0xff);
            wavHeader[31] = (byte)((bytePerSecond >> 24) & 0xff);
    
            //BlockAlign:2字节,每次采样的大小 = 采样精度*声道数/8(单位是字节); 这也是字节对齐的最小单位, 譬如 16bit 立体声在这里的值是 4 字节。
            //播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整
            wavHeader[32] = (byte)(bitsPerSample * channels / 8);
            wavHeader[33] = 0;
    
            //BitsPerSample:2字节,每个声道的采样精度; 譬如 16bit 在这里的值就是16。如果有多个声道,则每个声道的采样精度大小都一样的;
            wavHeader[34] = (byte) bitsPerSample;
            wavHeader[35] = 0;
    
            //ckid:4字节,数据标志符(data),表示 "data" chunk的开始。此块中包含音频数据,小写;
            wavHeader[36] = 'd';
            wavHeader[37] = 'a';
            wavHeader[38] = 't';
            wavHeader[39] = 'a';
    
            //cksize:音频数据的长度,4字节,audioDataLen = totalDataLen - 36 = fileLenIncludeHeader - 44
            wavHeader[40] = (byte)(audioDataLen & 0xff);
            wavHeader[41] = (byte)((audioDataLen >> 8) & 0xff);
            wavHeader[42] = (byte)((audioDataLen >> 16) & 0xff);
            wavHeader[43] = (byte)((audioDataLen >> 24) & 0xff);
            return wavHeader;
        }

     

     

    修改文件头中的文件长度及音频PCM数据长度:

     

        /**
         * 更新wav文件头
         *
         * @param totalFileLen 包含44字节wav头及所有PCM数据总和
         */
        private void updateWavFileHeader(String finalVoiceFilePath, long totalFileLen) {
            Log.e(TAG, "updateWavFileHeader()--->>totalFileLen = " + totalFileLen);
            try {
                RandomAccessFile randomAccessFile = new RandomAccessFile(finalVoiceFilePath, "rw");
                //更新wav文件头04H— 08H的数据长度:该长度 = 文件总长 - 8
                randomAccessFile.seek(4);
                randomAccessFile.write(long2bytes(totalFileLen - 8));
    
                //更新wav文件头28H— 2CH,实际PCM采样数据长度
                randomAccessFile.seek(40);
                randomAccessFile.write(long2bytes(totalFileLen - 44));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

     

    参考文章:

     

    1、http://www.cnblogs.com/cheney23reg/archive/2010/08/08/1795067.html

     

     

     

     

    展开全文
  • 如何使用格式工厂将vtt文件格式字幕加在视频文件中 可以直接看 第三步-整合流程 一,字幕格式 现在比较流行的字幕格式,分为图形格式和文本格式两类。 图形格式字幕由 idx 和 sub 文件组成,idx 相当于索引文件,...

    如何使用格式工厂将vtt文件格式字幕加在视频文件中

    可以直接看 第三步-整合流程

    一,字幕格式

    现在比较流行的字幕格式,分为图形格式和文本格式两类。

    图形格式字幕由 idx 和 sub 文件组成,idx 相当于索引文件,里面包括了字幕出现的时间码和字幕显示的属性,sub 文件就是字幕数据本身,由于是图片格式,所以比较大,动辄 10M 以上(不过我们可以将之压缩为 rar 文件,在 unrar.dll 的支持下和没有压缩一样,但是可以节省很多空间)。idx+sub 可以存放多种语言的字幕,在播放的时候可以方便的选择。

    文本格式字幕的扩展名通常是 ass、srt、smi、ssa 或 sub,因为是文本格式,所以尺寸很小,通常不过百十来 KB。其中 srt 文本字幕是最流行的,因为其制作和修改非常简单:一句时间代码 + 一句字幕

    另外,往往从网上下的字幕都有2种语言,即国语和英语,**如何将中文字幕与英文字幕合成双语字幕呢?**如果是外挂的.srt字幕文件的话,用写字本(也就是记事本)打开中文字幕文件,把中文的字幕全部内容复制。打开英文字幕文件,在末尾粘贴刚才复制的内容。不要改时间,保存。再看看视频你就发现自动变双字幕了!

    二,常用软件

    目前,我们常用的播放软件就有在播放影片的同时添加字幕的功能

    风暴2的话只需字幕的名字和电影的名字相同,播放器会自动识别加载字幕,如影片名为:day.break.s01e02.hdtv.xvid-xor.avi,字幕名为:day.break.s01e02.hdtv.xvid-xor.en.srt 。另外VJDirector2软件也具备优秀的字幕添加功能,支持自动字幕和手动字幕两种字幕发布方式。远程发布字幕:实现在另外的电脑上编辑和发布字幕到VJDirector上面。字幕可以通过文件加载也可以手动输入。字体可以设置,支持大量的字体效果:3D效果、阴影、外框等。

    (转自百度百科)

    三,整合流程

    需要的资源:视频文件,字幕文件,格式工厂
    

    ① 找到从网上下载的视频文件和字幕文件

    ​ 本次实例视频文件格式为mp4,字幕文件为vtt

    在这里插入图片描述

    ② 打开格式工厂(官网下载链接)

    在这里插入图片描述

    ③ 点击视频,然后点击转化为的视频格式(可以直接点击下载视频本来的格式,比如说我的视频素材格式 为mp4,我就点击转化为mp4那个按钮)

    ​ 点击添加文件,选择视频路径

    在这里插入图片描述

    ​ 点击输出配置,下拉找到附加字幕,选择字幕文件路径,加入字幕

    在这里插入图片描述

    ​ 点击确定,再次点击确定

    在这里插入图片描述

    ​ 点击开始,然后等待视频转化(字幕加入)成功

    ④ 找到格式工厂中自己设置的输出文件夹,打开即可得到有字幕的视频了

    在这里插入图片描述

    read me

    1, 在格式工厂中选择字幕文件时,会出现找不到自己的vtt字幕文件格式,这个时候需要点击右下方,将文件格式调整为 全部文件,即可选择。

    2, 字幕的样式是可以改变的,大小,颜色,在第三步附加字幕那里可以更改,实践证明,字幕大小默认,颜色白色,边框黑色,是比较好的,也可以根据个人需要更改字幕设置。

    在第三步附加字幕那里可以更改,实践证明,字幕大小默认,颜色白色,边框黑色,是比较好的,也可以根据个人需要更改字幕设置。

    展开全文
  • Source Insight中添加AStyle调整格式

    千次阅读 2014-12-13 20:21:01
    用source insight 编辑代码时,苦于source insight没有集成的代码格式化工具, GNU的astyle是一个免费的代码格式化工具,能够整理符合c/c++规范 。  我们可以将astyle.exe外挂到SourceInsight中。详细步骤如下:...
  • JavaScript代码格式调整

    2012-06-29 14:16:07
    有时候JavaScript代码为了节省空间需要将内容中的空白处清空,但是对之后的阅读使用却非常不方便...可以到http://www.hulilab.com/rory/SortJS.htm中下载工具和源码。也可到访问网页版http://www.hulilab.com/sortjs。
  • 最新岗位工资调整分析表(表格模板、XLS格式)更新,需要使用的朋友可以来下载看看样式,岗位...该文档为岗位工资调整分析表(表格模板、XLS格式),是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 管吧小编带来一篇员工工资调整申报与审批制度(DOC格式),在日常生活工作中需要用的朋友可以来...该文档为员工工资调整申报与审批制度(DOC格式),是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 下面是改TXT文档格式,加粗字体为数据库查询结果,并且同一条记录金额时相同的 reqSerialno|transdate|conamount|amount|code|returncode|acctid|charge|tno|class|depacct **20180531000000001**|**20180531**|...
  • 如何下载DWG矢量格式的CAD等高线

    千次阅读 2017-11-28 15:38:39
    在“新建任务”对话框中,点击“导出设置”可以设置导出文件格式、坐标投影、高程校正(基准面校正)、边界范围裁剪和背景透明设置等参数。 由于高程值的坐标默认是WGS84经纬度球面坐标,而等高线通常用于北京...
  • RTF文件格式

    千次阅读 2007-04-10 19:27:00
    这几天正在写一个编辑器,需要研究RTF文件格式,以下是我收集的一个资料,非常实用。在随后不长的时间内,我将发布一款VB代码格式化的源程序。 RTF文件格式研究报告(代开版辞)摘要:本文对RTF文件格式进行分析...
  • 二进制文件格式设计

    千次阅读 2017-08-09 22:31:06
    比如一个矢量绘图程序,需要将用户绘制的每个图元都保存到文件中,以后再次打开。应该优先考虑文本格式,文本格式容易测试和编辑。更应该优先考虑通用的文本格式,比如 XML, JSON, Lua 等等。这些通用的文本格式已经...
  • mp3文件格式详解

    万次阅读 2019-08-17 11:53:22
    Mp3文件格式: 参考:https://www.cnblogs.com/ranson7zop/p/7655474.html https://www.cnblogs.com/ranson7zop/p/7655474.html 下面对根据一个mp3文件讲解下,如下图所示: 如下图十个字节代表ID3V...
  • 近一年时间里,有不少网友发邮件向我询问,如何在不格式化硬盘的情况下调整磁盘分区的容量大小。本想还是像以前一样,回个邮件。但问的人多了,觉得有必要写个操作手册出来,所以我就连夜赶写了一份操作文档并录制了...
  • 如何设计二进制文件格式

    千次阅读 2020-03-06 16:53:10
    设计二进制文件格式前言1、为何需要一种二进制的文件格式2、文件格式的具体设计(1)整体的文件结构(2)文件头魔数(magic number)(3)检验码(4)版本号(5)字节顺序(6)字节对齐(7)回写和流写 前言 本文是...
  • TS文件格式详解

    千次阅读 2014-11-14 18:33:52
    最近彻底研究分析了ts文件格式,这里做下学习总结: 简单的来说,ts文件中的信息其实就是通过负载类型字段来找,找到后把数据从负载中提取出来,ts中可以有很多媒体类型数据,比如说可以同时又音频和视频数据, ...
  • 现在无论是下载一些文档资料还是公司直接传递文档很多都会用到PDF这种格式文件,这是一种便携式文档格式,传输查看都都不错,但是这种格式文档在编辑操作上就没有那么方便了,那PDF文件怎么编辑修改呢?...
  • book118可预览文档下载

    千次阅读 2020-08-06 21:30:59
    就拷贝测试了一下,然后进行了部分更正,和格式调整。 中间除了点list和函数间调用时的bug。 然后增加了用pymupdf 模块 生产pdf文件的步骤,毕竟pdf更方便的多,反正下载的也是不可编辑的png图片。 本来想
  • 一、背景 Open street Map 是一个很好的开源数据获取源,本人正在做关于芝加哥的研究需要用到...下载文件格式为.osm 2.利用Over pass API 索引下载数据(适合城市尺度的数据下载) 进入Over Pass API官网: (1)获取
  • 点击下载来源:格式工厂去广告免费版 v4.8.0 格式工厂是一款功能强大且实用的格式转换工具,支持各种类型格式,列如视频、音频、图片等,相比是同行软件中来讲,是最广最全能的。只要有了Format Factory想转换什么...
  • 在网络上下载一个MPG格式,想要转换成MP4格式,可用什么软件?mpg转mp4格式转换器是一款专门转换各种手机或移动设备的格式转换器,为什么转换MP4格式?因为MP4格式目前除了在网络的一些播放器上应用,还在手机上被...
  • 流媒体/流媒体文件格式详解

    万次阅读 2017-05-31 20:34:41
    摘 要 流媒体文件格式在流媒体系统中占有重要地位,设计合理的文件格式是提高流媒体服务器工作效率最直接和最有效的办法。该文在剖析常用流媒体系统和文件格式的基础上,特别地对美国xiph.org基金会的开源流媒体...
  • phpexcel 导出格式,字体调整

    千次阅读 2017-12-12 22:16:24
    对于小数量数据(低于1000)条,如果出现导出较慢,或者网页超时,那可能是phpexcel样式文件写错地方了,可能和数据混在一起,导致较慢。 如果数据太多导致超时或者内存溢出,可添加 set_time_limit(0);//不限制...
  • 相较常用的office和PDF等文档来说,CAJ是知网查找和下载论文资料的主要文档格式。那么caj文件要如何打开呢?怎么修改CAJ格式文档呢? 一、如何打开? CAJ格式文档只需要安装CAJ文档阅读器就可以直接打开查看了。...
  • vba按原格式批量合并word文档

    千次阅读 2019-04-29 17:42:56
    使用说明 功能:把一个文件夹下面的word文档按原文档的格式批量合并成一个word文档。 准备工作 把 合并文件.docm和需要合并的word文档(例如:测试...把目录下的文档名称写入filelist.txt文件里面,调整测试用文...
  • web /java 实现多种格式视频上传、转码、播放、下载 1.前言 前段时间一直在做一个生物资源共享平台,采用SSM框架技术,其中涉及一个模块,是关于视频资源的播放。 本来不是很大的问题,但是无奈用户要求较多,...
  • word文档批量调整页码-wordAID

    千次阅读 2020-03-29 13:50:39
    编写文案或论文时,经常会用到多个word文档,最后统一打印。调整页码的工作枯燥,经常重复性操作,困扰了大部分搞科研写论文的老师、同学,因此wordAID应运而生。 下载地址: ...提取码:v993 直接下载地...
  • Python:下载数据——JSON格式

    千次阅读 2019-08-22 21:23:49
    文章目录1 制作交易收盘价走势图:JSON格式1.1 下载收盘价数据1.2 提取相关的数据1.3 将字符串转换为数字值1.4 绘制收盘价折线图1.5 时间序列特征初探1.6 收盘价均值1.7 收盘价数据仪表盘2 练习 1 制作交易收盘价...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 139,529
精华内容 55,811
关键字:

下载文档如何调整格式