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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName): i. m% S8 M( q! r, `. l/ M' N2 B- h
//=============================================================================
+ P7 i6 B; k+ V. |2 L{
; C( @8 V( _, P; i" R BOOL bResult = FALSE;: d$ I" ~/ {+ x: H5 m4 T; P
ILockBytes *Buffer = 0;
+ S* o# U4 J# K) ]& W8 l* d IStorage   *pStorage = 0;
8 @" K) q, |% `, t8 s  }, y3 U+ J IStream    *FileStream = 0;
. X) K% ~: q; [9 G, R9 F& H BYTE    *BufferBytes;* S, d" M; I; }; c5 ]0 |
STATSTG  BytesStatistics;
/ R# I9 t% ^, b2 @: Z& \ DWORD  OutData;
9 n( ]1 G& X" X: T long  OutStream;* V4 i6 Z0 r9 n: U2 w
CFile  BitmapFile; CFileException e;
, F0 }; k5 B6 j) k, k6 v double  SkipFloat = 0;
1 g+ J* N" g$ B! B- p DWORD  ByteSkip = 0;
3 N! t7 q4 [3 E! S5 X8 [ _ULARGE_INTEGER RealData;4 `) h  w4 K3 j0 L* z

- S- t+ }- g; j4 b8 B5 P
" ^4 j+ o( L8 p7 t+ l
# G& J$ w- H- b/ v% F8 y CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer5 l* `7 q6 I  Y. E! t0 d6 Q6 H9 P
( `& `6 M* x# o- Y
( |  M, m% [2 J; ~8 m! E

9 N/ V( @2 C) g2 R# q% ? HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,5 n" g2 h/ l# g
    STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);5 j, y$ P, l0 n" f6 h$ J: U, S

/ M; `. p) _/ R( i  [+ E* b
4 Z$ J2 L# y) _  ~0 C. P* s4 e$ M3 i. J  ~2 S
hr = pStorage->CreateStream(LPICTURE,. j8 c: |" P# i9 S1 s
  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);: n) K" Q) E; `  V) ~
% N# t3 K8 G% q* P$ Q0 z& }2 ?! h

7 @- Y* K/ g' U, k' Q( \0 F* O2 P8 e/ @" |
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream. c' F, y- W( d3 e, `$ l
FileStream->Release();
+ U/ [+ s8 p. W# q" F pStorage->Release();. o+ d' I" A! G* Y9 |8 ]* ?
Buffer->Flush();
5 n& v% n- m3 P; f2 Z3 o# ]
9 X" w- C' q" X" ?/ E/ I
3 ^; U- c5 [5 h+ D; |! K8 H- s4 Q, [- i1 P- @2 R' Y
// Get Statistics For Final Size Of Byte Array
! V+ ^& g9 q3 c; ^$ h  h7 i Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
; P+ L4 V+ C7 c- d1 W4 s3 r0 Z/ s7 z; t$ d3 O! ]* [

' b6 `/ O6 ^! {( @+ H4 I5 T$ d% L# T4 a- D
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
( |1 k% p" r  s& G+ M SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
, o4 u# C/ T4 ~# M if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
% P! v2 ~  J4 V: \" R8 S8 D9 l else ByteSkip = (DWORD)SkipFloat;
  _3 T0 o, N% v; X3 Z' ^ ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...2 u$ e* }7 r/ A& g6 V) p2 l* [
4 O) f1 t' K- R5 Z- V7 I4 Z( B
// Find Difference Between The Two Values
: W6 G, F, R3 C, _; b, w% D ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
+ E, S+ p7 p7 }5 t& |& ^* e0 H1 T& n# \
% y+ `9 m! i+ y% e7 K
/ D6 @5 L7 e6 x, L  v
// Allocate Only The Pure Picture Data
0 q8 f4 t) r# l( G) m8 Y- n RealData.LowPart = 0;- K- O1 N5 h, E
RealData.HighPart = 0;
% \6 k9 F/ Z0 m* K& l4 Z8 _ RealData.QuadPart = ByteSkip;/ s( D' f( z, }5 w
BufferBytes = (BYTE*)malloc(OutStream);
* e8 @( Z. L8 G9 b  b* I if(BufferBytes == NULL)
+ b% e3 L; F6 l  {
% c. e6 ?  ?& P: s1 d4 w3 \& |* ?' Z  Buffer->Release();6 M4 W8 b5 P3 V
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
6 y* V, [! V) i1 t* x. |  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);3 w+ Z: k. S) g! j" @
  }, F# ~. E1 _6 O% Y* i% C

3 G) ~' r, ^, X, {) X9 B/ k6 o4 t3 x( M0 \4 b
& {- W& W, I, I  w7 d% \. t
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
4 H9 H; C3 B* d4 X
& W0 d# |% A7 F; B/ K) \4 K4 \. W
' o. u; p# h' ~! S6 z
- Z) l7 C$ ]! {: c' G if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
" Z5 H3 B4 }9 h" L/ R. Q  {4 B9 ?8 E, j/ l: Z6 D+ B/ [. K7 t
  BitmapFile.Write(BufferBytes, OutData);
# g. p$ O0 S( @, }3 k  BitmapFile.Close();
3 A4 V2 C9 s; H  bResult = TRUE;
7 Y* W5 F1 B/ _, Y! r  ]  }
' K$ r9 }( J/ z else // Write File Failed...0 h. U5 l; K) _  M9 d
  {" U) n: z9 T8 _. K0 t/ j
  TCHAR szCause[255];3 ~6 L  Q& l+ [1 {" s
  e.GetErrorMessage(szCause, 255, NULL);9 V! b5 D* V% _7 [9 M3 k
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
1 d$ U! r4 r6 h& o1 L( s7 O  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);0 z7 i; L* Q+ v" n2 f" M& o5 X: F
  bResult = FALSE;
# F4 X, Q- S: C' ^  }8 ]: \# o+ c  |5 O$ V* i# }6 [3 L

" K$ Z/ o5 ~( {# z+ ^8 n# V! q Buffer->Release();/ N; {! R% z1 C$ N/ b% W, l
free(BufferBytes);2 C+ W- {; {! ^4 w/ V. d# o

- i" l' w' i0 D( T3 R
. {0 i- C9 ~, {! t! `
: u8 V  _" K* U1 ^% [ return(bResult);* l8 W4 p' A  R8 W- g: }$ C8 W
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-19 12:18 , Processed in 0.015106 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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