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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)# H. b2 K& {% o& w2 V/ s8 y% m
//=============================================================================
) H" v' N5 r# G* G7 G% u{
) e5 U% J' ~, |  h" S  g/ C3 m; E BOOL bResult = FALSE;
6 A0 _7 J( N, S9 m. A- k0 @9 k( Q ILockBytes *Buffer = 0;
$ M9 t& L# q5 ]! z) D; O IStorage   *pStorage = 0;
# C, l1 A: c  e( ~) M3 Y IStream    *FileStream = 0;& z9 L3 N- a5 T7 x# l  o) M
BYTE    *BufferBytes;6 l3 m- a" @. f: I
STATSTG  BytesStatistics;# H' a6 t6 P" H! z
DWORD  OutData;( C. v: N* G" }. d6 x
long  OutStream;
! O7 I+ c2 L8 n* v% \( [ CFile  BitmapFile; CFileException e;  Z! h- n  w# i# r( z* Y, y1 e  _$ \
double  SkipFloat = 0;8 i* l6 T( M# u9 x( ~$ F5 \
DWORD  ByteSkip = 0;: l$ x) K. Y3 p* `# P# X; u
_ULARGE_INTEGER RealData;1 U9 b9 q! \' I
) i3 `5 q7 Z4 ]5 N+ R4 M( R
- w, ~( Q8 G% Z0 V+ A- Y

3 A1 Q  b' t4 G& e8 L4 w CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
( ^; ~( U  @6 Y0 E& w$ A+ a1 x9 j, q, |, a

9 K- @  D$ h( |3 S. J, g% x1 L; J& a' T6 n7 N5 Q+ L
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
9 S3 a( f7 k1 Q+ F9 Q% C) J     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
9 Y9 I/ t1 k- q/ @% i) ~, R. Z
6 |# c4 V. C9 d4 ]1 `3 I9 J6 t
2 D8 _5 o3 D5 @4 e( I/ N+ L2 W3 t- c" s9 P
hr = pStorage->CreateStream(LPICTURE,& `3 @: W' k+ n8 Q0 }
  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
: F8 G$ b& }( m9 o9 n" N' E) A0 F: N. B! s
6 V- y- {* u* ~) |& W% y+ `8 r

! a2 k0 u4 {9 @& d- Q) T m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
9 t. U, _" z8 F4 ^3 { FileStream->Release();  X2 S9 M$ O+ U$ Z
pStorage->Release();
0 M9 Z9 m4 g# h$ b7 ~ Buffer->Flush(); 6 m6 u5 L" g, f0 `- Q" q4 g
% a9 C3 H1 J" o$ `! E* c4 d1 I

( ~! E; N; e3 `" r" T4 Y; j4 n% h. U- F0 _% b5 i3 a) f) D
// Get Statistics For Final Size Of Byte Array
" u' k2 C5 r, d" u8 t# z6 e Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);( A: `; {* ?3 J, y* N$ w6 Q

$ E& x9 \4 ]2 m" r9 w2 V% M- R- U
2 r8 J2 ~5 y: C1 j' c8 d/ G. A& O; g. r# T
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
% j% m' E& H( d! F/ _6 V SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks..." m) {" ?# j" [4 }; H  m
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;' m+ z0 l8 R5 f1 G5 U' @7 o  J, M& [
else ByteSkip = (DWORD)SkipFloat;
- |" H6 i2 e1 @8 Q' _ ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...6 O! R% n- j  c+ x$ b5 P

: e4 w. ~2 u: m6 Q8 Y4 F // Find Difference Between The Two Values: d+ b5 Q7 b* G+ d, _6 W
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
( M6 f- a3 I6 Y2 U+ w- K
, x  U1 }" N+ l' {& e
6 x/ o, C6 i3 x5 c5 b) X6 e) R4 |. k: c' @0 y! ^1 S1 t
// Allocate Only The Pure Picture Data5 H2 H5 y% g5 A) B$ z: m0 O; }: i6 b2 e/ Z
RealData.LowPart = 0;2 H( d$ ^; |1 L& |0 X) C
RealData.HighPart = 0;: H1 j5 v/ h# a
RealData.QuadPart = ByteSkip;0 |" V7 W1 f8 }& u1 `7 S
BufferBytes = (BYTE*)malloc(OutStream);
  b8 s5 F, `  F- L; B3 m if(BufferBytes == NULL): s' I% {3 \: j
  {
6 c( I) N3 O  {, u# Y7 M) U2 D  Buffer->Release();2 ]5 h4 k0 Q: R3 S
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;6 v/ j6 L& [$ t% d, M1 J% `0 Z
  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);/ m1 }5 u: K) B  x$ b- L7 R8 C" K- k
  }
+ i5 [4 R3 L5 a- ~, N" J9 T
: l! c* S. |/ c: y5 v& `! t
% s+ k, t# M7 V2 T  Z5 y2 H, ^+ h( `& P
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);- e8 `/ I2 k8 h- @
* _( S/ {; A  V

# F! e& N, j7 k% n
/ x! p5 x3 H9 |: X if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))  [* }# L7 E& l! J/ }
  {
8 W! c( @, {2 z; w( u  BitmapFile.Write(BufferBytes, OutData);2 u* b& r9 d* |6 z  O7 L  [" k
  BitmapFile.Close();
! P2 M/ _# A4 K1 ?- b% I: }5 n% ?  bResult = TRUE;  S- {( p7 x6 g  a: l3 d0 z4 g
  }, B; A6 \, ]* i$ a
else // Write File Failed...
) a/ q; ?3 U  r: g  C5 N  {+ j# k  ^" I# v3 ?- r+ `: A; `
  TCHAR szCause[255];
( S& C+ n6 a& u' f9 q% [2 t+ z  e.GetErrorMessage(szCause, 255, NULL);8 _* z, _2 K: ?' f
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;$ ]. ~  k5 A, d5 k$ u8 B
  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);2 H+ ~$ b' n' B6 M8 j4 E, L5 H
  bResult = FALSE;
2 v1 y. u2 q, ~8 C, G$ m! n2 d  }% x! e' D( o& v, G- g
5 v3 z8 K# |4 S0 o+ P+ z
Buffer->Release();3 t; I: |8 B8 s8 i
free(BufferBytes);
5 @% u$ f' D# H) T6 C
* |* l9 E0 X8 P% i; Y4 Y4 \. d* L4 M% h9 A$ p
2 I% V' p) a* R2 _
return(bResult);
; @% U  i5 Y' \}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 20:15 , Processed in 0.021448 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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