忙了5天的总结一下
我要在RTF里支持BMP格式的图片,写字板并不支持/dibitmap和/wbitmap的控制字,所以选择使用/wmetafile也就是wmf。
wmf是一种矢量图,里面都是windows的API,支持bmp其实就是把BMP画上去。
wmf有好几种,我选择的是古老的Standard Metafile
他有有两个结构体组成,header和record
typedef struct tagMETAHEADER {
WORD mtType;
WORD mtHeaderSize;
WORD mtVersion;
DWORD mtSize;
WORD mtNoObjects;
DWORD mtMaxRecord;
WORD mtNoParameters;
} 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倍除了图片。
搞明白这些我用了一周。
如果有不对的地方希望看到的朋友指出.
|
|