如何将 RxRichEdit 中的图片取出来,生成文件

ezhuo 2012-01-19 09:40:34
我现在已经将图元数据放到 TSTGMEDIUM 结构里,就是使用 BuildHandleBMP 函数 ,不知道下一步该怎么做了。

代码如下


procedure TForm1.Button12Click(Sender: TObject);
var
idx: integer;
FRTF: IRichEditOle;
ReObject: TReObject;
hr: HRESULT;
tmpDataOBject: IDataObject;


procedure BuildHandleBMP(dataObj: IDataObject; fetc: TFormatEtc);
var
stgm: TSTGMEDIUM;
tmpbitmap: TBitmap;
mmoStream: TMemoryStream;
cf: word;
Buffer: PChar;
begin

tmpbitmap := TBitmap.Create;
mmoStream := TMemoryStream.Create;

if (dataObj.QueryGetData(fetc) = NOERROR) then
begin
stgm.hBitmap := 0;
OleCheck(dataObj.GetData(fetc, stgm));
ShowMessage(IntToStr(stgm.tymed));
if stgm.hBitmap = null then ShowMessage('b');

Buffer := GlobalLock(stgm.hglobal);

Image1.Visible := true;
Image1.Picture.bitmap.Handle := stgm.hglobal;
Image1.Refresh;

Image1.Picture.SaveToFile(apppath + '\aaaa.jpg');
ReleaseStgMedium(stgm);

end;

end;

procedure BuildPicture(var dataobj: IDataObject);
var
FmEtc: TFormatEtc;
ef: IEnumFORMATETC;
bNotFound: Boolean;
sFormat: string;
pic: TPicture;
begin

Memo1.Clear;

FmEtc.cfFormat := CF_BITMAP; // Clipboard format = CF_BITMAP
FmEtc.ptd := nil; // Target Device = Screen
FmEtc.dwAspect := DVASPECT_CONTENT; // Level of detail = Full content
FmEtc.lindex := -1; // Index = Not applicaple
FmEtc.tymed := TYMED_GDI; // Storage medium = HBITMAP handle

FillChar(FmEtc, SizeOf(FmEtc), 0);

ef := nil;
FillChar(ef, SizeOf(ef), 0);
dataObj.EnumFormatEtc(DATADIR_GET, ef);

FillChar(FmEtc, SizeOf(FmEtc), 0);

while ef.Next(1, FmEtc, nil) <> S_FALSE do
begin

Memo1.Lines.Add(StringFromClipboardFormat(FmEtc.cfFormat, true));
Memo1.Lines.Add((StringFromTymed(FmEtc.tymed)));
// SubItems.Add(StringFromspect(fetc.dwAspect));
Memo1.Lines.Add((IntToStr(FmEtc.lindex)));
Memo1.Lines.Add((StringFromTD(FmEtc.ptd)));

bNotFound := false;
case FmEtc.cfFormat of
CF_BITMAP: HandleBMP(dataObj, FmEtc);
CF_DIB: BuildHandleBMP(dataObj, FmEtc);
CF_METAFILEPICT: HandleBMP(dataObj, FmEtc);
else
bNotFound := true;
end;

if bNotFound then ShowMessage('对象不存在');
end;

end;

begin

if Sendmessage(RxRichEdit1.handle, EM_GETOLEINTERFACE, 0, LongInt(@FRTF)) = 0 then
begin
ShowMessage('error');
exit;
end;

for idx := 0 to FRTF.GetObjectCount - 1 do
begin

FillChar(ReObject, SizeOf(ReObject), 0);
ReObject.cbStruct := SizeOf(ReObject);

hr := FRTF.GetObject(Longint(idx), ReObject, REO_GETOBJ_POLEOBJ or REO_GETOBJ_POLESITE);

if Assigned(ReObject.poleobj) and (ReObject.dwFlags and REO_INPLACEACTIVE = 0) then
begin

tmpDataOBject := nil;
hr := ReObject.poleobj.QueryInterface(IDataObject, tmpDataOBject);
if Succeeded(hr) then
begin
if Assigned(tmpDataOBject) then
begin
BuildPicture(tmpDataOBject);
end;
end
else
ShowMessage('QueryInterface失败');

end;

end;

end;

...全文
171 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
我看见佛 2012-03-01
  • 打赏
  • 举报
回复
我这边有一个用WEBBROWER构造的RxRichEdit,可以输入文字,显示图片,另存图片,应该可以实现你这类功能,有需要CALL我251450368
bwsoft1 2012-02-06
  • 打赏
  • 举报
回复
17 靖源桌面记事本提醒网址管理
14 靖源资料收集管理系统
支持插入bmp/gif/jpg/ico/png等格式图片(自动转化为gif/bmp格式),支持图片等对象另存为bmp/jpg图片
www.dxmylove.com

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧