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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)
3 D: K% a8 @! ~* }% b//=============================================================================
2 l8 t4 T- V, u% I$ \{
: \/ o# W; z% a BOOL bResult = FALSE;
" y% i* ~: P) U% P9 M4 f" D ILockBytes *Buffer = 0;
  T' b; H; }0 r( W! | IStorage   *pStorage = 0;
9 F; X/ H1 |$ {* q* D0 e IStream    *FileStream = 0;# _3 Z, A7 s6 _* g7 _1 q
BYTE    *BufferBytes;! v$ L' i3 c5 R% l% J8 y
STATSTG  BytesStatistics;
& x* U5 v2 N7 R% t% _ DWORD  OutData;$ e5 d5 h* O  f& q, S! p$ \: v- x7 K
long  OutStream;
/ J* I! C$ t5 [; Y/ v# U* p CFile  BitmapFile; CFileException e;
6 G' }) ^6 I" w" R3 L$ f double  SkipFloat = 0;
% v! b6 a, k9 o DWORD  ByteSkip = 0;
/ [# C- O$ r- b4 `5 `8 }3 ^) M9 `1 C _ULARGE_INTEGER RealData;
3 k) I# e$ J6 N; H! \
& ]  k+ o9 [& I" P' Y9 E
$ y' J. w6 D( ?) u; w/ g) H; u' R* C- w
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
$ i: |0 X2 s7 I3 O
" c+ R, b* v# _% v+ ^
9 s% T, Z* V( G5 ?8 U& R; R! Q! S2 u# z3 K2 ^# N- Y
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
) {5 ^% h6 b0 }! q- e7 z1 T. g     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);. y- M9 \6 T; ~" M4 R" a# A

  ~* N( d( V! a5 l6 g/ o0 d& O/ F. c0 }+ U

8 @. u  J8 B1 L6 ~. Q; n( D hr = pStorage->CreateStream(LPICTURE,4 V+ H% V$ Q' N! W9 g/ \
  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);0 X  A2 Q# K- N0 W; C( C! a

0 m! d% l, v; L* X4 b, M: D! m+ u! k; b( a) d7 J/ V/ Z$ c/ ?4 {' Q" Z4 {7 H

. g3 D4 W* C" d; \ m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream% P: n, v9 K* [  N
FileStream->Release();3 K& G) K$ k" H1 h9 m( X
pStorage->Release();
) P: h: H  J7 a Buffer->Flush(); / U+ d4 g: o2 p( ]1 J

" z, ~. c$ P$ k8 E, D
! o& _8 K9 d3 P: w- g5 _
9 l7 ?7 \$ G% |9 r4 g // Get Statistics For Final Size Of Byte Array- M0 s5 E" s( w7 U, t
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);+ v8 \. x/ y4 J

6 k6 n4 Z; q5 z0 S1 X: {/ y
5 r9 B2 n+ b8 I+ q2 x2 F( p
; v2 Z0 j5 |3 b8 L // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
2 l) R+ {6 c0 J; _6 L4 f) y SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
. [* i4 \  S: I: n if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
5 @0 n! {+ P; g8 C2 L else ByteSkip = (DWORD)SkipFloat;
* R) V2 W% b5 ^9 F* I ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...# C  T, F- H% L) u6 V) Q' ]

0 O3 O" a* h+ O6 s2 q+ a; M& j: i // Find Difference Between The Two Values. @/ Q: f% b! i
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
7 y# x  A( H1 n7 M" D# h% L& _+ Q/ U1 [& {7 e

/ b2 X" s8 x6 O* l- K/ e$ a; Y  U; R' W! b1 }9 q) G+ U6 s7 Y
// Allocate Only The Pure Picture Data
1 `6 s' `8 h  [0 v* V& W RealData.LowPart = 0;1 ?- F5 V' {+ V. D7 }( h7 K; Z! b
RealData.HighPart = 0;3 o7 g* U  K( G5 m' z; X! G9 @
RealData.QuadPart = ByteSkip;1 x1 Y/ w' u4 o& S1 d$ }5 Z2 z
BufferBytes = (BYTE*)malloc(OutStream);8 U! s: U1 P  ~0 s+ R' e
if(BufferBytes == NULL)& I5 ?8 J3 m9 P% ?; ~% @$ ]
  {
. q* ~- v5 }! \/ m4 e4 ~2 f7 E  Buffer->Release();
6 Y6 q! q# G: R+ `7 d  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;0 u+ R6 M3 p* E" h
  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
2 |% P3 ]" W, L% l8 [8 d6 c  }' s, D7 K- z  m" x! K4 o4 L5 @

. F8 v+ ~( ]" R. u% b
6 u6 i# \: h' F! P3 q% W
" k8 Z; {8 \% `' P+ L' g- k Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);& m. \/ P. |' o9 h
& D- ?( W# X# C/ ^- v

' [7 B; M7 l6 b+ P2 v: ?, o9 N1 o) o; H9 r' E; \
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))1 f: O4 D0 G! v% K
  {
- S, `6 a4 v8 ~. r# Z  D  BitmapFile.Write(BufferBytes, OutData);
& p8 n" q* r/ A# d( z  k  BitmapFile.Close();
5 `) }7 O- Z8 c0 N5 i, m  bResult = TRUE;
/ K8 d. m9 E% V6 p  }$ S+ `, W$ i) z  `+ z
else // Write File Failed...
% o) l3 W. k8 W8 q; \) p  D  {* F5 g+ v2 m+ [
  TCHAR szCause[255];4 ~; V2 g& j2 d( Z7 Y) _
  e.GetErrorMessage(szCause, 255, NULL);$ |  Y8 K1 E# p0 N% b$ @9 l3 f
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
+ f( C+ r. `  R% e" w  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
6 h4 S* C$ L3 C( y  bResult = FALSE;
5 |3 x) l1 p) V; e; s, P3 E3 w( B) o% r  u  }9 Z% U4 A" x( N, i: P+ _

! y# A2 E" v. @' E Buffer->Release();
% m+ G3 U! _* z3 g! h free(BufferBytes);
, C6 ?6 S( V' Z! u+ k2 F: W9 a0 I, O7 o! m, ?" t

/ M2 E& b: z: Y) s, w2 _
/ {1 {0 k& C7 w$ [* O- R/ I% |& v return(bResult);  ~$ C6 L! p' Y3 K
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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