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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName); C9 N) q) ^( C" @4 o+ ~: y/ A# u
//=============================================================================7 n+ p% Y# S6 n$ w
{- I1 x- b2 H# R" K) F1 I& g3 J
BOOL bResult = FALSE;3 \3 z+ ]# u- f6 h/ Y1 }
ILockBytes *Buffer = 0;$ R5 Z, L9 j0 D- N8 _
IStorage   *pStorage = 0;
6 k' P, V7 @7 J, i  I" e IStream    *FileStream = 0;
" ^( D$ }' T' X2 D1 X  g BYTE    *BufferBytes;" B$ N! U1 z: a" b: D" o
STATSTG  BytesStatistics;
9 ?1 A: F( H! P& c/ b0 f  E DWORD  OutData;
$ I5 C4 x/ t2 w. [" m) J long  OutStream;
* A3 B0 b5 t/ f* A& i+ r CFile  BitmapFile; CFileException e;% L: i% H& V) U8 g
double  SkipFloat = 0;" u2 O0 G: O% T) K& ?0 R
DWORD  ByteSkip = 0;
, Y6 q" ?2 S$ E) i- h, B( W0 e _ULARGE_INTEGER RealData;
, V; D" P; G' s$ J. }4 b
4 T3 g- U% h* p& V$ T  Z
% q" B; P- W, X6 e, k+ _' k) I- H: e3 o1 ]) X. C
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer4 `( G" k  U; O, y  c

! {6 d0 t/ Z; `
5 T3 o1 m5 v% p# s* g6 }- r3 B  l# h$ o
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
. @7 H' w$ ^# C9 ]. e     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
* G  r* f7 P7 P3 L' m4 I
/ U- K1 N, ^8 m" X5 S+ n0 [
$ K  h( I! c6 q- T) b- u4 h
6 g  s" f7 ]' `. d1 N hr = pStorage->CreateStream(LPICTURE,& H+ S2 U7 l. V+ o7 [
  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
; V, [2 q  A: _. _9 h$ Q( m' C3 J& y' u+ y

) [+ U! V8 s1 M! d. h% h
8 U5 j; g+ K, `  M$ y! {+ W5 J m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
9 k; v- C/ h1 Z FileStream->Release();
( C2 S" c3 ^  L8 t' b pStorage->Release();. P# G$ m% ?5 ~7 H& l
Buffer->Flush();
2 B- m) v. I& P1 g; K$ Q5 e7 T% l) e5 O7 E( X, N$ Q

! S5 Z: H4 [' E( K$ a
. u; W# Y: c( z2 b // Get Statistics For Final Size Of Byte Array6 X: w# Q3 e; G# ~* A/ u* U& ]
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);5 t% u& x1 ~6 |% `$ b  Q

. |6 ^; Q- w4 O+ ^
! ?, [8 _2 ?6 `0 M% I) x  D7 D
& m( ^' p6 y$ b$ X; s) s2 m* j // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
0 W" i0 F' c: S. X  t SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...! X5 a' Q" X( f
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
2 B* R* m: \4 R: Y! _ else ByteSkip = (DWORD)SkipFloat;
& E0 q* i( {0 {8 @$ ^. f ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
; c" L3 _8 ?- C6 B7 P
( z  N' o- v0 h' R% o( V1 M // Find Difference Between The Two Values
1 H- J" j. `0 }2 ~ ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
: q# m4 c5 e  E: ]& k1 ], f4 A1 w) d- _1 e
' |, r$ `2 g9 v" G; a& A5 |
. Z' R  J3 K4 y  ~* O
// Allocate Only The Pure Picture Data
; n. h4 o2 H# B8 R RealData.LowPart = 0;
4 a5 _' {. ^0 t; q: ] RealData.HighPart = 0;
3 k& P4 L- _* S# O! \+ c3 l& E" z! a RealData.QuadPart = ByteSkip;9 Q& e9 R$ x9 b8 c
BufferBytes = (BYTE*)malloc(OutStream);: O+ I6 H8 y$ [/ |) |+ X  l1 J
if(BufferBytes == NULL)
* {9 D# A1 s* @  {( K2 b8 U! D) Y4 x; ?
  Buffer->Release();
2 I3 M, d* ]9 j7 j  P  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;, D. W% G7 n- t/ c, z& q
  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);+ B2 J: ^) \* u
  }
. l; E7 a0 ^; W
4 @- Q3 C9 Z* |2 ]* M( ?' J9 P2 ?8 u; `& U: D) c8 {
* o8 L9 Q* a( A. U0 z* i/ f* F- s
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
- L' g! s; {* \2 A. q
2 p# n$ j' b: r: l
1 A0 o* p& w, F5 f6 D, Z7 r. }
, k; k: ^* B  f8 _  V5 [* M. f/ k if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))3 M( o4 e0 }- {8 V7 t
  {$ n/ q- K/ ^& H) W2 c6 [
  BitmapFile.Write(BufferBytes, OutData);
" m/ @5 R- ^" W/ A  BitmapFile.Close();
# f3 N$ u9 B6 {2 w8 f8 I  bResult = TRUE;
1 K0 @4 s2 _, O% r5 `  }! Z3 D, ?$ A( o7 Z9 y' H' W0 L
else // Write File Failed...$ ^) d2 E. o7 |, w1 A" _
  {
. l/ N7 d' K$ ]9 P  TCHAR szCause[255];
+ ^1 w8 V1 S0 }  e.GetErrorMessage(szCause, 255, NULL);8 S7 L5 ?2 N  d: ]( S
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
! C$ |- f' v6 o  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
3 r+ S: e! J3 d8 {  bResult = FALSE;2 y7 N' c! d! [& {( Z" V
  }1 E1 M$ o9 W/ L1 J

; G: {4 H& x- Q, i6 ?9 h9 b Buffer->Release();
' q4 O* S& `( ^ free(BufferBytes);
1 i& z3 ~# k1 Y" j8 R+ o4 A) x- W9 U- X' I3 v

5 V  m1 z% v. h# _( d; R3 A/ c4 ~  t& j, _2 L; L9 f: ]) i
return(bResult);1 L$ \3 s) F' \
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-29 22:23 , Processed in 0.026721 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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