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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)% s6 b. ?. p3 t* `% o
//=============================================================================- ^' F. H, h+ t1 t5 w
{  j3 X/ K! e! t5 ~' x) C
BOOL bResult = FALSE;/ s# J  w# E0 @
ILockBytes *Buffer = 0;
5 N9 O8 W# ]2 d# p IStorage   *pStorage = 0;
* m5 ~3 I' I% Z# T" ~ IStream    *FileStream = 0;" k1 X& C! c; }+ u' A+ Y
BYTE    *BufferBytes;
" S6 F4 z2 V' o& K STATSTG  BytesStatistics;. ^. o0 g- B4 i! h" k
DWORD  OutData;
& _: e% _9 w, Z long  OutStream;- ~+ h* {" E5 ~+ A, d' d: V' w
CFile  BitmapFile; CFileException e;# K/ Z, e/ B) K# s2 h: D$ {! s& d7 W
double  SkipFloat = 0;
3 r% Y' Q, c* q' x) A DWORD  ByteSkip = 0;
: F. _4 \+ j/ x% n8 X  b6 j0 A _ULARGE_INTEGER RealData;
/ i. e2 U; i- Y9 B3 O, \6 u* q0 G) D% `* `- G3 |: r) ]; Z

- L# P! {( t/ `7 I# }$ H1 V; U" P& U! |
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer) D- Y3 z( |. v7 \2 l5 P+ Q( w( m

1 M$ g2 L$ l8 ?6 D( q% C- C
. |" z7 u% w. Z4 W& E
8 I1 y4 ~2 B4 X, ^  S" K6 x HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
$ `; ^! a0 D; `# U2 {# i     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
! y  v2 J6 c6 K: x5 k, U9 b" l, j- A* R( j7 }
9 s+ W7 x8 ~+ s5 G3 \2 c

  v- g  \7 a5 G6 u& ` hr = pStorage->CreateStream(LPICTURE,
+ f- ^6 b% ?; k. s7 f   STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);# r4 d/ s! p! u* K
; e  S: p8 x/ E* u+ F3 Q
  L) }) `5 Y; P. Y, W+ F2 x
% N/ @* `+ l, i
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream5 ]2 v: W2 L- G- F$ G& {& o
FileStream->Release();
) E$ `/ i: l. f( _' v pStorage->Release();
  E/ t' N, x, M  o. e Buffer->Flush(); & H, r# x" `. |3 P, m

- O$ T; Z3 u$ @1 l# o3 J: \
5 x4 H9 b4 I3 v+ c
8 h0 a2 e0 K, h // Get Statistics For Final Size Of Byte Array3 W- v/ p* E6 e+ l! K3 O
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
6 F4 m) }5 c" d) p- e
- x/ e% T4 z8 W
: Q. Q- X/ i/ _  F0 ]2 t. F6 R
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)2 |, z$ a7 ?5 U: c, A6 @. @
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
8 p3 ~1 d2 w9 L3 \. e* P$ v+ G if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;1 ~, T1 Y. v5 ]- a; f+ b0 L+ \
else ByteSkip = (DWORD)SkipFloat;
) ~$ r, M# |6 D. b5 [' b ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...8 E9 u# `" @- i* ?
! D3 M3 r: h; ]& ]* Z& [, \0 e
// Find Difference Between The Two Values
: m, ]3 ?  s. H8 I, A3 `# g ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);6 g. ^+ M) T2 k! o, q( j0 p
  \8 I9 z7 t9 m8 V7 M+ `8 U* v
2 b' F2 J+ y+ P4 A- Z
2 V7 ~* Q# }/ O$ W2 w0 V% g
// Allocate Only The Pure Picture Data
1 ]6 s9 F4 s7 P0 h. T. C8 ] RealData.LowPart = 0;
# T* }4 C4 p* S4 x RealData.HighPart = 0;9 i) R: ^# F9 `" T( K1 J8 Y
RealData.QuadPart = ByteSkip;
$ C1 Y+ a; @2 e) o) p5 Y/ a( z BufferBytes = (BYTE*)malloc(OutStream);
# k% z  q5 k  _5 R6 _ if(BufferBytes == NULL)
" @3 T, ^% R5 Z8 W1 h1 R  {& c. d+ C* Y3 ^5 k9 t1 I! }4 q
  Buffer->Release();
. T; I% O4 Q) ]  D- R5 ~2 d  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
1 w7 D- S6 D& h4 h/ \. C+ Y( z  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);8 e, v; T4 b' a6 F
  }
8 b5 F  J* }/ d- H& l. z$ Y. I, T" F. c$ M7 G* [/ c  j
1 J  W% Y; V2 u* S% q9 f# O: X" P

9 a7 k. M0 ~* K! r8 X Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);5 n+ W" e( E; b2 d

- Y  I: Y. o! i" Y2 ]/ T. d& n1 s( A7 y' E% e. Q% G

6 T8 \; c0 U: a4 k if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
2 ?+ M+ |4 B( [, \1 D5 Q0 X  H5 d, r  {# U9 d% k2 z# u5 ?
  BitmapFile.Write(BufferBytes, OutData);
+ K/ h9 x& t& C5 \  BitmapFile.Close();
" W  t* c, j; @4 D2 O# _1 [3 I- [  bResult = TRUE;
' U/ P4 T" M4 _, O8 u  T( Z7 k  }% p3 U! L0 H7 j% `# F
else // Write File Failed...# ]. H. {. }( a4 }$ ]9 m) g
  {
6 a9 {( N+ w. y  X. V  TCHAR szCause[255];; `& e7 d# H$ a( S% g& _) f% ~5 V4 \
  e.GetErrorMessage(szCause, 255, NULL);. Y6 m: F( k$ |6 D* @
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;* o9 _# X1 P2 z
  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);/ m0 `" @$ _) U) U
  bResult = FALSE;
; V& l2 f" D. N7 l+ {# O  }
. r+ W) [  g' H$ o# [9 ~
3 q* @5 F8 c/ P% o Buffer->Release();% m) v  B" J9 Q" I
free(BufferBytes);! }$ \$ w* t9 h* }' l, ?

9 X9 S2 o1 u8 [4 y6 i& b- d3 O. F
- F- }5 Z: Q0 h& @; y7 t% F6 {  H
! x, B' `  q2 D, a5 G return(bResult);+ B' U  P$ M) z( |
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-13 08:20 , Processed in 0.016800 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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