现在的位置: 首页 > 综合 > 正文

在RTF中插WMF

2012年05月27日 ⁄ 综合 ⁄ 共 2187字 ⁄ 字号 评论关闭
忙了5天的总结一下
我要在RTF里支持BMP格式的图片,写字板并不支持/dibitmap和/wbitmap的控制字,所以选择使用/wmetafile也就是wmf。
wmf是一种矢量图,里面都是windows的API,支持bmp其实就是把BMP画上去。
wmf有好几种,我选择的是古老的Standard Metafile
他有有两个结构体组成,header和record
typedef struct tagMETAHEADER {
WORD  mtType;
WORD mtVersion;
DWORD mtSize;
DWORD mtMaxRecord;
} METAHEADER, *PMETAHEADER;
typedef struct tagMETARECORD { 
  DWORD rdSize; 
  WORD  rdFunction; 
  WORD  rdParm[1]; 
} METARECORD, *PMETARECORD; 
网上资料有http://wvware.sourceforge.net/caolan/ora-wmf.html
我用WORD生成了一个插图的RTF文档,看代码然后整了下
//header
0100  --  type
0900  --  header size
0003  --  version
4e000000  --  size  78
0000  --  objects
2a000000  --  maxrecord   42
0000
//record
04000000   --  size
0301  --  SetMapMode
0800  --  MM_ANISOTROPIC
05000000
0b02  --  SetWindowOrg
0000
0000
05000000
0c02  --  SetWindowExt
0200
0200
05000000
0701  --  SetStretchBltMode
0400
0000
2a000000
430f  --  StretchDIBits
2000  --    DWORD dwRop                   // raster operation code
cc00  --    UINT iUsage,                  // usage options
 --    CONST BITMAPINFO *lpBitsInfo, // bitmap data
 --    CONST VOID *lpBits,           // bitmap bits
0000
0200  --    int nSrcHeight,               // height of source rectangle
0200  --    int nSrcWidth,                // width of source rectangle
0000  --    int YSrc,                     // y-coord of source upper-left corner
0000  --    int XSrc,                     // x-coord of source upper-left corner
0200  --    int nDestHeight,              // height of destination rectangle
0200  --    int nDestWidth,               // width of destination rectangle
0000  --    int YDest,                    // y-coord of destination upper-left corner
0000  --    int XDest,                    // x-coord of destination upper-left corner
 --    HDC hdc,                      // handle to DC
bmpinfo
2800
0000
02000000
02000000
01001800000000001000
0000c40e
0000c40e
00000000
00000000
0000
0000ff0000ff4e000000ff0000ff0000
 
05000000
0701
0100
0000
03000000  --  end
0000
 
中间StretchDIBits这个函数的参数没对上,不知道他是怎么搞的,不过管用的参数都能看出来
 
这样就可以支持BMP了
不过图片大小总是达不到满意
/picwN /pichN (N等于图片宽或高乘以0.01MM每像素,即HMM_PER_INCH,也就是
N=width*2540/dpi)
/picwgoalN /pichgoal(N等于图片宽或高乘以TWIP每像素,即TWIPS_PER_INCH,也就是
N = width/dpi*20)
/picscalex /picscaley这是调节比例的
 (这里要说下20个TWIPS等于一个像素,他是RTF的单位)
这几个和图象大小有关的控制字根本就控制不住
 
后来发现WORD会强制把一切东西都改成96DPI并且会把他觉的大的图片缩放一半,这些都完之后会把所有数据放大4/3倍除了图片。
搞明白这些我用了一周。
 
如果有不对的地方希望看到的朋友指出.

抱歉!评论已关闭.