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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)
" X- N. |7 E) n+ |//=============================================================================
8 [' O0 |9 N6 I1 K' Z. u# l' N{
2 G: S! D% D! X% q3 f" w: [# }9 r1 C BOOL bResult = FALSE;1 {" p) w, g. o8 x/ n& K
ILockBytes *Buffer = 0;
4 b2 H/ s& a" t( l5 W% E" X4 J4 ? IStorage   *pStorage = 0;5 E& e" x# O2 A! A1 K& I& T
IStream    *FileStream = 0;/ |% ?" o  b5 s7 d
BYTE    *BufferBytes;8 {" }% V3 C7 E: O9 @+ C* Q
STATSTG  BytesStatistics;
2 ~1 z& m3 u% h" h+ M7 u, g; E DWORD  OutData;
, ?# _9 F6 h" C5 Q+ A3 A( F long  OutStream;
' Q2 I" d& s3 r7 d CFile  BitmapFile; CFileException e;+ r) |2 O# O, r. C3 n, a, x
double  SkipFloat = 0;
5 J# G; a; M. R+ Q9 W6 q DWORD  ByteSkip = 0;1 [5 c# ~  w& c* E6 {1 a3 m
_ULARGE_INTEGER RealData;
( @3 ^! `( F6 E9 _4 f- E; `1 C
/ g- ~3 U$ j2 G# t
7 B( E! D% K" O6 j' C$ }5 @# J
8 O+ V; M: h! } CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
9 H2 n. H; ]! Z  v; ]2 T+ a" `) M
, s6 @5 k/ B5 X3 F) S; p0 Q# O# L1 W5 i) f. Z5 P( k0 E' e

1 r% L  D/ n4 V; \9 B# j8 N HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
) U. `' L' g6 c( O9 o     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
, F+ S/ B  ~* X. p3 Y3 q; |( Z( v  f, A. a- R# d) m
/ k- K! ~8 t7 A1 s
3 x9 v8 K3 |0 a
hr = pStorage->CreateStream(LPICTURE,
/ }- B  o, ^+ F0 H7 `   STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
3 P7 k( ^. ^, a. C1 ^' @, p/ f( I8 L+ r( b: r" ^

* t: i8 U: u  G" j2 e, Y* K
: ~4 h& p6 ]5 M5 }* l) r m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
; p; z( o# v: V8 }3 s FileStream->Release();
! f" w& Z# \- H! j0 _3 ? pStorage->Release();
/ L$ ]. x6 B" p5 a Buffer->Flush(); ; [6 q$ Z% g! N+ f
8 t9 Q/ I% F- g( }. K

# ^+ v4 j' ~$ U: `. X
: T; }& ]$ s+ g1 ~2 A3 ` // Get Statistics For Final Size Of Byte Array# v: y- c4 V! E  {. y( d0 U
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
* |& m1 ~/ L, I' r' e! H& U, ^/ L1 x! K( A
! j  n2 C- g5 M0 [6 e# I& Z
0 I6 x) B2 X7 L  B9 G
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)) w  o& h# V% [4 g
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...) J, b. d9 u- o( h' E6 r
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;3 g/ D. s/ V$ y2 u$ _
else ByteSkip = (DWORD)SkipFloat;
' f& N1 h1 G& x7 {0 c2 e ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
/ w  p2 v7 u8 z( f) A, S # ^3 `; E) k5 A& k: E
// Find Difference Between The Two Values, j3 ~+ c, Q9 a$ M- Y- d
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
' ^$ |7 S) g+ u; s/ z6 i8 U
$ j% u; y, ]- g! L
3 Z5 M9 [  ?" }1 X8 {  n' Y
' Q* ?: B& [% B. x* {" { // Allocate Only The Pure Picture Data$ o1 B# A3 b, f! L. ], n2 i
RealData.LowPart = 0;, w9 r- N2 W4 \4 R* W
RealData.HighPart = 0;% s' {& V2 z4 \( U3 x0 g% n% X
RealData.QuadPart = ByteSkip;
9 _( Y  ~: o$ z- O/ i BufferBytes = (BYTE*)malloc(OutStream);: h6 v8 c1 w% c' ?2 ?6 b
if(BufferBytes == NULL)5 n9 k5 D" T2 ^4 |+ }$ K
  {3 f' O! E7 G4 m" _: Z4 |, T5 i
  Buffer->Release();
( t+ P/ S0 t7 q$ F  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;  T$ l6 {! l: u4 }% r$ C! }
  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
* Q7 t% w' N# t# j2 }  }
0 C& B- O" f& _- a% p9 ?
* A$ l+ B6 l" l6 Q$ A, p9 ~5 y* a; @9 [

) v6 ?( |5 \; w" c" @ Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
9 ?5 L/ F& o" k0 R. n3 @9 o( |0 X8 e# P2 |' j1 M+ v9 k2 F
1 d  ?0 W  `- \2 L( J9 {
4 ?) _  l8 M8 e  V
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
; Z* s# z1 r! F* z$ {9 g: y& b  {7 R$ L; {" }2 b( @* _; _
  BitmapFile.Write(BufferBytes, OutData);
# @5 v* o- K7 O6 K# @  BitmapFile.Close();
- g% U/ K! J% ^% k3 h! f  bResult = TRUE;* u- [3 O+ M3 T+ \) K- T4 `
  }. K& M$ K8 \- _+ p
else // Write File Failed...& z0 v9 w3 o( ]1 o
  {. P+ ]: Z- _3 u
  TCHAR szCause[255];& [% K/ U' k5 Q( p# {+ T
  e.GetErrorMessage(szCause, 255, NULL);
9 A$ c) g( j. ^. F  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;: q. X# V- R+ A4 l
  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
1 h+ f  x4 u! o% y, s; f+ e  bResult = FALSE;
: \6 n. n/ N5 J! _  }
! f5 e  L& D: N' Z 5 l) _1 g+ V% B' B3 q$ d# N
Buffer->Release();
0 I* I9 n( x# p: O* P free(BufferBytes);
# {- p( J( c! O+ a: u& ^. w, M! D+ E; V# }$ @7 _

8 B4 F, Z3 w7 ^, k% x( D
* B: J5 ?0 z0 i; F, Z5 r return(bResult);. B! X* g1 b/ y; j
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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