RTF文件格式解析(二)图像问题

图片

一个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控制字。了解更多关于GetDIBitsGetBitmapBits函数、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

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

u010787096

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值