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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)
8 ~8 m& f% a& T  u0 X+ t1 m//=============================================================================/ U0 ~0 J  a/ r: F. x( }
{7 S" l5 F7 Z* @$ F+ c( @5 b. T
BOOL bResult = FALSE;
  W5 \7 I7 i) y& K ILockBytes *Buffer = 0;
9 u8 p0 H" o5 s& y IStorage   *pStorage = 0;8 Z2 M+ _' B& i  r& ?
IStream    *FileStream = 0;  V# X& s0 d- y% o3 R6 L2 W0 h# x- G
BYTE    *BufferBytes;3 i5 d7 V7 i/ S; w2 H
STATSTG  BytesStatistics;6 [" L. J+ E% N- J4 a2 {- y8 t
DWORD  OutData;
  S. h9 z) N& t0 ~. ~ long  OutStream;+ G$ m* N* d7 t9 @' [  L
CFile  BitmapFile; CFileException e;2 m- s5 j3 Q8 R9 G3 O9 [8 q; H, ~
double  SkipFloat = 0;
$ {2 X' ?! v6 A6 e DWORD  ByteSkip = 0;
* E7 D, z9 ?# E+ Z' X0 i8 _7 t _ULARGE_INTEGER RealData;
4 w- S, y  i+ {9 p* i7 d: |4 o+ I6 V+ E; }% o
8 y5 `' I. {9 {; ^

( C; ?4 W$ P8 f2 z0 P6 y4 W CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer8 i( E. \8 A0 M! P3 B

5 }' x; O/ j- R- z0 k3 V% ]& R* {/ ^& x0 i0 W  E! ~4 n; `

% e8 g$ @- T- a% [ HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
3 x# m4 o( i" S) l7 b( x     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);& n  _0 Y5 r, b) S4 H

4 {- e& {0 n% L' f7 H% e* |5 G% u+ m

8 N+ J4 t- z) F; q hr = pStorage->CreateStream(LPICTURE,( R2 g- \5 s# S6 Q
  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);- H/ A' k# H% M) q3 Z- i

# K! A/ B/ b) F1 B' l1 V# X
  X% C8 j+ S% ^4 ^. v2 z6 L( `3 c3 S" v$ @3 k
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream0 U, l& D( F: _2 o+ E; e+ j/ |! M
FileStream->Release();
/ _9 {# ~" i# k$ Q6 l  }$ G7 @ pStorage->Release();! d4 s9 q+ E* V+ ~( G
Buffer->Flush(); : R1 H6 x8 \, N* ~$ c
& x4 [  j7 C$ B, K) J

, ~; q6 U: C, L& z; I0 _& Q( `9 y- t. g; R) x* A6 _$ z: f
// Get Statistics For Final Size Of Byte Array
- B! F0 V, I0 s' n4 H: |/ j Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
' m  M$ e+ S1 E) u+ y1 g/ Z# J0 V2 }/ S! q" W3 Y( v
0 s3 ~& M1 S* U; a  w* Q* ]- C1 D% u

+ f1 I% z( i- k // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
& _' r, S  [5 ?) \; Q. V SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks.../ C' ^0 f2 E3 y* k8 S4 A8 |" ~# x
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
4 E; I, B/ V: n" \ else ByteSkip = (DWORD)SkipFloat;1 S' L9 K' r; @( X
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
9 x: E. }4 Y" d2 R5 x( _6 i$ b) _ 6 d) X0 I2 ~# X1 T. x/ ?3 Q# ]
// Find Difference Between The Two Values
! Q9 |/ f5 p& ?6 r8 J ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);" P( f: T* f- R+ f3 g- U' \# W
2 w' C4 R8 j2 k) G) a3 W

! W& P% R8 P1 ~- b8 y7 @8 t0 L# |1 Z2 @5 I& X# I: T6 h
// Allocate Only The Pure Picture Data
/ o5 [3 `% B: G! h* B6 S RealData.LowPart = 0;, ~5 p! h2 E, M# t( ?2 @8 t
RealData.HighPart = 0;: p/ q6 i9 V- ^" o4 M% D( y
RealData.QuadPart = ByteSkip;* d; V! `. V# J$ h( b
BufferBytes = (BYTE*)malloc(OutStream);
, u, |" _! j4 |+ v+ Z if(BufferBytes == NULL)* L. c3 A" T" o8 o0 ^& ]- J
  {
0 S8 D5 E% N% v( I' u1 _6 q  Buffer->Release();
" H' Y! G( ^, Q/ L  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
! I% l6 N, G7 e. g% L' M  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);! L; c6 h$ b+ R# D' `
  }) |) n$ Z1 b3 D$ `, W) ^2 X
$ X6 a& H# _8 ~7 W% h6 l6 o
7 X1 }8 k- [  Z- U' F4 r6 f* ^

- v3 Z; G4 ~2 X. G  q Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);2 j' T/ ?# C+ A1 g0 T

% j4 m0 F; x* F& ]9 G1 P
7 y# e1 x" l+ g5 y1 d4 ]  l
/ }. _3 }3 @* Q6 ~5 g2 R8 y if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
0 ~! k% G: ~' S3 P  {
# Q! g% I  K( w3 s" k0 h  BitmapFile.Write(BufferBytes, OutData);" x) r  d% c7 X7 v6 S3 ~0 p
  BitmapFile.Close();
2 X' @' D* r2 c' d  bResult = TRUE;8 I2 l- v& ~2 ^" U% l
  }6 Y% ^) G3 Z7 L1 `1 [" W
else // Write File Failed.... r9 E1 X, b) K  F- b1 S1 u. E
  {" x0 o3 i; t, o2 r
  TCHAR szCause[255];
( L) |! W" f  f4 C5 ~  e.GetErrorMessage(szCause, 255, NULL);
7 S1 p% }- c+ Y5 z' t( Y2 U  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
9 ?/ K* W# T" N  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
0 {) b; D  k# f9 m) h& ]$ T% c$ Y  bResult = FALSE;; \2 J/ P0 n4 W" w- w; E+ x
  }
, G7 ^1 i4 N; a
6 k3 C/ \! }: o6 S$ j/ p Buffer->Release();
/ r  f: a7 D1 T3 N$ { free(BufferBytes);: [4 `0 w+ p. V, n! l0 Z2 h

+ e) R& g9 `& n2 x* \: w$ Q3 L
  J. ^7 A  ^# Z" L/ S: H! N! ^
( x2 H  R/ ?& u- P9 p% O) s  e return(bResult);
$ I& [( `1 f3 L2 f5 ]7 m+ U8 W0 J9 g}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 10:55 , Processed in 0.016903 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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