找回密码
 注册
查看: 9896|回复: 0

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)7 {& \( @  m9 }$ ]8 f6 J. A
//=============================================================================
" s: m2 O! X! Y$ w' X{  y5 w' z% y/ _" F7 r& |4 k& O' |3 }
BOOL bResult = FALSE;4 A% b# v+ D" r, r
ILockBytes *Buffer = 0;/ S* T# V' y7 n5 _; o: `
IStorage   *pStorage = 0;8 q5 S1 h3 ~, ^: Q& t
IStream    *FileStream = 0;
0 N3 r- |1 b4 g  \6 Z" E$ b BYTE    *BufferBytes;
8 M( a2 `8 r' B STATSTG  BytesStatistics;5 w' S8 k; U" l  U& |! a  d# D9 r- p9 }
DWORD  OutData;3 o7 o8 D( s0 ]! W! y) g
long  OutStream;
9 s& Q* r6 c) j1 v( { CFile  BitmapFile; CFileException e;
$ J4 m5 s8 e8 [! T6 R double  SkipFloat = 0;1 a  {( X/ p0 Z! c* m% X
DWORD  ByteSkip = 0;+ C* C) H! z- i; V- e9 ^; ^1 L
_ULARGE_INTEGER RealData;
1 {: ?$ |' @" U6 U! l5 k
- }: p; E' q% g7 M5 J: G0 d( E: b# c; {) z3 N9 H6 `
- P9 D  U; F' o4 @' |: o
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
9 Y; u. |7 P: b, ]3 \
* k- s! X7 [* d: S
* m- o  e1 W! u
' u; e  R" w# @- { HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
2 n: i% S, j! g2 g( J; P     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
  c. J1 Z! m6 Z5 N  ~8 h# O* h: k# P$ T# H2 j2 L& H  ?

2 e/ |8 p2 |8 E  j3 ^% Q0 s
8 H1 t# a, Z% D! }0 f" x# r hr = pStorage->CreateStream(LPICTURE,0 {: ]5 ]  y. B- R7 j- Y
  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);3 e$ N* b, C; v

2 d) Z2 A* e" H0 D2 z9 f1 d5 S  `$ d9 I( [6 h
8 i! }* ]) J4 d: |, K+ A6 T
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream: _3 O) d; M" a0 p
FileStream->Release();, s/ K3 H. p) \3 O* Q; ?! p' z
pStorage->Release();! s" N& |* |0 H0 d% n: a
Buffer->Flush(); . n3 L) f  g  \. Q; N: n4 }4 h
2 k  @& j5 c2 D/ i) T; x8 [" C
' p" x7 h% e4 P  ?9 v# ]* z) i( c

0 N: u1 r- Y2 ]8 r" `( o // Get Statistics For Final Size Of Byte Array: Y7 p4 O3 H9 X
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
8 e( \# u" j" }7 y8 U( t9 ^( U" `: l

9 X! l" U  ~% m3 M  m/ V9 M& L3 }+ O# l. y( ^
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
& v; i0 z& T8 i) x$ S. C SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
9 q! \+ ?. u3 V" v if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;, o& Y' N8 U4 b* h" i" m
else ByteSkip = (DWORD)SkipFloat;
) f! C- I- T2 I7 T ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
- T& e4 b9 D4 P- O( ~% l4 @9 p
, C1 S# N5 g3 w# s // Find Difference Between The Two Values+ b# H# E, j3 G( r. g: i7 T3 E
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
! V4 o+ b6 ?' a
7 u" G1 a6 s! J2 \% P: Z( J" E. {$ w3 @* z- L- r

9 X" C  \$ y2 c3 I // Allocate Only The Pure Picture Data
% \; p+ j% ~1 J2 z3 Y; R RealData.LowPart = 0;
) q8 N8 X& h7 L  p3 L  `7 r RealData.HighPart = 0;
: K! Q' g- z. Q+ @& L2 p RealData.QuadPart = ByteSkip;
# P2 B2 N# f! S BufferBytes = (BYTE*)malloc(OutStream);
0 c+ H1 C) k# ^; Q4 z9 l) m if(BufferBytes == NULL)
/ D" `, @$ y( V( K4 `  {
5 f$ ^6 `! ^% ^3 n/ j3 W% b* X9 v  Buffer->Release();6 j1 I/ t/ U* Q1 [. g
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
( p- h" [% I! s$ t' }" _/ g2 b7 B  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);; W, I; a+ M+ j  g
  }" g3 }5 t7 y) H% _

% w& G& ?7 ]: B! g
$ \1 W5 u7 K  `+ s! h* g1 k9 K
; Y- [$ f1 A2 d8 s' M Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);# L$ P9 y2 A6 s

- I, o6 {7 p" ~5 e$ d- O( g  D7 u
9 v3 F8 X) ?5 b1 O, H' X7 P. z3 ~/ o4 d7 X. o$ o3 }
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
2 x0 ?7 h5 Q2 W3 B" V/ W% X  {
! n" c& O- h8 A# D  BitmapFile.Write(BufferBytes, OutData);
* Z8 c- t' n; q4 N" r/ f( F  BitmapFile.Close();) r+ @. y! Y6 B' B9 @# B% C* a) G
  bResult = TRUE;
9 X$ C  U( ?% h! J9 b* _5 `  }, m! j. a6 s9 b; m/ `' @
else // Write File Failed...- K; w( O$ D" O0 |, d4 N: a) r
  {/ f1 ?, e/ F) [) v! b
  TCHAR szCause[255];4 e" D9 j, P( `
  e.GetErrorMessage(szCause, 255, NULL);8 W: x0 L& S, k3 \  z; C
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
& m7 M, R2 Q4 N1 M) x  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
, [- n) e# A& g6 C: e/ G' i  bResult = FALSE;
4 L3 q  d: v; d, \( w5 |5 Z% r  }
- b8 ~% }0 q' J6 z   |' d3 [0 a9 i" l4 R$ `% H3 f
Buffer->Release();
! }- \3 G0 X. @* R" R( D free(BufferBytes);
- A  u' A4 B( F
* r) B% _* K0 m2 W% J* N( h" R. ?- J' H, `! D: k5 l2 r
! g. M; E, B  |$ C
return(bResult);6 a7 U7 a# a/ H, N" q
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 00:12 , Processed in 0.016121 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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