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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)
. Q4 }9 M+ Y2 z* A/ y4 q: P! \9 r) I//=============================================================================
* }; ~- p- e! x! N{, h6 o1 R& T0 }+ O% b% F
BOOL bResult = FALSE;
1 M/ f" v5 j3 b4 } ILockBytes *Buffer = 0;  o" R8 K# [9 j& o' M5 Y# ^5 ^( z
IStorage   *pStorage = 0;& a; i; F9 \5 C5 T5 \; l8 I% D
IStream    *FileStream = 0;1 A) i* U, h  ?) J; o. N
BYTE    *BufferBytes;
2 g/ l, M3 S# T  Y8 U: E. f' O5 y STATSTG  BytesStatistics;
# o3 @* Q$ w5 F- L( c$ a' X& W( q DWORD  OutData;
2 A6 u' |* Q; y  M  u1 X long  OutStream;
. u3 }8 T- v9 W3 |/ n: o CFile  BitmapFile; CFileException e;
7 A1 ]- |- c3 x% v5 \ double  SkipFloat = 0;4 n: L6 E4 B6 y+ A, R* g9 I% I' |
DWORD  ByteSkip = 0;
0 N# _2 j# e/ a  Y1 ^& w, `6 x. t9 F3 t _ULARGE_INTEGER RealData;1 H$ S" v) I2 t# e: Y- F' l

1 z; e: r7 N  l0 f) O% E5 l0 A" ?' h, S; G

6 k5 `/ M0 }' B( H! Y0 A2 N! z CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer1 U9 p' h! [! D9 g

3 G$ K2 r+ n; z5 \+ ]
- l5 O: H; {8 v4 A9 x. `
0 S9 }" D6 g$ P1 j0 D9 v HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,. j0 L; [5 f% ?' H  M$ t1 M
    STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);5 \1 M4 q- @  v! w: ]5 a! |

' Y. }: {) v' l2 h! a* B' v# t
) @1 E% Q$ _# g; {
+ S$ o1 l4 M: `* ^' N hr = pStorage->CreateStream(LPICTURE,
: U+ {) l; f! W6 q: w; a$ h! o   STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);5 z' K6 V! A4 ]% t+ ~
6 m6 g, ^- W7 ~$ c" }
  f- E1 j- J1 X$ Q9 S; |; u
- ]& b- }4 W, ?# c6 g6 L1 _
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
% ~; Z' s- b# b1 F FileStream->Release();! y0 O( [4 Z  {+ b$ Z: a# D! N. [
pStorage->Release();' c" w0 U' _7 s0 h4 N
Buffer->Flush();
" ]! R2 ]% k  X3 Z6 B. _2 t8 B. a3 z7 K8 Q8 c# C( I6 H

7 D% M5 D, O# R8 X# q/ O
- r# _1 {6 @* ^  W1 V6 f1 H0 _ // Get Statistics For Final Size Of Byte Array; D3 o% n4 l) y# X
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);& o- g& e3 G5 u: ]. y& a

4 Z) c8 A$ S& [+ G* x
  ~  I0 G( ~+ |
$ r* W2 O2 `% ?# S$ I4 W) p+ Z5 _4 E3 x // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)+ o( ?7 Z+ d+ u7 Z* W$ a
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
! R; p4 l% V1 f if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;. F% L  s+ _9 t- N
else ByteSkip = (DWORD)SkipFloat;* `  G( K# E& @) J! a7 W; T  |
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...7 {7 ~2 q/ K0 v2 a, j

3 Y* ]0 I. }8 m  _  m4 f // Find Difference Between The Two Values
8 e+ c1 z0 j% A ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);& N( G4 A# B" C8 r! r& m

" q$ \$ A" `9 y4 t2 I, b1 x7 G, }1 I

! w' m  c. [/ e; f! b+ [ // Allocate Only The Pure Picture Data6 s9 |8 D4 u0 `" |' O+ k. r, P
RealData.LowPart = 0;
1 @6 f0 C# y6 O' E2 q RealData.HighPart = 0;' C2 S, I6 R+ D) \" \
RealData.QuadPart = ByteSkip;
* M" @0 D- w: Z( @  h( h, _. l BufferBytes = (BYTE*)malloc(OutStream);
/ [: Q% h1 a  B) J8 T if(BufferBytes == NULL)" G* o  \3 W) B9 q
  {7 I4 [1 ?5 r! p0 a8 [7 _/ `
  Buffer->Release();
0 j1 ^5 e+ Q* z. ?2 k' e  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
7 I) T  o9 ~" T3 }. S  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);& H: V) P: k+ V/ z
  }1 r+ J$ Y& h# V8 a! O9 ]

& `( Y7 K3 x8 J" o$ V: i+ X* M! F; o% L/ R1 @8 r
, z/ x' a6 H2 O. U! Y  T
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);2 p2 y$ ~+ s2 R7 c- G9 ?4 f& P
- ~0 h( r; C& R4 y& ?9 Z2 ?

: ?: I9 J) x7 y4 k, D- T4 h- S  B( J- E2 |
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
8 E. R1 P$ J% J7 _  {' J/ ]+ X3 {0 X% m0 O
  BitmapFile.Write(BufferBytes, OutData);4 N* q( w4 W( g# |  X
  BitmapFile.Close();/ l. K# j. [9 _+ o+ _2 V& \$ ]
  bResult = TRUE;
6 [6 Y# j, C' U- [9 [- P2 W4 q  }
" ?: q: ~8 @6 W$ L else // Write File Failed...# z. w# P0 S8 w, W( J8 h
  {
1 b: i9 X6 G; H  TCHAR szCause[255];+ M, {6 L2 a$ c
  e.GetErrorMessage(szCause, 255, NULL);
; W) {+ N  `% z* E) G, `  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
  x( Q# D7 T$ Y- k* D) S0 b  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);. r/ g7 H  `' _0 g2 p6 B
  bResult = FALSE;
; Y, z! q+ G) B% T, r/ l. k  }
+ U. c* ~' g# W. x8 |6 [
' j0 Q3 l4 J& g8 ?6 E5 i' D" r Buffer->Release();
0 p/ i, W. h5 [4 Y: x" q+ G+ q free(BufferBytes);
5 M* s  a9 ^* x, E$ I; E+ ~/ I  J5 F9 ?0 P3 `* ~! u

! D( P* e4 ]1 V4 L% t( D! M5 N8 l+ F- j5 M  F* b& \
return(bResult);9 s7 i5 C$ X) f; K+ R
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 10:22 , Processed in 0.017419 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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