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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)
0 {+ x0 H; d9 u% n! Y& [/ M//=============================================================================
1 G. H7 r5 g' T6 }; b{
+ o  [$ g% p% j* W$ p: p- j BOOL bResult = FALSE;" I( {" r7 C: A; B1 [2 R
ILockBytes *Buffer = 0;
; `9 W$ [+ W3 P* @" b7 g8 F IStorage   *pStorage = 0;/ W4 D- {! p0 V2 c% j; S- k+ u
IStream    *FileStream = 0;
- i. ]1 w+ ^3 w0 W0 v& w4 @. S' k BYTE    *BufferBytes;7 ?6 {0 U/ ~3 ]. z3 t: @& O
STATSTG  BytesStatistics;
1 J* N4 Y: m5 F2 q* U$ o DWORD  OutData;
4 x3 H& A% W2 \5 a2 n4 H long  OutStream;
- a, K% H) G5 |  D  R' ? CFile  BitmapFile; CFileException e;; T) t# E( p5 d5 G1 z0 U% C2 [2 F$ ~
double  SkipFloat = 0;# k+ l/ `) G2 \/ S/ U4 F
DWORD  ByteSkip = 0;
/ ]5 L, \9 r' k' c5 C# C, q _ULARGE_INTEGER RealData;
" C' l; k) m# r
+ R' S' _% L3 x( Y; B& e. a& @
3 [0 G# `$ |5 C( |3 y( S% C
5 r! R1 E8 p0 T& N CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
; A) H9 Z8 G& k" G0 y" n7 d; ~( _( m. Q3 l5 I

& E' \' c" z0 t$ N2 l
, O* ]7 O$ u4 ?8 Q% T: Y3 E  ] HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
- m0 Q+ e: P, D# c) Q" ^     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);, x# K! L8 }' N+ m: E! M

( N1 G. z. L8 [1 V6 ?. m, M( `1 _1 ~3 J3 v) x
; Y0 P9 P: ]2 c; ]5 V
hr = pStorage->CreateStream(LPICTURE,6 z8 ^0 K; S* W% [, y0 I& z, e# a) i! d
  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
6 G( k& Y$ L0 x& R5 s! m! G2 X8 R1 z# V+ Q) g6 q# i

  o- n2 M. F. F4 {6 S
, B) V" N3 m5 A9 F m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream. m9 [% l; N- G; t, N" O
FileStream->Release();
# r2 @& j3 c6 i/ P, f pStorage->Release();$ u& [  ]7 k  b& J( s3 G
Buffer->Flush(); - i8 Z  ~/ V2 o) c0 O& _

* \5 e2 ^" L( H3 S8 a3 {
+ R3 {! z) o4 t
& s! q- X8 M# X: A1 d9 N+ |$ n* s // Get Statistics For Final Size Of Byte Array
2 n1 V- [5 U5 q0 y% q Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);, k, q/ |5 S0 E

/ b+ x/ k- h9 R- G' V% j, D( s5 F- Z+ \+ Q4 Y1 z6 U* M
/ H  U8 q0 S2 H. |% a: }
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)6 P  q  i* O( V( B6 j# p9 g% j
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks..." e8 l0 `+ ?& I, H, R' l
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;2 i( N. A* F! r6 q; A, X0 R9 m
else ByteSkip = (DWORD)SkipFloat;$ g& F0 m/ J# o9 G# L, G
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
2 A& p1 }# m3 r 3 K' A+ n0 f, J9 v9 ~
// Find Difference Between The Two Values: T% ~% O; Z  U2 K3 B
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
/ D9 C6 _* J- H7 O! b5 t, F3 A
. G" f5 }9 Z; f0 e* Y7 X3 A
2 z/ M" D( K$ ~2 ~# F) y3 K
6 E# U: |3 }+ U$ r$ M- h: a! a: W& p$ ] // Allocate Only The Pure Picture Data
' p$ P0 ~/ d6 M0 P; h( H RealData.LowPart = 0;
5 ^5 L6 n( n* c& R0 ] RealData.HighPart = 0;
6 ]$ V' F3 }' N# A RealData.QuadPart = ByteSkip;7 U" i9 Y! z- j
BufferBytes = (BYTE*)malloc(OutStream);* S  g4 ^. n* Y% Q
if(BufferBytes == NULL)
+ \% Q7 |3 I7 }+ `  {
6 P" ~! \+ r6 h  Buffer->Release();
8 ?6 r: [3 A+ B9 ?  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
: v4 {! j$ C% M# o0 F! L: G+ x  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
7 x2 h+ N; Y& n& d9 Z6 w4 X: {' L1 `3 z  }8 D' b; k$ F% g& F( X

( H/ X; g/ f. |$ G1 [7 B- B- S5 _8 |3 ~- h) O; [9 {; w+ P3 v
) K2 N" }, \8 X! G6 |1 f6 A2 z
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);3 M8 A; z- v$ N. I

; I2 i9 K  }/ G7 G" T
2 l4 ?7 M3 p+ k1 t: `+ v8 g
$ p! c+ ]* L6 W1 b if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
5 R) D+ }. p- c2 w  {
1 g' x; h. i& W5 b  BitmapFile.Write(BufferBytes, OutData);
3 @. B$ W+ I) G  BitmapFile.Close();
) I- B! h  a* }7 r  I  bResult = TRUE;
5 B4 z+ ?+ J# J  }
) ?+ r+ [, n1 `+ r9 Y else // Write File Failed...9 @" ^9 d+ s+ l! j* t5 R4 d
  {1 @" y* x2 q5 [1 {
  TCHAR szCause[255];
7 J" W( h% w1 C5 k3 `  e.GetErrorMessage(szCause, 255, NULL);+ \" A% Z9 c9 n( C5 F
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
7 E, n- F: `# ]6 Q6 l* h. U  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
7 g: W& K/ k' b( j1 Q  bResult = FALSE;
1 j$ c' j2 @% Y& j) j  }
0 w6 C/ h; |0 r' L2 q% L 8 b6 J: C9 x: h3 @5 W) j) a
Buffer->Release();
$ Q# b2 x5 c% `' p' C- b free(BufferBytes);) @. S3 }4 B* D' U0 ^
/ z7 B8 F2 s" B8 M% }, _

  q- z( R. Z5 u& ~! V& F& n% }/ S( R. d4 l# d, h
return(bResult);
& X* v9 n8 W; w7 @) l( z}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 04:24 , Processed in 0.034512 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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