图片
一个RTF文件可以包含由其他应用创建的图象。这些图象可以是16进制(默认的)或2进制格式。图象属于目标引用,由\pict 控制字开始。如后面的例子中将描述的,\pict关键字应在\*\shppict引用控制关键字之后。一个图象引用具有如下语法:
<pict> | '{' \pict (<brdr>? & <shading>? & <picttype> & <pictsize> & <metafileinfo>?) <data> '}' |
<picttype> | | \emfblip | \pngblip | \jpegblip | \macpict | \pmmetafile | \wmetafile | \dibitmap <bitmapinfo> | \wbitmap <bitmapinfo> |
<bitmapinfo> | \wbmbitspixel & \wbmplanes & \wbmwidthbytes |
<pictsize> | (\picw & \pich) \picwgoal? & \pichgoal? \picscalex? & \picscaley? & \picscaled? & \piccropt? & \piccropb? & \piccropr? & \piccropl? |
<metafileinfo> | \picbmp & \picbpp |
<data> | (\bin #BDATA) | #SDATA |
这些控制字在下表中描述。这个表中一些度量单位是缇,一缇是二十分之一点。
控制字 | 涵义 |
\emfblip | 图片源为一个EMF文件(增强图元文件)。 |
\pngblip | 图片源为一个PNG文件。 |
\jpegblip | 图片源为一个JPEG文件。 |
\shppict | 指定一张Word 97到Word 2002的图片。这是一个引用控制字。 |
\nonshppict | 指定Word 97到Word 2002已经写入了一个引用,该引用在读入时将不被读取。这个关键字用于与别的阅读器兼容。 |
\macpict | 图片源为一个QuickDraw文件。 |
\pmmetafileN | 图片源为一个OS/2图元文件。参数N表示图元文件类型。N的取值在这部分接下来的\pmmetafile 表中描述。 |
\wmetafileN | 图片源为一个Windows图元文件。参数N表示图元文件类型(默认为1)。 |
\dibitmapN | 图片源为一个Windows设备无关位图。参数N表示位图类型,必须等于0。 包含在RTF中的一个Windows设备无关位图信息,来源于实际象素数据前的 BITMAPINFO结构之中。 |
\wbitmapN | 图片源为一个Windows设备相关位图。参数N表示位图类型(必须等于0)。 包含在RTF中的一个Windows设备相关位图信息,来源于GetBitmapBits函数的返回值。 |
下面是一个\shppict组的例子:
{\*\shppict {\pict \emfblip ….. }}{\nonshppict {\pict ….}}
为了得到最好的设备独立性和与微软产品的互用性,使用\wbitmap和\dibitmap控制字是不推荐的。更推荐的是,位图应该被内嵌到Windows元文件内,使用\wmetafile控制字。了解更多关于GetDIBits和GetBitmapBits函数、Windows设备独立或设备依赖位图的结构及在图元文件中嵌入位图的信息,请查阅Microsoft Windows3.1软件开发工具包的《程序员参考》第1卷和第2卷。下面列出图片控制关键字:
控制字 | 涵义 | ||
图片信息 | |||
\wbmbitspixelN | 用于定义平面上一个点的颜色位数。可能的取值为1(单色),4(16色),8(256色)和24(RGB色)。默认为1。 | ||
\wbmplanesN | 位图颜色平面的数量(必须为1)。 | ||
\wbmwidthbytesN | 指定每个光栅栏的字节数。这个值必须为一个偶数值,因为Windows图形设备接口(GDI)总是假定一个位图的位的值构成一个整形(2字节)的数组值。换句话说,\wbmwidthbytes乘以8必须等于下一个大于等于\picw值(位图象素宽度)的16的倍数。 | ||
图片尺寸,缩放与剪裁 | |||
\picwN | 如果图象是Windows图元文件,表示xExt(x轴扩展)域;如果是位图或QuickDraw图象,表示图片的像素宽度。参数N为长整型。 | ||
\pichN | 如果图象是Windows图元文件,表示yExt (y轴扩展)域;如果是位图或QuickDraw图象,表示图片的像素高度。参数N为长整型。 | ||
\picwgoalN | 按缇计算的图象期望宽度。参数N为长整型。 | ||
\pichgoalN | 按缇计算的图象期望高度。参数N为长整型。 | ||
\picscalexN | 水平缩放比例值。参数N为百分比数值(默认为100%)。 | ||
\picscaleyN | 垂直缩放比例值。参数N为百分比数值(默认为100%) | ||
\picscaled | 图象比例适应指定的框架。仅在\macpict 图象中采用。 | ||
\picprop | 表示这里是应用于一个内嵌图象的形状属性。这是引用控制字。 | ||
\defshp | 表示该内嵌图片为一个Word艺术字形状。 | ||
\piccroptN | 按缇计算的顶端剪切值。正数向图片中心剪切;负数则偏离图片中心剪切,在图片边沿增加一空白(默认为0) | ||
\piccropbN | 按缇计算的底端剪切值。正数向图片中心剪切;负数则偏离中心剪切,在图片边沿增加一空白(默认为0) | ||
\piccroplN | 按缇计算的左端剪切值。正数向图片中心剪切;负数则剪切偏离中心,在图片边沿增加一空白(默认为0) | ||
\piccroprN | 按缇计算的右端剪切值。正数向图片中心剪切;负数则剪切偏离中心,在图片边沿增加一空白(默认为0) | ||
图元文件信息 | |||
\picbmp | 指定一个元文件是否包含一位图。 | ||
\picbppN | 指定一个元文件位图的像素位数。有效范围1~32,1、4、8、24是可识别的。 | ||
图片数据 | |||
\binN | 图象为二进制格式。紧跟的数字参数N是字节数。和所有其他控制字不一样,该控制字带一个32位参数。 | ||
\blipupiN | N 表示图象的每英寸单位(只有某些图象类型需要或输出它) | ||
\blipuid XXXXX | 使用为:{\*\blipuid XXXXX},其中XXXX 是图象的16字节唯一号。 | ||
\bliptagN | 图象主要的唯一标识符。N为长整型值。 | ||
\wbitmap 控制字是可选项。如没有指定其他图象类型,图象被认为是Windows位图。如果指定了\wmetafile,参数N 可能是如下类型之一。
类型 | 参数N |
MM_TEXT | 1 |
MM_LOMETRIC | 2 |
MM_HIMETRIC | 3 |
MM_LOENGLISH | 4 |
MM_HIENGLISH | 5 |
MM_TWIPS | 6 |
MM_ISOTROPIC | 7 |
MM_ANISOTROPIC | 8 |
了解更多关于这些类型的信息,请查阅Microsoft Windows3.1软件开发工具包的《程序员参考》第1卷。
如指定\pmmetafile,参数N 可以是如下类型之一。
类型 | 参数N |
PU_ARBITRARY | 0x0004 |
PU_PELS | 0x0008 |
PU_LOMETRIC | 0x000C |
PU_HIMETRIC | 0x0010 |
PU_LOENGLISH | 0x0014 |
PU_HIENGLISH | 0x0018 |
PU_TWIPS | 0x001C |
了解更多关于这些类型的信息,查阅《OS/2程序员参考》第2卷。
在二进制格式图象处理时,小心紧跟控制字的空格。读文件时,RTF认为第一个空格是控制字分隔符,后面的空格是文档文本的一部分。因此,任何多余的空格附加到图象中,将导致不可预知的结果。
RTF书写器不应使用回车/换行(CR/LF)组合来中断二进制格式的图象。如果这样做,CR/LF组合被作为文字文本,作为图象数据的一部分。
16进制或二进制格式的图象跟随图象引用控制字。下面示例阐明了该引用关键字的格式:
{\pict\wbitmap0\picw170\pich77\wbmbitspixel1\wbmplanes1\wbmwidthbytes22
\picwgoal505
\pichgoal221
\picscalex172
\picscaley172
49f2000000000273023d1101a030
3901000a000000000273023d98
0048000200000275
02040000200010275023e000000000
273023d000002b90002b90002
b90002b90002b9
0002b90002b90002b90002b90002b90002
b92222b90002b90002b90
002b90002b9
0002b90002b90002b90002b9000
绘图对象
基本格式
绘图对象基本RTF格式如下:
{ \shp ........ { \*\shpinst { \spp { \sn .......... } { \sp .............. } } }
{ \shprslt ............... } }
第一个引用字(\shp)总是需要给出。这个控制字将所有图形相关信息组合到一起。其后的目标更改信息被认为是图形的基本信息。下面这些具有值的关键字可以出现在“{ \shp”控制字后的任意位置。
控制字 | 涵义 |
图形关键字 | |
\shpleftN | 指定图形相对于锚点左边的位置。N的单位为缇。 |
\shptopN | 指定图形相对于锚点顶端的位置。N的单位为缇。 |
\shpbottomN | 指定图形相对于锚点底端的位置。N的单位为缇。 |
\shprightN | 指定图形相对于锚点右边的位置。N的单位为缇。 |
\shplidN | 标识每个图形的唯一数值。主要用于链接型文本框。N的值为一个长整形数。 |
\shpzN | 描述图形的Z-ORDER顺序。Z-ORDER顺序从0开始,表示离顶端最远,逐渐向上直到最上面的图形(N)。出现在文档头的图形将具有一个独立的Z-ORDER顺序,与主文档中的Z-ORDER顺序相区别。例如,头部的最末尾图形与正文中的最末尾图形的可以同时为0。 |
\shpfhdrN | 如果图形在主文档区,设置为0;如果在文档头,设置为1。 |
\shpbxpage | 图形相对于X方向页进行定位。 |
\shpbxmargin | 图形相对于X方向页边距进行定位。 |
\shpbxcolumn | 图形相对于X方向列进行定位。 |
\shpbxignore | 忽略\shpbxpage、\shpbxmargin和\shpbxcolumn,而采用\posrelh。这些被忽略的属性用于保持旧的阅读器的向后兼容性,以保证其理解\posrelh的涵义。 |
\shpbypage | 图形相对于Y方向页进行定位。 |
\shpbymargin | 图形相对于Y方向页边距进行定位。 |
\shpbypara | 图形相对于Y方向段落进行定位。 |
\shpbyignore | 忽略\shpbypage、\shpbymargin和\shpbxpara,而采用\posrelh。这些被忽略的属性用于保持旧的阅读器的向后兼容性,以保证其理解\posrelh的涵义。 |
\shpwrN | 指定图形的环绕类型: 1 上下型环绕(图形旁边不允许有文字) 2 四周型环绕 3 没有环绕(如同图形不存在一样环绕) 4 四周型紧密环绕 5 穿越型环绕 |
\shpwrkN | 左右环绕属性(针对\shpwrN中的类型2和类型4): 0 两边均环绕 1 只在左边环绕 2 只在右边环绕 3 只在较宽一边环绕 |
\shpfblwtxtN | 描述相对Z-ORDER顺序: 0 文本位于图形下 1 图形位于文本下 |
\shplockanchor | 锁定图形锚点。 |
\shptxt | 图形文本。该文本必须跟在所有的图形属性之后,并且遵循如下格式: { \shptxt Any valid RTF for the current text box } 注意:对链接型文本框来说,其链接集合中的第一个文本框已包含全部描述,故其后的所有文本均不需要一个\shptxt域了。 |
\shprslt | 描述Word 6.0和Word 95绘图对象能够被放置的位置。 |
\shpgrp | 标识一组图形。跟随该关键字的参数与\shp相同。该组中的图形采用从下至上的Z-Order顺序。 在一个\shpgrp组中,不需要给出{ \shprslt .... }域(也就是说,只有根级别的图形具有一个\shprslt域,该域描述了整个组的信息)。例如: { \shpgrp ....... { \shp ..... (and all sub-items as usual) } { \shp ......(and all sub-items as usual) } 注意: { \shpgrp ...... }可以被{ \shp ..... }取代,以便在组中再创建组。 |
除了\shplid之外,上表中列出的其他控制字不会应用于组中的图形。关于组的更多信息,请参见本规范的引言章节。
控制字 | 涵义 |
\background | 标识文本背景。这是一个引用控制字。它包含一个{ \shp关键字和所有图形属性。 |
图对象属性
大部分的绘图对象由一组属性定义。{ \shp ............控制字后面紧跟{ \*\shpinst,而{ \*\shpinst控制字后面跟随一个图形的所有属性列表。每个属性采用如下格式:
{ \sp { \sn PropertyName } { \sv PropertyValueInformation } }
绘图对象属性控制字为\sp。每个属性由图形属性组中的一对名称(\sn)和值(\sv)控制字来表述。例如,垂直翻转属性表示为:
{\sp{\sn fFlipV}{\sv 1}}
在这里,该属性名称为fFlipV,值为1,表示为真。所有图形属性遵循这个基本格式。只有显式定义的图形属性才需要用RTF写出。其他属性均采用其默认值(一个属性也可以显式定义为默认值)。
示例
{\shp {\*\shpinst \shptop231\shpleft-10\shpright10212\shpbottom273\shpfblwtxt1\shpbypara\shpbxcolumn\shpwr3{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fBehindDocument}{\sv 1}}
{\sp{\sn pib}{\sv{\pict\pngblip\picw681\pich3\picwgoal13620\pichgoal60\picscalex97\picscaley97
89504e470d0a1a0a0000000d49484452000005fd000000060802000000f655a3330000004949444154789cedd8410d00300cc4b075e8cbba4331553ad908f24e
4df701000000204ecd7601000000003fdced0000000000bef07d0000000032f93e00000000997c1f000000804c0f15f003199eb6975d0000000049454e44ae42
6082
}}}}}\pard\sl-20\slmult0\par
\shp 表示这是一个绘图对象,\pngblip表示png格式,图像数据信息:对象属性的\sn为pib,表示二进制图像数据,数据位于\sv内
{\fs22 \rtlch \ltrch \loch \af10 \hich \af10 \dbch \af4 \lang1033 \langnp1033 \langfe2052 \langfenp2052
{\object \objemb \f13 \objsetsize \objw1455 \objh1320 {\*\objclass Word.Document.12}
{\*\objdata 010500000200000011000000576f72642e446f63756d656e742e3132000000000000000000003a0000d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000001a00000001000000feffffff0000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
5000000000000}
{\result {\*\shppict {\pict {\*\picprop \shplid1025 {\sp {\sn shapeType}{\sv 75}}{\sp {\sn fFlipH}{\sv 0}}{\sp {\sn fFlipV}{\sv 0}}{\sp {\sn fLockAspectRatio}{\sv 1}}{\sp {\sn fNoFillHitTest}{\sv 1}}{\sp {\sn fFilled}{\sv 0}}{\sp {\sn fLine}{\sv 0}}{\sp {\sn fPreferRelativeResize}{\sv 1}}{\sp {\sn wzName}{\sv Object 1}}{\sp {\sn fLayoutInCell}{\sv 1}}}\piccropl0 \piccropr0 \piccropt0 \piccropb0 \picscalex100 \picscaley100 \picw97 \pich88 \picwgoal1455 \pichgoal1320 \emfblip {\*\blipuid a24a9f01a24a9f01a24a9f01a24a9f01}010000008000000001000000000000005e000000450000000000000000000000ec090000fd08000020454d4600000100281400000e000000020000000a000000006f00660066006900630065002d0032003000300037005e5c27602d0008000000040000000400000003000000060000000700000005000000070000000700000007000000070000000c0000008000000080000000600000006000000250000000c0000000d0000800e0000001
4000000000000001000000014000000}}}}}
文档样本是内嵌了office2007,因此会生成一个内嵌文档(\objdata部分 )和一个位图对象:\shppict后面有\pict ,表示图片,\emfblip表示图片格式为emf,图片数据和\pict同级
{\pict{\*\picprop\defshp\shplid1025{\sp{\sn shapeType}{\sv 136}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn rotation}{\sv -6094848}}{\sp{\sn fLockAspectRatio}{\sv 0}}
{\sp{\sn gtextUNICODE}{\sv \'d2\'d5\'ca\'f5\'d7\'d6test}}{\sp{\sn gtextFont}{\sv \'cb\'ce\'cc\'e5}}{\sp{\sn gtextFReverseRows}{\sv 0}}{\sp{\sn fGtext}{\sv 1}}{\sp{\sn gtextFVertical}{\sv 1}}{\sp{\sn gtextFShrinkFit}{\sv 1}}
{\sp{\sn gtextFBold}{\sv 0}}{\sp{\sn gtextFItalic}{\sv 0}}{\sp{\sn fShadowOK}{\sv 1}}{\sp{\sn fLineOK}{\sv 1}}{\sp{\sn fillColor}{\sv 0}}{\sp{\sn fFilled}{\sv 1}}{\sp{\sn fLine}{\sv 1}}{\sp{\sn wzName}{\sv \'d2\'d5\'ca\'f5\'d7\'d6
1}}{\sp{\sn posrelh}{\sv 1}}{\sp{\sn posrelv}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0
\picw1448\pich6985\picwgoal821\pichgoal3960\wmetafile8\bliptag-223852777\blipupi602{\*\blipuid f2a8471708cf7bd20af2e5c1bae959c7}
0100090000036e1400000800cf01000000000400000003010800050000000b0200000000050000000c0284069701040000002e0118001c000000fb02a8ff0000
0000000090010000008604000002b5c8cfdf00000000000000000000000000000000000000000000000000000000040000002d010000040000002d0100000400
00002d0100001c000000fb02a8ff00000000000090010000008604000002cbcecce5000000000000000000000000000000000000000000000000000000000400
00002d010100040000002d010100040000002d0101000400000002010100040000002d010000040000002d010000040000002d01000005000000090200000002}
\pict图片数据,\defshp表示该内嵌图片为一个Word艺术字形状。艺术字信息位于{\sp{\sn gtextUNICODE}{\sv \'d2\'d5\'ca\'f5\'d7\'d6test}};
{\*\shppict {\pict {\*\picprop \shplid1026 {\sp {\sn shapeType}{\sv 75}}{\sp {\sn fFlipH}{\sv 0}}{\sp {\sn fFlipV}{\sv 0}}{\sp {\sn fLockAspectRatio}{\sv 1}}{\sp {\sn pibName}{\sv 001}}
{\sp {\sn fLineOK}{\sv 1}}{\sp {\sn f3DOK}{\sv 0}}{\sp {\sn fShadowOK}{\sv 1}}{\sp {\sn fNoFillHitTest}{\sv 1}}{\sp {\sn fFilled}{\sv 0}}{\sp {\sn fLine}{\sv 0}}{\sp {\sn fPreferRelativeResize}{\sv 1}}
{\sp {\sn wzName}{\sv \'cd\'bc\'c6\'ac 2}}{\sp {\sn wzDescription}{\sv 001}}{\sp {\sn fLayoutInCell}{\sv 1}}}
\piccropl0 \piccropr0 \piccropt0 \piccropb0 \picscalex73 \picscaley73 \picw784 \pich1104 \picwgoal11766 \pichgoal16565 \jpegblip
{\*\blipuid 0e5aa7b60e5aa7b60e5aa7b60e5aa7b6}ffd8ffe000104a46494600010101012c012c0000ffe10a6a4578696600004d4d002a0000000800070112000300000
00100010000011a00050000000100000062011b0005000000010000006a012800030000000100020000013100020000001b0000007201320002000000140000008e8769000
400000001000000a2000000ce0000012c000000010000012c0000000141646f62652050686f746f73686f702043532057696e646f77730000323031323a30353a3037203135
a28a00ffd9}}
*\shppict {\pict表示图片,jpegblip 表示图片格式是jpeg