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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)
* K+ F+ x" u. N5 t0 W% O- M9 _//=============================================================================
$ {8 {2 L$ h( m1 f3 d2 U( I{7 s* K3 R4 }, i
BOOL bResult = FALSE;
" P" L" G$ \4 U% }$ h ILockBytes *Buffer = 0;, O8 Q' ?/ y0 A) s/ j1 h
IStorage   *pStorage = 0;
2 U5 ?) W6 }% e/ v4 b8 H IStream    *FileStream = 0;, a+ j+ w  }  d' h' T  C5 b
BYTE    *BufferBytes;8 J' `; g$ {# F& q
STATSTG  BytesStatistics;6 L! t. \6 k: ~7 m6 U* q2 [$ F
DWORD  OutData;9 L% q- W  n7 l4 Q
long  OutStream;( A: }4 o1 O: j0 u3 [, D
CFile  BitmapFile; CFileException e;6 j4 b* i: I3 ]7 b" z
double  SkipFloat = 0;) o" o, H9 Q, O# u: Y1 m- Z$ c& k
DWORD  ByteSkip = 0;
0 i6 M  P- a1 T _ULARGE_INTEGER RealData;
' b8 b4 _- j  _5 O
5 p4 u+ O/ G* W4 s9 ?/ v, S
* N* Q; e: N8 w. {- Q8 t' f# u7 T. S7 `* [. U  g
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer( L0 X0 Q" |, V" ~$ q- I
/ \3 o4 N# F+ i' V3 P5 g4 H. @

+ p0 H, S& @1 \8 ^) B4 B! k+ |) c+ ?5 Y6 G" j
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,- h+ y( u/ V. L
    STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
  [2 j' B' t7 P% |
5 L) _8 K2 a, i3 w! u
; A2 Y, Q. K" U: Q* |# J" k9 D! e+ i" U# G; Z; V
hr = pStorage->CreateStream(LPICTURE,
4 ?* e6 M/ b& ]" k   STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);6 C7 H7 I" C' z; Q$ I) |! `2 H; |2 A% }

1 z) Y. C! H" r, V$ J/ H: A! @) C" O6 H/ ~% e; M3 x

, k, q: N) O2 N4 D m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
1 S2 a9 m$ a0 z) `: x& I FileStream->Release();
4 _+ |) M1 O, `5 J5 ] pStorage->Release();
# q# d, H% G' @ Buffer->Flush();
" {2 F% m: C8 D' [) r) r, ]! p) Y+ x; k9 h& @

; G6 W* j6 D' S8 x
  S4 o" J$ G; q' i // Get Statistics For Final Size Of Byte Array& ~5 [- a6 g: f- o: w
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);6 l$ N" D* Y( f) K6 h. \, k% H

/ m, v8 Q9 J$ ^2 V) {' @, K6 v6 l$ E2 X
% y# _; \) z1 g, c4 h
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)& n: q. o, Q! \) `/ d4 }7 R
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...- F  K# e) d- q  V* M% B
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
6 B6 U5 V+ E+ K" [ else ByteSkip = (DWORD)SkipFloat;
) X: W3 {& q( p3 y$ l2 C ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...3 j8 `5 J' ^% ?* i; h
( v8 c/ Z* n% }
// Find Difference Between The Two Values
8 C# }% A+ W" E ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
6 C5 z% i8 D( B5 _9 a5 G. `( G2 l
6 {+ w) l; u# T. m: a2 ?
1 W# O  B2 K# E6 s
// Allocate Only The Pure Picture Data2 n# A  \. z) A$ U9 X0 O& F- K* f1 ^
RealData.LowPart = 0;& |2 b, e5 F  p) [8 L0 C" o
RealData.HighPart = 0;/ q: z: O. z( y& I4 h
RealData.QuadPart = ByteSkip;
) v) y0 o5 H! q9 s9 L" \. m BufferBytes = (BYTE*)malloc(OutStream);8 d1 c4 \; Y; E9 ^
if(BufferBytes == NULL)  X0 o. Y6 i0 i( }
  {
: w! Q" L5 |1 y6 S: ?9 A, |  Buffer->Release();: p& J5 f3 N2 D2 d* N4 p* q
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;0 V1 n# V1 G4 h) E/ l% w+ O
  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
. h/ Z( d" {! v+ D& r; @  }4 X# ^. R# D: d4 V  a) [# Q' r# Y

; V, H: C9 G$ r- n5 J, L+ Y: U& t. |5 w% ~' q

/ g0 }4 j5 V* y  y Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);  k" G8 U( B2 n  G, _
' X2 {, J% X3 x
% a* |# ]6 w; H( I, ^% E
: B( @- A3 G0 ?; S; |
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))7 h5 k2 x* e$ O5 k* f9 Y( Q0 `1 S* Z
  {+ r9 R3 S' n, s
  BitmapFile.Write(BufferBytes, OutData);! ]$ ^2 S. P8 X# k& j4 O
  BitmapFile.Close();
' C% d$ N6 n. Z) W! A2 P  bResult = TRUE;$ X& o0 K9 B1 p9 j$ l/ x
  }
+ T+ ?1 E: n5 M) ]2 E/ H" } else // Write File Failed...
& C; t3 a- k. ]( D  H6 W9 r  {9 ~4 d# X0 N# k8 S5 u
  TCHAR szCause[255];; o; G3 _  I) v' M
  e.GetErrorMessage(szCause, 255, NULL);
: v0 T! R/ o9 @2 h  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;9 b9 B5 e, Q1 R# H4 A0 M# N: z
  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
  ~$ b, P/ \# o, W  bResult = FALSE;: T" q, o' ~& d7 A8 G9 H3 A
  }. y; K; q# S- T) I9 w
$ v8 M% z" S- ?/ Q3 ~8 w
Buffer->Release();
/ F& t6 j/ `& d) C* s free(BufferBytes);
- ]1 t. s% q) {" ]  G* y% ~' T& h! `" n# W5 R4 p: A/ ^
* x- @: F7 Y  ^! ~' \

: F$ Y, O$ {0 y; V% V1 m return(bResult);
3 v' X7 Z6 G, _% V}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 01:42 , Processed in 0.034514 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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