Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

достать картинки из Вордового документа [Delphi, Windows]


_Dragon ©   (2004-10-21 21:53:00) 

Есть документ Ворда, в котором содержится туева хуча картинок. Каким способом с помощью Delphi можно все эти картинки сохранить каждую в отдельный файл???


_Dragon   (2004-10-23 00:09:00) [1]

спасибо огромное!


vertal   (2004-10-23 00:01:00) [2]

Я решал такую задачу для формата jpeg, могу поделиться кодом:
Примерно так:

Var
MSWOrd:Variant;
Begin
 CoInitialize(Nil);
 MsWord := CreateOleObject('Word.Application');
 MsWord.Documents.Open(FileName:='SomeFile',ConfirmConversions:=False,ReadOnly:=True,AddToRecentFiles:=False,Format:= wdOpenFormatAuto);
 MsWord.ActiveDocument.Shapes(1).Select;
 MsWord.ActiveDocument.Selection.Copy;
 SaveClipboardBitMapImageToJPEGFile('YourFile.jpg');
 MsWord.ActiveDocument.Close(SaveChanges:=wdDoNotSaveChanges);
 MSWord.Quit(SaveChanges:=wdDoNotSaveChanges);
 MSWord:=0;
CoUninitialize();
End;
...
library savejpeg;
uses jpeg,clipbrd,windows,graphics;

Function CheckForMetaFile():LongInt;
Var
 mHDC,rHDC:THandle;
 pMFP:^METAFILEPICT;
 HG:HGLOBAL;
 hBitmap:THandle;
 xWidth,yWidth:LongInt;
 LastObj:HGDIOBJ;
Begin
 Result:=ERROR_SUCCESS;
 if not IsClipboardFormatAvailable(CF_BITMAP)
   and IsClipboardFormatAvailable(CF_METAFILEPICT)then
 Begin
   rHDC:=GetDC(0);
   mHDC:=CreateCompatibleDC(rHDC);
   OpenClipboard(0);
   HG:=GetClipboardData(CF_METAFILEPICT);
   pMFP := GlobalLock(HG);
   SetMapMode(mhdc, pmfp^.mm);
   if (pmfp^.mm=MM_ISOTROPIC)or(pmfp^.mm=MM_ANISOTROPIC)and(pmfp^.xExt>0)then
   Begin
     xWidth:=Integer(Round(pmfp^.xExt * GetDeviceCaps(mhdc, HORZRES) /
       GetDeviceCaps(mhdc, HORZSIZE) / 100));
     yWidth:=Integer(Round(pmfp^.yExt * GetDeviceCaps(mhdc, VERTRES) /
        GetDeviceCaps(mhdc, VERTSIZE) /100));
     hBitmap:=CreateCompatibleBitmap(rHDC,xWidth,yWidth);
     LastObj:=SelectObject(mHDC,hBitmap);
     SetViewportExtEx(mhdc,xWidth,yWidth,Nil);
     PlayMetaFile(mHDC,pMFP^.hMF);
     SelectObject(mHDC,LastObj);
     SetClipboardData(CF_BITMAP,hBitmap);
   End;
    GlobalUnlock(HG);
    CloseClipboard();
    DeleteDC(mHDC);
    ReleaseDC(0,rHDC);
 End;
End;

Function SaveClipboardBitMapImageToJPEGFile(Quality:LongInt;FileName:PChar):
 LongInt;stdcall;
var
 jp: TJPEGImage;
 tp: TPicture;
Begin
 CheckForMetaFile;
 Result:=ERROR_SUCCESS;
 try
   tp:=TPicture.Create;
   try
     tp.RegisterClipboardFormat(cf_BitMap,TBitMap);
     tp.LoadFromClipboardFormat(cf_bitmap,ClipBoard.GetAsHandle(cf_Bitmap),0);
     try
       jp := TJPEGImage.Create;
       try
         jp.CompressionQuality := Quality;
         jp.Assign(tp.Bitmap);
         jp.Compress;
         try
           jp.SaveToFile(FileName);
         except
           Result:=ERROR_FILE_NOT_FOUND;
         end;
       except
         Result:=ERROR_OUTOFMEMORY;
       end;
       jp.Free;
     except
       Result:=ERROR_OUTOFMEMORY;
     end;
     tp.UnregisterGraphicClass(TBitMap);
   except
     Result:=ERROR_OUTOFMEMORY;
   end;
   tp.Free;
 except
   Result:=ERROR_OUTOFMEMORY;
 end;
end;

exports
 SaveClipboardBitMapImageToJPEGFile;
end.


_Dragon   (2004-10-22 23:40:00) [3]

ну понятно, что через OLE! А каким способом это сделать?


ИМХО   (2004-10-22 07:26:00) [4]

используя OLE-автоматизацию (коллекция Shapes)


Наверх

Титульная страница Поиск, карта сайта Написать письмо