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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName); l1 i; l4 c- \- y0 B$ Z
//=============================================================================
5 T6 N6 x8 V1 ^: j- \% |8 O6 {) S{8 z- N. {, p: _& V  t
BOOL bResult = FALSE;
* |4 w: p* w# @: s" a( V ILockBytes *Buffer = 0;9 A* R& z: _# J( N- R
IStorage   *pStorage = 0;! K0 _! u6 o3 ?3 e4 P; o
IStream    *FileStream = 0;
3 X) L! ^5 X3 Q0 F6 B2 J; ]& p( L BYTE    *BufferBytes;8 ]# L# T, z5 }- W2 @1 J! N  @
STATSTG  BytesStatistics;' s$ u7 a% C5 ?8 Q/ e2 l* j, S% ^
DWORD  OutData;
7 I. a8 A( W% F, j% \' M% W) z long  OutStream;& Z  o/ q# T8 _3 y* A- N
CFile  BitmapFile; CFileException e;
4 b: Q: ]6 J( b- `7 U, I3 ^/ M double  SkipFloat = 0;
/ {+ M8 s4 w! L( m6 J/ T2 J DWORD  ByteSkip = 0;. {+ ~8 m8 P/ h
_ULARGE_INTEGER RealData;
1 {. K* s. f7 b9 d% }* E# e* _& ~0 E! B) `

- D1 l0 h, ^2 b6 R( G1 |* S- g& A/ \
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
; U- Z2 R' y3 C( V
8 z* t4 M; H3 B* B/ x1 E5 x- z
2 t; W' R! M/ S9 O5 ]8 B' u% ]0 `
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
# E2 D7 q5 H- }( I; v" g0 Z     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
4 ^; `0 Z, o! l* B5 A: h
. g  e. N( \) z' o/ f' z: |( N% H1 L  ]0 m2 Y

3 I5 Q. G: ]3 O7 F9 ^# q+ J6 Y! X hr = pStorage->CreateStream(LPICTURE,3 \; `5 \- J) N& V
  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);6 r( A, f1 W( P) q( J
0 u1 ]* a- K# g* Y! L+ y& G4 @

4 H( y/ Q# Z& X7 `, p- f9 X: a6 Y- h$ ^7 c" E8 A
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
: S* t- |: m9 P: s7 j FileStream->Release();6 n4 w1 C/ U( @" g
pStorage->Release();" [% l* t4 w+ A
Buffer->Flush();
5 S9 Q1 G; U$ p# Z5 Z9 V2 ]6 I# E3 v- _

% b' P) J; p0 k$ s8 p- K5 k: ]1 |9 J7 ]5 @1 t
// Get Statistics For Final Size Of Byte Array, Q' V$ N- ?; ~6 W2 W* n8 E$ L& i! x
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
( S; o, [8 S/ c7 A, g8 ]6 t6 j
% p+ k- q8 a' ^% a8 T. R
& c4 l6 l/ G( E9 u+ f
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)8 \# N) ]# G1 k& H: ?1 Q* a2 G5 j
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
$ q+ X* v" L  N) \8 U9 {8 K5 N2 a) P if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;' F! J9 `9 i  c4 I1 Z! G& W/ R
else ByteSkip = (DWORD)SkipFloat;5 ^8 s1 n# l* ~
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...6 Z  s) P% e) s, M

9 B2 `% X! }& ^8 ~ // Find Difference Between The Two Values
; z( w- D- n3 E2 f* |" a ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
4 z% p2 {; U. P) V, w4 q7 ]' ]8 R) H6 U+ A! L3 d
. J. g4 }: z" P% p

6 u7 r. T2 p/ w% s8 v8 K8 }/ b // Allocate Only The Pure Picture Data( }: ^4 {3 F2 E+ _5 ~' B! q
RealData.LowPart = 0;
" B0 e; y. R) q( | RealData.HighPart = 0;# J( D9 o" v$ K* K* k
RealData.QuadPart = ByteSkip;
$ Q' g/ c# M+ \' x BufferBytes = (BYTE*)malloc(OutStream);
3 F( C. Q. g4 c+ e; D if(BufferBytes == NULL)
& m; z5 P$ d" F3 i% T5 B  {3 U: Q+ e9 P* u$ K3 {
  Buffer->Release();
7 u: u- p5 n5 Y2 G! x  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
; L8 s. i4 t2 A' d9 i  z. ?  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);7 S* \- E/ m+ ^
  }* B9 D& f+ c+ e, e

5 u* O5 `% O" ]& v; y6 T
+ k. _# [, h* N' v# M+ \+ u" ^) N' P
5 ~+ C8 [' T6 a! x) U# g5 d Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
: J9 I1 _. N6 I4 {2 f6 {
9 x- s& ]. ?! l  n: w% ]2 P
& J5 p0 Q. u0 ]+ X9 C, @7 @" s. e3 Y8 F. e) B
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
9 J% F& J" X" J. L; v0 \, |  {
1 E! w5 S4 T. `" e" T  BitmapFile.Write(BufferBytes, OutData);
! _* N/ X5 u3 q# J! u2 W3 B  BitmapFile.Close();6 [" ~3 u  `1 x$ K
  bResult = TRUE;! ~2 B/ Y7 x& `, C* X/ ^. b; Z# [
  }
2 D4 y/ @9 H! X  p else // Write File Failed...+ C0 h" D, B& t: a( ~9 S+ E) R
  {
. _) e9 E! w6 C" {  TCHAR szCause[255];3 g: @  u. Q5 E- k6 f$ a
  e.GetErrorMessage(szCause, 255, NULL);3 i; C3 ]' H; r: d1 a, ?7 Y' S
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;3 A0 C% c. |7 e* n! B1 F% I9 O* c
  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
! T. b) w& G5 m1 j" `# ?* i0 F' a: W  bResult = FALSE;
( t3 Q. M: g% f  }
  c( n8 ~0 |4 Z. s + F3 Q( e3 ?, ?2 E
Buffer->Release();' a, ^  ]3 ?8 K% T  c* W# K& H
free(BufferBytes);
% p( e, P4 W8 A: C
- [% U% j1 H4 ^/ i# Z- X# ]. W
  u/ s% d! v- m7 t% W. X5 E5 }7 G) V  _' n0 `4 ]* g1 O/ e
return(bResult);0 Q0 {, z- G7 v% i0 k7 s4 D  e
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-14 00:58 , Processed in 0.017154 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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