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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)/ x) J) u! Z5 W1 F7 c
//=============================================================================! Q7 y( |6 Z5 ^  ?: o
{
7 Z" {6 a! O7 P! `! o8 D BOOL bResult = FALSE;
, D( J, p" n! i- z% s0 N ILockBytes *Buffer = 0;# t9 j0 O) M6 v0 p! l
IStorage   *pStorage = 0;, m+ X7 F# {7 V1 J( L
IStream    *FileStream = 0;
  M& t. e% T: W+ ?* w# w( O- t BYTE    *BufferBytes;
2 ~/ y# z1 Z- Y$ f( g STATSTG  BytesStatistics;
% j+ N. X9 e3 e+ ^( o DWORD  OutData;
' @3 |; }) r. f1 o long  OutStream;- Y: |; {4 C, s" x* g' u7 }3 S+ P0 o
CFile  BitmapFile; CFileException e;
; X+ B$ g2 ~, X& w double  SkipFloat = 0;+ _4 B% s- B2 u& J: S  ~% E
DWORD  ByteSkip = 0;5 \1 u* q0 k8 N# m0 a0 L
_ULARGE_INTEGER RealData;1 _- x, a! x' v; A
& m, D* z) N- J7 s- L
# r; D; G/ \, E. a% F0 f
: K$ q" o9 P$ {* B2 b
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer& a6 C" o9 l0 C- O

7 p$ [' ~+ R9 ^7 f/ ]  ^3 \; j6 B% o* y$ A" k

& x' u% A# m" j7 F% L$ f+ W: s HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
) j% Z% N, [8 g; Z2 k     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
* U3 r, E% u; f6 Q  q$ z( x/ ]$ a9 B

2 C" i% c- m% C" `& h
& a, j1 L# S+ E6 E" J1 V% _; W hr = pStorage->CreateStream(LPICTURE,. O! S6 m0 c$ |" W+ a( n
  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);/ Q" v+ `: Z, s1 d" v; ~
' G/ v/ v4 E( p: M$ V& X  T
$ G- m4 B3 K, O
2 \0 C& |& t4 K4 V8 B
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
% m" R; z' c+ m0 y& u# s FileStream->Release();% b0 F# z4 a; u+ e, _  M" ^
pStorage->Release();6 v! v7 o$ @) P0 V: E4 [- Q3 I
Buffer->Flush();
- \4 q" }9 q) \( \" d# ]# f  s; {+ J/ D1 a% A. V
- }3 t+ ^* B$ J" z" |, q

- `3 _' F) E9 J( H // Get Statistics For Final Size Of Byte Array  V: s+ R3 s. p" i' S
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);4 w/ ?9 v$ B* J7 `8 n+ H" W
+ e8 J. h" ?$ `" K

% E. d  ~; F% o
+ @! t! {/ }& u // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
0 I0 ]/ U6 B! Q" E' ]; o' J SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
- Y1 Z4 B: _. _ if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
1 W# a8 _! ^7 _- q3 j+ l* w else ByteSkip = (DWORD)SkipFloat;$ G( E. _6 J0 @4 R! |- O2 Z
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
0 u( r  N8 \" p8 Z
& u: r& Y, l( u0 X5 p // Find Difference Between The Two Values9 T0 {$ ^5 t) k% x; Z
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);% J9 ^3 M; u5 a: a5 o+ p. i

3 x4 h8 ?  O( u! O/ k6 k9 _% y# S
) ^4 U2 f! I0 W: e& O; C2 ]& E1 I4 h! m' c
// Allocate Only The Pure Picture Data
% W7 q, o) |, }6 u/ F# `2 p RealData.LowPart = 0;- n9 G+ e. P; ^$ m) q* f: h$ _
RealData.HighPart = 0;
& p- p" C4 ]0 g! e  a, B8 [& ] RealData.QuadPart = ByteSkip;
. l% `: F7 f$ ^  j; L BufferBytes = (BYTE*)malloc(OutStream);# t  W& O; _) F$ `" ?9 o( n' ]9 m
if(BufferBytes == NULL)5 q8 J# k. ?: A3 y' L1 b2 B( k9 S
  {$ f0 n- Z7 W( B, l* j2 \+ h$ N
  Buffer->Release();
& ]" ^5 f: v$ u4 [  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;0 L3 k$ i7 E2 o+ `
  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);, X$ m$ U5 F6 Z
  }9 b9 I4 R9 S8 p$ Y, B7 e' \
' S, I& a+ G+ c1 z1 W8 `7 U0 R# D
. |+ N3 s5 F' x; x: n- M
& d3 e, K& D5 j( B' }' W! q' G' a
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
' H4 U" Y7 u! C( n* @
2 ?- w5 `: u8 Y% ~" E$ n& f0 b4 M6 a. D  a$ b8 U

' I+ Q: y+ l& a8 c if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))7 W3 l: U6 B: e6 x9 F
  {( A/ i- p( f2 z
  BitmapFile.Write(BufferBytes, OutData);
( X& L6 v- ?8 S1 @4 c" `  BitmapFile.Close();/ p/ s0 l! J4 D. s% f' X. r+ d
  bResult = TRUE;
% Y0 a/ r9 c- k5 {" r& k  }
5 U* G) e3 i2 [- I. k else // Write File Failed...) X# V* e0 w4 Q
  {+ \9 D0 j+ |4 t( P8 P) u# N
  TCHAR szCause[255];
+ h  x- L5 \& x3 h' C# s; m$ b) ]  e.GetErrorMessage(szCause, 255, NULL);9 [3 h7 C6 {2 D
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;" ?; ]  c% A2 x: s: v/ q# G' Y
  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);) v2 j2 r8 @- w4 n- I% p$ a+ z
  bResult = FALSE;1 @0 J( m/ l$ y3 M/ D. t$ i0 y
  }
, L( V3 n2 I+ v# [3 d  J8 j% d; n
# v. ]& T" ^4 D  ^2 y% u/ M Buffer->Release();
/ O: W# _9 ]' H  [ free(BufferBytes);; N: b- y, |5 i! S& p/ _
5 n7 N. S/ U: K4 x; P, M

& a, t  l  f5 X+ m7 z& c. A
3 B* O2 ~7 ~0 S% |+ Q, M- Y6 q return(bResult);( z0 l" n* L, l3 b0 |4 F$ t
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 11:46 , Processed in 0.018421 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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