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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)
) ]5 F4 ?: U/ S7 e6 J//=============================================================================
! l4 |% ~3 h8 |3 W+ ^! r/ e' e{8 K; ]+ |7 S" X* u5 w' o% d
BOOL bResult = FALSE;
! a& i! C7 ?; `) d ILockBytes *Buffer = 0;9 `) A- F# l2 C! G! k# ~5 W; u% E
IStorage   *pStorage = 0;
1 ?! k7 ]$ L/ o5 M) i( _; K% K IStream    *FileStream = 0;
  c3 A+ ?% b4 [9 R5 H BYTE    *BufferBytes;
% g' `3 k" O, G$ F STATSTG  BytesStatistics;
$ `3 M* R+ @0 O  ^  \# W0 z; }5 J DWORD  OutData;
( @/ P/ R7 G2 }  C, Z3 w long  OutStream;- e: T1 O5 R+ a5 c/ y1 i. X8 D
CFile  BitmapFile; CFileException e;' ^; q8 X# F+ n0 t# E/ k
double  SkipFloat = 0;0 U$ N5 y+ |" j3 @: p! a
DWORD  ByteSkip = 0;" W; N5 ^$ E" S/ w3 c- ~6 c
_ULARGE_INTEGER RealData;
7 B* g+ j/ P0 I& }3 _
; [2 z/ {  i) b/ y6 _
8 N2 P2 [, x% ^7 k- P3 f# `' M! ?4 D# g8 G1 x
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
& E% Z2 |; @1 j* _( |. b+ C& @9 x2 E( b" K* ~9 [; h) N" z, M
/ ?2 W5 d0 E6 D
$ d; Q3 Z/ g/ Y: G  [0 Y
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
$ t% n1 q8 w' ~. G. p( }' E8 p     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
3 b- }* V: g1 Q7 @- Z& M) \# T+ W# u3 i( ]

, [4 \% s+ Q5 e4 I2 b2 T6 }1 u5 o: |+ H$ E6 T. n4 o* x$ Q
hr = pStorage->CreateStream(LPICTURE,
: m# T* Y5 P% M( h, Y+ {   STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);" P4 r; U. \7 U) X# R$ J; A; @
* O7 d4 ~2 f& Z2 }4 o, v4 U
+ [1 f6 n! z$ K2 B+ l. z
6 x6 e4 f2 J( t/ D, b% C
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream+ ^- n3 t% K# E% F/ I% B
FileStream->Release();
9 @4 t" ^1 D+ R pStorage->Release();
; V6 }/ H, g( C* y5 X7 l& Q Buffer->Flush();
7 t- h& L3 w" m7 w# h$ S$ B0 {. ^$ c( c) T

6 F5 b5 B% a  K$ ~3 f
: N' A! A* \+ V3 ^/ t // Get Statistics For Final Size Of Byte Array- ?7 m+ n2 o! a. u
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
& `- v( g- o- \: ?; b3 i0 G. i: R
1 t3 ?: q  E% F! }# R( W; `$ `3 L- v. a3 T
3 e7 y! s' f$ R- `# p
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
5 L) h5 D1 M( W, U SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...% k( `/ f6 ]1 a* ]  |
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
6 n( Y# U9 g( q( u0 B else ByteSkip = (DWORD)SkipFloat;
- C, n# `+ L* j8 `) r* H ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...3 x; n* C9 S/ r" [* _

9 |: h& y8 q' H. A1 p; Q; P+ o // Find Difference Between The Two Values$ \1 ]& S1 b5 J% _
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);. Q: \1 _+ B  U. c; ]

2 g. z0 _6 o' _0 h' W. v7 D( N4 p2 W. A6 e( u

5 |  B! G0 m  v2 W$ i+ w // Allocate Only The Pure Picture Data
  S) g2 b3 p+ J6 z& n6 V' f, Z1 p RealData.LowPart = 0;
! T, _% I1 j7 r: D( j7 [2 F RealData.HighPart = 0;
/ v/ X5 B( u2 o9 B RealData.QuadPart = ByteSkip;
  G  Q/ A6 a; f/ E; h) a BufferBytes = (BYTE*)malloc(OutStream);
' ?& k& {% ^2 z if(BufferBytes == NULL)
' j& A5 n8 \7 S  {- H7 P/ V, v- }  {7 j  p& N8 L
  Buffer->Release();
- g9 i. w( x- k; s! c% H/ W  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
  }1 s& L0 a+ C1 y( l& F4 u3 M  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
7 U0 b) f. W# w$ j6 [# u& V  }
1 n& q9 I- E/ C* W4 T5 l7 |$ z3 ^5 _" i6 M# H  K
0 k: \3 M! ]  R  y4 V1 o

0 n6 E$ w% `) M0 i4 ` Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
1 W+ Z, ], r8 h5 C. l* p
8 z0 l: }+ }; \& l. G
" Q  |7 R0 ?/ k3 _4 \6 h+ w. O# E1 B" A9 P9 k( A+ F/ }
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
& S7 x, P- ?! [% Z" P  {
# X: A! T" w  N# t9 c8 R3 Z  BitmapFile.Write(BufferBytes, OutData);0 B. [1 U( \# n
  BitmapFile.Close();% Q: Y' Y0 Y2 m+ c. k. ~# t
  bResult = TRUE;- C9 Q7 h" S( R. V5 c. F
  }
% G, J  [5 r! o1 T4 K else // Write File Failed...
# t7 Y' }/ U( s; S& o  {( G! e/ A: K: w
  TCHAR szCause[255];( d2 g* F4 A1 {
  e.GetErrorMessage(szCause, 255, NULL);
% d6 _3 B3 ?, Y2 O$ J( n8 \  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
  w1 t. g  p- D1 C' H: v  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
3 c! f" y2 ^8 C$ W1 n  bResult = FALSE;0 p* G2 j  \" [. \2 s; N
  }# {$ ?' W9 \8 X1 a
3 J/ f1 E! @+ c0 u
Buffer->Release();
; Z6 c% K8 G  I+ U+ Z; p free(BufferBytes);
' E% K4 }! f$ \; w& a" v* V
4 Q2 S- M, z6 J. S7 h* r( Q* v' z5 \5 _/ o6 Z, L
* u0 i! F6 G8 D/ P' Z# o
return(bResult);
- {# o, @5 o8 {) }}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 12:03 , Processed in 0.017245 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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