将位图作为一个对象插入工作得很好,但是用户可以打开和编辑它,并且图象必须是一个已存在的文件。用剪贴板工作得更好,但是它将擦掉以前的内容。因为我的工程要求图象不可编辑而且不能动剪贴板,我必须求助于编辑RTF。如果你有Rxlib,或是使用Microsoft RichTextBox控件(和VB5+一起的),这个方法可能对你有用。请原谅程序的笨拙。因为我不喜欢装载大图象带来的延迟,非常欢迎提出优化它的建议。
function BitmapToRTF(pict: TBitmap): string;
var
bi,bb,rtf: string;
bis,bbs: Cardinal;
achar: ShortString;
hexpict: string;
I: Integer;
begin
GetDIBSizes(pict.Handle,bis,bbs);
SetLength(bi,bis);
SetLength(bb,bbs);
GetDIB(pict.Handle,pict.Palette,PChar(bi)^,PChar(bb)^);
rtf := ''{/rtf1 {/pict/dibitmap '';
SetLength(hexpict,(Length(bb) + Length(bi)) * 2);
I := 2;
for bis := 1 to Length(bi) do
begin
achar := Format(''%x'',[Integer(bi[bis])]);
if Length(achar) = 1 then
achar := ''0'' + achar;
hexpict[I-1] := achar[1];
hexpict := achar[2];
Inc(I,2);
end;
for bbs := 1 to Length(bb) do
begin
achar := Format(''%x'',[Integer(bb[bbs])]);
if Length(achar) = 1 then
achar := ''0'' + achar;
hexpict[I-1] := achar[1];
hexpict := achar[2];
Inc(I,2);
end;
rtf := rtf + hexpict + '' }}'';
Result := rtf;
end;
这个函数返回一段可以被导入到RxRichEdit或RichTextBox选择的RTF流。
这对我来说似乎工作得很好:
{假设SS是TStringStream,RE是TRxRichEdit,BMP是一存有图片的TBitmap。}
SS := TStringStream.Create(BitmapToRTF(BMP));
RE.PlainText := False;
RE.StreamMode := [smSelection];
RE.Lines.LoadFromStream(SS);
SS.Free;
如果你不知道RxRichEdit是什么并想知道,你可以在这里获得有关资料: http://www.rxlib.com/
如果你不知道RTF(RichText Format)是什么,你可以在这里读到一点东西:http://chesworth.com/pv/file_format/rtf.txt