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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)
- R7 M$ E( l: P6 |4 I5 V//=============================================================================
! J( t( d" S! @) B0 Q- W/ w{  e4 ]. G. T' J! X' s
BOOL bResult = FALSE;
$ ~! X: a% A" V" A; O ILockBytes *Buffer = 0;/ a. Y) P5 j$ t/ F' J
IStorage   *pStorage = 0;
. U6 L9 O9 ]1 D- ^; ]6 v# T IStream    *FileStream = 0;  ]9 V- I% G0 }4 x- P# ]$ C! u
BYTE    *BufferBytes;
, w' z/ z$ n- V# w1 y( K9 _! q; a: F STATSTG  BytesStatistics;- h6 Q5 C( w% C, D: y& }/ {; z; [
DWORD  OutData;" j, A* z, B4 T5 I2 f8 H& @4 Y
long  OutStream;% ]* n' Z" T- G# v
CFile  BitmapFile; CFileException e;
6 R8 @! |( k) T. }6 q& v& V double  SkipFloat = 0;& ]( _4 W; W, L! s4 |( ~; ^7 O& N
DWORD  ByteSkip = 0;5 k7 w& {8 w( Q' \: F7 }  [$ ~4 d
_ULARGE_INTEGER RealData;
+ [3 F9 I  r; k+ f. D2 f
" n- ]8 [& \- f7 F& U' u6 N" ?; n/ e2 v& s/ \1 _; e  j/ g( f; |/ o
  O4 r" Y4 t; ~
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
( o/ y5 s5 u$ \& C; n
& `! \' _5 }7 k9 A9 A
$ C3 l) T! D$ J, z$ K) r
' I" Z6 n* I) m, V8 [ HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
, d" t: F5 l) ^1 {. N$ |  S     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);- G% x1 S6 T; ~7 @

& h2 U- p% ^# u/ g: V7 }0 F; f
) e0 ~5 [# _- x' S  s5 b3 P. h
) }* L, {" e: M5 y/ ? hr = pStorage->CreateStream(LPICTURE,0 q/ E$ j! W/ z, @8 M6 _7 S5 `) h
  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);. T% W3 H4 L7 F. b% T
0 a7 l/ p3 I8 N
: q' o2 M) i5 ?% X- L/ C7 F

0 \. Z- k  G( [: j3 v2 n m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream6 ~' P- ]3 z5 E
FileStream->Release();
  L+ d. R- D* i0 d( X& w; X- k pStorage->Release();
  `4 J7 P: N# ^ Buffer->Flush(); 8 V& Q* A& g+ R0 ~- w3 I- R  T: x

+ S: f5 l4 e" Y* i: t
+ ?' Y7 p( b, _! i
. Y  a4 {4 p8 H/ M( J5 ~' V // Get Statistics For Final Size Of Byte Array. |5 C3 H+ h6 b& F; x6 S9 f
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);* Y. h' g  j/ f% w. |3 P0 V
+ a# s% g: F+ A& Y
7 E4 D  L7 S) i' w+ k6 @: F

6 M6 d) g- L9 j // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
% [( }$ N0 P, L2 x  a' s5 V5 m& w! \( Y SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
6 X. ^# E, N5 e  M8 o. ? if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;5 j) f0 ^+ i' m2 G2 h" {
else ByteSkip = (DWORD)SkipFloat;3 q/ i# ?# n! y$ K( g  T) `
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...0 [: W4 T+ i9 C0 N/ ^" ]9 v- B9 @, R

. O$ j0 R" p& b) | // Find Difference Between The Two Values: X7 K9 N/ T1 j  r: _  Z( Q
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
9 a) h! p5 `8 O
" l4 ?/ p  @5 l0 N: |6 _. R' C! m2 _# H1 R. x* v

' Z( i6 E4 H. T  o // Allocate Only The Pure Picture Data
& G( k$ g1 O* {6 R# J RealData.LowPart = 0;$ u, s" _  i' d4 _6 b4 ?* `  B2 f2 D
RealData.HighPart = 0;9 B. b# a1 W$ G: L4 }
RealData.QuadPart = ByteSkip;4 Q6 H4 P5 B$ O. `; t& D/ N4 R" L
BufferBytes = (BYTE*)malloc(OutStream);1 y% g+ m% w# f: |' q) j$ S
if(BufferBytes == NULL)
0 m6 d1 b/ F6 }2 g  {
4 `1 r2 A9 v3 x7 i% Y2 ^  Buffer->Release();
6 o1 C. q9 ?- a) b: _- K+ _* a  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;: f% B1 f$ u) m7 A0 L2 n
  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
  D( Q; B' o: p: }( Q) J+ U0 t  }
# n' T; t" k5 z4 [
* B) v6 i1 W/ I4 x2 A- _7 a! ?5 ^' S
& n& _$ I+ `5 r. _8 m/ ~
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
5 [9 ]; G$ ?. K* O. Z5 c
* |; V7 w! @- Q2 F2 z$ Q7 s  O4 J5 J" I; o

7 z2 V0 C1 C, o1 W4 p) q if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
6 G' }9 F' \9 P- ]! |  {
: z; e1 J6 h- m. c  BitmapFile.Write(BufferBytes, OutData);
1 D- f9 l& Q9 D7 H6 V  BitmapFile.Close();
' N+ d. e% p7 R1 T# L% ?3 p  f  d  bResult = TRUE;1 F6 |: l! W# t
  }- K  B; C: C8 D- |% h! H0 T
else // Write File Failed...
2 |8 e; I9 P+ E  {$ |! g, h5 s. r( T
  TCHAR szCause[255];( m0 y7 r1 {7 Q- f6 o4 Q' Y/ _, K4 \
  e.GetErrorMessage(szCause, 255, NULL);
: h: b: H1 V! ^9 z  {  z9 ~/ v  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
& n; k% I) d) ~4 {# H% q5 X  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
( g4 f$ c/ b9 a) L( q/ `! s  bResult = FALSE;
* A. `3 ]* v6 \  {! J  }+ n' g  L9 Z$ x, A' ~5 |
# e: B- j+ ]; c! b0 o( ]
Buffer->Release();
8 }$ ?9 L) J# [! F0 I# o; Y: ~ free(BufferBytes);7 Z7 F! c  M* l+ w

  P& T: }% z: q9 o3 |+ W7 d; H$ k7 p1 X0 j4 N; s- Z( _* N
' |+ @- o! j9 m6 G6 a
return(bResult);& U+ R- h5 q3 \" m& d) q  \1 v
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-29 20:02 , Processed in 0.020719 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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