找回密码
 注册
搜索
查看: 9550|回复: 0

[收藏]IPicture::SaveAsFile的一个使用例子

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)7 E& s( j  e6 `* c% G5 d: \/ L
//=============================================================================
2 }6 O8 W0 r* \' j( F1 T{4 P$ G* N+ n0 e- o  _
BOOL bResult = FALSE;8 h* @6 t9 C1 p$ y9 `% e. e
ILockBytes *Buffer = 0;
2 {/ e( t- P5 s+ ^7 A# z1 ~3 S+ D IStorage   *pStorage = 0;' ~, K. u# V+ _' I1 W! l' Y
IStream    *FileStream = 0;
) I. O" i  T& `" P/ k BYTE    *BufferBytes;
0 ^$ j8 f* C# P1 [  w/ E STATSTG  BytesStatistics;3 C  E1 I3 V) p) h. k9 Q' d5 y
DWORD  OutData;6 W0 ~" _4 Q/ Q1 V! S
long  OutStream;6 i0 b+ E( O( j! c
CFile  BitmapFile; CFileException e;# T( \  T2 P! x. u" [# K
double  SkipFloat = 0;8 ?2 G# b& w/ B9 V
DWORD  ByteSkip = 0;: f% Q( P, T9 [4 h* @2 W
_ULARGE_INTEGER RealData;
- a4 A6 i( h3 d# ^9 q
. W8 x9 V% M( w1 j
- q' U8 u% K) e/ A& B
: b' ^. d( o+ J* R% {( w CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
7 |- i# f0 J+ X# a
% z7 X( i0 Y+ n% D, {1 y4 p. g; \) h4 u
) d% Y! p$ t, k  D
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,1 {$ G/ q2 s. \% O, m
    STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);! x* B4 W; o& @( \

  w$ [4 C6 D0 j/ ?
: q7 `9 T* @8 P. l" F. L  b' _) v7 c, j+ u% m" y4 k6 e/ D% p
hr = pStorage->CreateStream(LPICTURE,' D( n5 f1 W3 L5 c* j
  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);* ^% Y% @4 Q, D' D: O! r9 D5 u

' ^7 R5 [( `2 o- W; R2 s; c4 i$ H1 Y9 N* _. [; l5 X

! i" b0 H3 K( z. a' \. \ m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
" P6 o  R5 I) u: G' ]8 i) x# y FileStream->Release();/ {& I& J0 P4 k  n
pStorage->Release();( Y5 a0 X2 x, K) G8 E% L% D
Buffer->Flush(); ! x7 W, m% s/ A% N9 ]' k
" V& @& y' r/ x+ v/ ~9 j  B
& e, e' E4 P8 g" d* i
0 G5 S+ U" o2 k& S: V8 \
// Get Statistics For Final Size Of Byte Array* e$ Z' t% p3 l$ q* Q% F! ~
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
' c/ E, d5 v1 g6 S: B
! B+ K) ?# P, u/ H7 Z. J  C' i& }  V" p4 m/ B6 G
9 m- N& U. b! ~8 Z0 p4 B/ E# \1 u
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)  l7 v7 N  U% D2 ~9 [5 @7 Y
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...! r6 J+ j, n/ Q$ e. o/ @# X
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;* @0 c7 N7 {6 l8 `" s  e
else ByteSkip = (DWORD)SkipFloat;
4 o! H, i6 N9 I% p ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
1 R7 R) F  p& I6 L2 \6 {: |
: g# |8 X+ e* p3 N- R // Find Difference Between The Two Values
5 K7 g* x6 C6 i6 Y3 E# @& S& {$ C ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);& b7 m0 N, l# p/ M* b; ~

7 g2 O$ O+ i- `- s0 F3 ~3 \& x
; [8 L# Y+ q, E  c9 p
6 X! R' k% s# D1 I# x // Allocate Only The Pure Picture Data
: a3 a# k8 v% G6 l3 k# C RealData.LowPart = 0;
6 a4 F1 I( y, Z3 G RealData.HighPart = 0;% A+ E$ x! y! g+ l2 d" n
RealData.QuadPart = ByteSkip;
; c! e7 X! I8 e- y- T! E BufferBytes = (BYTE*)malloc(OutStream);+ e2 w; t2 q: l8 c& @2 m
if(BufferBytes == NULL)
0 g, x' Z0 d! f  {
( h7 v" f/ n2 V$ |& p  Buffer->Release();( [$ l3 U6 h, S; r0 l' R9 E: y1 k4 {
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
  S) n# j6 G* t- f$ ?1 W  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
4 y, `) a1 C4 t2 H5 h+ H  }( T5 }$ t, B" l, s3 J) d

' H+ Z+ n( U0 l8 z
0 ?5 P9 t( e! V/ n% f8 D, Q0 N4 B4 H. r& D  j( s$ f- }& k
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);% F2 K# u, Q; E) x! N  l% P2 U

' V! [' m( _% T$ f$ N# G6 T+ H: I  P
( C2 Y! E, D' ~1 M# [. p$ @
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
  [$ {) Y" _2 v4 l" |9 v9 V2 Q$ B4 L/ j  {
" b! X4 N8 A$ s* y0 S  BitmapFile.Write(BufferBytes, OutData);
9 [4 k: ~3 i# V) i  BitmapFile.Close();
5 r5 d  A& e1 O. t- v) }. t! n& Q4 c  bResult = TRUE;/ E: W  U+ u$ w, x
  }4 a$ q/ f( g4 [+ G( B0 N& o
else // Write File Failed...
; Y5 z+ ~+ y( k0 t$ f  {: r! V$ t3 h' V$ k
  TCHAR szCause[255];
' n7 B- B: k- N2 ?1 Z$ z2 R  e.GetErrorMessage(szCause, 255, NULL);/ L6 H# g; b7 @6 S& E
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;, m& E1 ^) j  e
  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
" y, ~2 L/ g* W0 z1 q3 I  bResult = FALSE;: w: ^' ~  i9 M, R$ N
  }
" M7 @! F, o; u6 r+ B
+ c7 r% F9 m  G. j2 y. r  X1 u( z Buffer->Release();
+ |8 z$ ^" _2 u) @% L3 E free(BufferBytes);! L( I* C' ]! U6 V! I

- X& r: ]" p# ]+ f# \$ m- M6 H% Y: |; ]6 W2 b1 x) j# N2 Y
$ a2 t  f1 x' H3 l
return(bResult);
+ c1 F" _* _+ K- s( Q! z. K! ^}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-11-14 20:01 , Processed in 0.018427 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表