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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName), |$ H0 G& E0 `
//=============================================================================
# [+ ~0 z$ s5 L$ D# B8 C{
# k3 h) d3 [3 p# I& |, }7 q BOOL bResult = FALSE;& _+ q4 f4 C; c: L/ p: ^  p4 f
ILockBytes *Buffer = 0;
: c' F& v" J) H- a" L7 |' M IStorage   *pStorage = 0;4 W7 h7 d3 a) T' W1 ~, V$ F( O
IStream    *FileStream = 0;( [4 ]' m. [8 ^% W1 G) _
BYTE    *BufferBytes;
4 r) k6 [+ i0 S! y* j STATSTG  BytesStatistics;
# c4 |, K: T/ y$ g5 X DWORD  OutData;
: f5 f: [5 }, w3 T long  OutStream;
+ N' t, b3 i  `. i/ ~- z& r CFile  BitmapFile; CFileException e;1 E% I. y' p' F5 K( Q0 e5 X' a
double  SkipFloat = 0;: X  g, z/ t0 I) B+ ^2 @6 o6 {
DWORD  ByteSkip = 0;
5 m& r- I( @: }3 o+ l5 H+ R/ I _ULARGE_INTEGER RealData;' E6 v3 P, c; x) K' I0 v

7 Z8 \2 c0 R" G3 y3 d6 F* S2 Q. z2 {% m2 S  c$ i

! P8 H+ L: R9 I CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
: Z9 m! ^! c* z( O0 j0 ~7 _  [. W6 q/ }  @5 R1 A  i, \
/ _/ o# R$ e& }# W: l4 E
- \  G& w$ v2 _* G
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
5 y8 f' _) ^4 I- ?9 ^" @     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
& H2 o% V7 u& U5 ]' o0 A8 o# f
& o9 M# ~, _# \! T/ i0 w  I* Q* e! J+ Y
9 p+ Z, H: o. w
hr = pStorage->CreateStream(LPICTURE,
' N2 A" s; V* F% S   STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);3 B6 n# n. w' B0 Y: m  O- ?

8 i* r! @9 I5 B: s. b+ y2 g' j0 Y# k2 b" q0 ]

* O( H: c" m% U/ a) m$ P m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream1 e. t4 e) ~" t) u0 b
FileStream->Release();! e9 a1 ~4 V) B5 E/ J
pStorage->Release();2 G' C3 k, z  l+ i
Buffer->Flush();
  ~) j3 H% V6 x; W# f% k8 k$ e0 h5 p& Q& T6 m$ J; \- a1 F
+ v/ J1 o8 F& v% t+ u
1 U/ _% D0 D- p& I+ v
// Get Statistics For Final Size Of Byte Array+ x  n5 }3 V  W2 u4 K  x/ W
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
8 F! L2 ]0 h# S" u7 O, D1 L7 k. W9 M1 l- O) L6 v8 u4 p, Y5 o
, q$ m" s5 w- a9 G/ T' Z
$ d& A9 J) e4 w& }3 h
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
; }; s7 d' e9 w% L4 F# y3 v SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
2 @' k' _) p% ]" g  _. N2 i- Q if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
/ z4 B6 \1 S, X0 p& M2 g* { else ByteSkip = (DWORD)SkipFloat;3 v' f2 H: E7 d1 h4 V
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...7 z4 b% E' q4 G, C$ v( M
1 e. z+ E( M3 P( W. I( J
// Find Difference Between The Two Values
$ |! u* P! W$ {6 U( t6 y ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);, h: l! t. o9 B( ?2 H2 O% i3 S

) N, o. n& [2 ^. q$ I# f
# l% ^/ b% s+ q& n. G: k- u- f
7 ?2 W  o, p2 P, C. } // Allocate Only The Pure Picture Data
& s: l0 J0 z" {$ b- u RealData.LowPart = 0;
: K" \2 c9 f6 ~2 u" F" s& q/ j RealData.HighPart = 0;
% Y# v$ V, [9 J& _. i RealData.QuadPart = ByteSkip;7 Y" V4 G4 q: W9 }1 [3 V% L' w
BufferBytes = (BYTE*)malloc(OutStream);
  R2 }7 H: K: H0 H" k- u% [ if(BufferBytes == NULL)) l$ B1 p. m% n' w. X: F! p
  {3 ?/ M) @( I8 Y" L* d% v; P
  Buffer->Release();
) ^# ?: K6 O3 q, z2 y$ s6 F  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;% S6 g! ^5 M* \1 s0 ?) L
  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);0 a8 N- C' m' P- o" \
  }* l5 J5 O# J1 x
" T* G! |1 O0 Y+ W4 K9 o4 @

! d( o6 M2 q! N4 K. f; ~7 j' t4 }* d( I
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
$ m  ?/ h6 l/ n  @  W  P0 C2 W0 f8 M) T, G( O
% N7 u! \2 v9 Y" x5 ^
: e+ X7 q: m* ~7 P% b6 E
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))' }" z+ [( o  D
  {% J: _. `& D% S# \
  BitmapFile.Write(BufferBytes, OutData);
" W5 m* v" g2 E: F/ S  BitmapFile.Close();. |- Q$ ]# ?" y/ e( _2 V
  bResult = TRUE;
( b3 q* j! {2 ]- W' L* n  }
1 b7 J6 P4 ]9 P" Z! g4 d else // Write File Failed...: p* v0 t8 I' K! P; q) B2 |, g
  {
" q/ x( ?/ k& d1 a9 z" M% }  TCHAR szCause[255];
% q- N) G! M4 S* t) z, p- l' ?3 g  e.GetErrorMessage(szCause, 255, NULL);* u- _) N0 k. k1 V% j& ]4 A6 p
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;2 E. n1 M8 Y! Y! M
  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
: r1 c: s+ R0 q  y* w1 }2 k; P  bResult = FALSE;
; ]/ ^- X1 [9 b) U5 ]  }: m5 _' k+ j0 t

7 x. X4 {  _4 l0 C: I4 y Buffer->Release();+ m* D0 S' q0 q" k* ^0 F" n% t5 b: d
free(BufferBytes);
9 ~, g9 v, H, o& y  z% h" _* t: `$ O$ q7 q, G8 O& k& x

4 F4 U1 o" c# R( u, J0 `1 m4 k" ?1 V; M7 K7 N1 M* `
return(bResult);
2 s, X! w) i+ _9 f: D7 w}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 09:02 , Processed in 0.019658 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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