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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)
: \0 O$ d8 C& b& _: w8 W- ?//=============================================================================
7 X, K7 `: L. O6 L4 D6 _! x{9 K5 ~6 x% T" q
BOOL bResult = FALSE;% x$ ^* w" n' k) L
ILockBytes *Buffer = 0;! T6 S$ W- U/ E4 w: Z* ^4 a( a
IStorage   *pStorage = 0;
, e3 X- C( Z: e: d IStream    *FileStream = 0;- N4 p# W. f! `: h
BYTE    *BufferBytes;
" j4 G7 D; j( N: t( U/ D: U: Z, a STATSTG  BytesStatistics;
1 P4 j* D$ O5 s DWORD  OutData;
2 g' c) N8 t* U3 |" V" X+ F long  OutStream;
3 x& P' n& L: Z CFile  BitmapFile; CFileException e;3 K; y* K3 R2 U
double  SkipFloat = 0;2 A% ?4 S; B5 ]/ M2 U
DWORD  ByteSkip = 0;/ ?& Z& r3 d( Q6 ~% @$ b3 i
_ULARGE_INTEGER RealData;
  U& W1 C% v' f  w6 X( d0 E
) s  e# x. n( ?3 x+ i6 b5 O
6 v: H9 [3 G/ U9 l. ?' W$ O" b- g3 I6 l+ a& M6 s
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
6 v' c' Z. \. \" _) N8 f8 u+ n  R6 H- }" T9 j' z3 U  M
- K& F2 T# r( s, `
; t: t2 r/ L9 ^% ]+ U+ w4 P
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
* w' V( _0 e% n1 L- J1 D4 j8 U     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
. ?" ~- m1 z5 K) v2 ?1 @5 n8 {( p
. h! g5 X% c4 \# V8 R" o, g& l; ]( X, R7 K

/ G- \0 [2 n- L hr = pStorage->CreateStream(LPICTURE,
; m' l) F6 z) A   STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
8 F6 Q* s# |/ [* H0 ?; M1 h: ^! j5 @. W$ {3 r3 M) u( ~+ y
$ F% s( k( e+ O2 l+ b

  P) V9 D* _2 w1 T m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream% b8 B0 U1 I, G; r( z5 c; \
FileStream->Release();
6 b! [$ Q  v& n$ Q pStorage->Release();$ J% k* e8 Q5 l8 L; O8 ]
Buffer->Flush(); ! K* `% r& Y& a8 Y8 m. ~

" M; G% m4 A  A2 C0 t" @$ r
" m" ~5 D8 C! n2 B
/ A& e& H+ K" R6 F8 n# e# q$ u // Get Statistics For Final Size Of Byte Array
. D; z, H! d8 @6 h# [+ }+ u Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);: s% P& N: T. I) r! e7 J6 L& p
6 V- L9 Y3 ?2 C; }
) c1 F" L, M; K0 E4 \' Y% A
7 \+ P% u+ ]( L0 r
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
0 \) `% T- C# u# L: P SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
- p& ?$ U/ m1 m$ h2 g) W if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
$ F1 e5 h: E7 }$ D! x else ByteSkip = (DWORD)SkipFloat;
( {' U9 a/ Y' t0 @* P5 G9 j ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
) h5 P8 a8 [0 w0 e8 L5 H- z% q 1 o, U, z% Q7 N
// Find Difference Between The Two Values
2 s. G# g# u  P+ b9 a- ^- }! h# X6 T ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
! K; X5 f6 Y- \3 q3 r0 M% x! a# @% ^9 e
+ p, O" W# b: Y/ Z

  n! v5 B# P1 X5 m // Allocate Only The Pure Picture Data
9 P/ t; j. o8 ~8 L4 e) K RealData.LowPart = 0;
4 Q+ Y  ?2 A+ _: W; n8 R9 |$ Y RealData.HighPart = 0;! ^6 v& a0 p4 L! t
RealData.QuadPart = ByteSkip;, x9 e( x$ {- G' n1 X
BufferBytes = (BYTE*)malloc(OutStream);" b, T3 E% ~6 |- |
if(BufferBytes == NULL)9 I) v7 I. g4 e# G7 J3 \
  {1 l" b0 |& y8 j6 z- {
  Buffer->Release();
" n' i; E6 Q# h) A" p( P# Z3 J  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;% q: [7 C1 R% H" F
  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);. b# H  ^5 d) [
  }
5 _/ [/ H4 `6 S6 M; m! F2 k1 n5 W# @0 J& H
$ G  B7 L$ O& s7 f
& e' P: a1 k* {5 b" Y. B9 l
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
1 {2 }- S! ]9 O; i
6 c6 q6 L; O- [1 B6 q* F' k/ S' W4 n% F9 h/ h! T+ e0 I! q
. g% ]+ C4 h' J- Q! e. k8 N
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))+ R% `. I. S7 e2 A, x. R
  {
1 f$ S3 m9 p* a$ B. {% g% J  BitmapFile.Write(BufferBytes, OutData);
0 b$ z* g3 n4 n( @  BitmapFile.Close();
6 d: c9 G/ V$ x  bResult = TRUE;
5 I4 b' {5 E& S  \$ e  }+ Q# ~, x9 F* K. O+ u5 W
else // Write File Failed...5 D2 G2 Z3 N9 x1 T
  {- {2 p3 f* {1 u
  TCHAR szCause[255];
5 z5 w9 H7 J2 s. [  e.GetErrorMessage(szCause, 255, NULL);
, c3 G4 s$ e, _: d- X1 y" V/ |  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
' ~- n! e- j0 |/ T- s- p  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);/ x/ X& @# ?8 b/ k1 S/ y
  bResult = FALSE;
1 ]) R1 M. x. N- e4 M# ?  H9 P  }$ m2 X- }3 ?3 R5 r" e

: Q7 I0 Q9 X! H Buffer->Release();! n7 Y: Y) D: B4 N
free(BufferBytes);
# V, t. G. S% s& d4 o' \. D' J2 ~+ i
6 v% J+ ?' k; f! p0 {9 p6 }3 L6 c2 }, D0 j

/ m3 B. P/ o& J, u8 h/ p2 ^ return(bResult);' a7 E* ^) H' b
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-20 00:44 , Processed in 0.034662 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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