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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)7 j9 N. C6 V! i2 G, ?4 O5 j. p
//=============================================================================4 y" l4 _+ }: I! D/ ]9 t/ `
{
3 h! s3 N+ g7 Q BOOL bResult = FALSE;
* A5 d3 @- S4 b2 S# i/ y8 c2 j! m ILockBytes *Buffer = 0;% Q2 H0 Z  V7 `4 S1 P1 j6 S
IStorage   *pStorage = 0;
. R/ q9 Q& s6 D( B IStream    *FileStream = 0;
: U0 t/ G9 W7 Z" t% X BYTE    *BufferBytes;
9 g) v* a* w& W+ ^ STATSTG  BytesStatistics;
% Q4 [' B- @4 d. D; D$ M DWORD  OutData;
7 E9 k; t1 H$ {* S: j* x! | long  OutStream;
0 d7 d& ?, m( s" C3 s! J4 G CFile  BitmapFile; CFileException e;0 i( o) Y. r4 @6 H5 A; q9 J
double  SkipFloat = 0;
! x. o8 B9 g5 ]# P9 k  I5 X7 X DWORD  ByteSkip = 0;
$ l) r$ k5 l8 C( N _ULARGE_INTEGER RealData;# |) I0 j9 F% x# a. k2 m
3 F( s  t( k; h0 x3 z

8 F: F7 I9 L4 K9 j
3 x9 u4 k, Q8 j7 y CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer% v' [& h3 F  P4 g

! w( z- p. t6 t" V& ^  m0 N% q( |% Y! @

- l& x& q/ N- Z& ?0 {% ^) o5 m HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
4 ^* N, I; A) }8 i) E     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);' w- X1 L. u5 P7 h1 T0 s5 Q
& w- P, k8 H3 l4 J+ w8 K

2 q' d; I$ W+ c- w: }( K. r7 e2 u6 j6 ~. X# u' r; L% q
hr = pStorage->CreateStream(LPICTURE,
) P% Y. j" H9 C6 w3 Q/ E# f   STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);* u( b- b1 z) v1 |& J) L' _

$ D4 h) S, u" s  v# A. R, E9 D& P/ G* g
$ z5 L" N, n' M' {8 K9 @1 s' g: v! {
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
0 K; }! B/ W. U# f5 i( B* f9 R9 m FileStream->Release();% @1 I  W! r. z
pStorage->Release();
+ d' p* R$ A/ E8 b' @' s Buffer->Flush(); 9 u( o$ _, y/ E) h2 G/ U* O
& k+ }/ Y# q6 i) K, ~7 E
2 A" P" g: {$ J" T9 }- E3 F  {6 x
! |" b* {2 s; N' R7 ?
// Get Statistics For Final Size Of Byte Array( V: f: e9 I! e1 q* C5 Q. @7 D
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
* {1 h1 p* k+ ^5 F2 Z& ^
- R. h; B8 {& d5 `1 g$ ^( I+ w5 q3 Z6 @
1 s: r4 p, B, G! Z9 P6 s
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)* ], `8 R. e1 i! k
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
$ s# p% g4 g2 s2 b" E6 |; a. a if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;0 h2 z$ ]/ y0 T1 h: A
else ByteSkip = (DWORD)SkipFloat;1 G4 c! \7 s- T0 W% W: U
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
0 @, U. @$ |# [# J) \ & p6 l) l. R- g( P2 i) K( [
// Find Difference Between The Two Values% B0 Q$ \% I( H7 _3 V: H; g, D3 n" n, @! Q
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
* v' n+ V' D# \. [# x9 c. h) E0 M5 b* A5 q. Q

$ ]4 g* \# B; g3 ~7 P" B/ ~* F3 M0 G
// Allocate Only The Pure Picture Data( m$ o3 a* w' Z
RealData.LowPart = 0;" m4 @# j/ Z* L0 x9 x* C! {: }* h2 k
RealData.HighPart = 0;7 X! l% m' \! h5 [4 f- ?( A
RealData.QuadPart = ByteSkip;4 F+ P$ b9 ]3 G9 L
BufferBytes = (BYTE*)malloc(OutStream);
" s5 k% t! E, B* ^. o& G if(BufferBytes == NULL)7 w! ^) u) g. D( r
  {' {' d/ X0 {  `0 H! d6 K2 q
  Buffer->Release();
  v4 A" Z4 b% S2 R7 y3 C) \  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;" k0 N1 A" E7 D7 d# V2 C: g
  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
) z/ G( t" D* o7 Z& I  }
0 T" ~( Z0 h3 t0 N* A- S/ _1 S, u0 ^
* w+ o1 ~. p/ f

, ]* s/ {& O7 e; x+ V Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
$ y6 @9 b- _4 f. l6 \1 C7 S. i2 }6 n2 E
" P/ l0 Z8 q) [$ O! k

, T: J# \. G/ p. U) u2 y if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))& T) l3 ?, V' l4 H. I2 V
  {
; @( B; w2 b1 M! ^# O  BitmapFile.Write(BufferBytes, OutData);
" m4 W4 ^5 |6 C0 l/ U  BitmapFile.Close();
& b# |* [, V  `* N% y  bResult = TRUE;$ N7 B% K" h  m
  }
/ P7 O- M: D( {# ~9 I# B* [ else // Write File Failed...' T! R, F7 f& m8 N- u6 y- M+ H0 ?) a9 ~
  {
2 O$ ~2 b" T" A/ T  t$ @! O  TCHAR szCause[255];4 o4 V( R7 m" I3 V" r. f
  e.GetErrorMessage(szCause, 255, NULL);: r# ]% d  v3 \) P6 x/ U
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
4 v' \2 E( [2 |- a& }6 ~  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);: h1 x% `8 {% ^
  bResult = FALSE;
& g/ o* _& }7 s; y* i" _9 X  x2 P  }
: z' J% y/ r9 N! ?" c2 z
& f/ W9 o8 Y/ z Buffer->Release();$ [7 w6 B, ]' z# w
free(BufferBytes);3 X" ?( M* }) h8 h8 A  M& K5 u: X
+ z7 P0 t! O: t( |! b- }% I1 T' h
. d, x- J* L" r8 s# V- Q$ l

' y# g$ X4 r; c- }0 p* S2 a return(bResult);
" K" w. O* [. F}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-1 20:48 , Processed in 0.015613 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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