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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)5 _, ^9 E8 t+ C( y( F2 K
//=============================================================================, `  R3 k& [& q
{
; A1 ^7 v  s$ ? BOOL bResult = FALSE;
- _2 h7 v3 r/ i( l4 @( p ILockBytes *Buffer = 0;
9 o3 U" J  X" ^3 U2 O6 t- ^" k9 t IStorage   *pStorage = 0;4 o" N0 ~& u$ o7 ]! c. p
IStream    *FileStream = 0;! {6 ]9 A1 y# x2 r$ J1 Q/ U
BYTE    *BufferBytes;
% N$ G# o2 M* E STATSTG  BytesStatistics;3 D/ L# w- u1 l0 {* B2 Y
DWORD  OutData;
2 `, K6 s( Y* X1 K; Q  L long  OutStream;( C, E& A5 J' e- A1 s3 {; |
CFile  BitmapFile; CFileException e;* x$ p' b7 i- n# ^" K. @
double  SkipFloat = 0;
: C' [8 y8 C1 T, Q1 B/ c/ \ DWORD  ByteSkip = 0;
6 }4 h+ ^2 \% w  q _ULARGE_INTEGER RealData;
& t; E! g: B) v2 |; s2 `
- U: o5 D2 n3 G7 B
) v( ~1 D% ^( ]8 k: R% l4 m2 @
, d. a$ Q7 y- n: V CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer5 D5 o4 k! o$ P1 X4 y5 D
, z* n4 P4 [5 s$ v1 `

2 _  u4 }- J3 h0 W; V1 w' m4 x* A* ]' I' j% g% h: b0 j
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
5 x3 L7 V0 l2 X     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
9 _; `# K1 `. k) F
1 e7 e" q) @7 r- N  l, W" R) U  N  n! q) F- D. d, R/ W' o  X7 @
# Y  r; I7 Z6 C5 l
hr = pStorage->CreateStream(LPICTURE,
5 G/ o! ]- [! U( d3 a5 W5 x  X" H   STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
* u- R5 g8 O5 r1 e8 w3 H  s: D) x1 y: }4 V1 I6 @: B

! E/ }0 o4 o9 W' D, G* Q
( v9 L* Z0 H: a m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
, k. K4 i' y  F5 x% N FileStream->Release();! }$ z/ {! Q% y( [, V8 A7 e6 S$ e
pStorage->Release();7 S# l5 ?' H" R
Buffer->Flush(); ' ?& |; G+ g8 \" C: u) f# [1 J

/ G" a! E; {& J
& }  m0 d8 Q# u% h& k9 y8 O7 ^7 o5 \
. ^& u& D. `0 @1 }! y // Get Statistics For Final Size Of Byte Array
. o/ B4 d' Y1 A2 [" M$ B/ B Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
% j6 B8 A) ]/ f
( P# z" a2 c; [) P+ T3 A
$ U% x+ o) o9 b! L* b6 h0 {
/ g# g6 ^* J* i2 C, ?' X // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
$ r& N) i- O) N5 m, w/ j SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
* R' u) e" r9 k4 f, p6 M* S if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
% X; @) B2 ?* b) R else ByteSkip = (DWORD)SkipFloat;
+ a$ P4 X" ?. [6 E/ G8 m ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...2 A# C8 \' ^0 W+ G6 ?

) `! L* J' A/ B4 f2 s9 W // Find Difference Between The Two Values
' c, I7 b2 @) x4 \7 ]' G ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);7 Q/ E2 ^. O; T6 \) q1 F3 T
% }3 n7 C, ^# S& v& x$ S% W4 ?- q
8 u/ [2 p8 h+ S! x; f1 l' b+ ^  @3 ~
7 D% r/ |# X: }8 G' v
// Allocate Only The Pure Picture Data  K! p& L% o; y* S$ y2 A
RealData.LowPart = 0;1 W( [7 Q9 k! R7 |, Q3 s  W
RealData.HighPart = 0;0 o  _7 g* |1 X2 _* a5 ~6 i4 N; \
RealData.QuadPart = ByteSkip;* K# U2 H3 B0 w, [' v
BufferBytes = (BYTE*)malloc(OutStream);
/ ]- T$ j1 ^3 Y; k if(BufferBytes == NULL)2 @6 f; O  P" ?5 _% G5 q) ]  Z
  {. G5 X0 L; m) S- X8 r  t8 p5 d
  Buffer->Release();
! i( }. D9 \& E4 a9 K$ e  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;2 C" F  ~! {1 g0 y9 H/ q' I8 h
  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
0 ?4 W3 ?7 T8 G! `- U  }
9 s: \) G$ ?  z, C! s! e3 J5 J9 E
( e" J2 }: \; B7 M5 ]1 F6 b& e! F, w( q

" ~" e  p1 x. \9 H) O" M Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
( H- V# f, J" f8 R: d
2 O( z  @. x2 i3 `) G) s9 O) F4 P. U6 m, s2 A

3 q) T* i7 G$ O3 o! T if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
- C/ P2 _: P0 I: K  {
0 S# Z( I- q, U3 j3 d# ^: w4 E  BitmapFile.Write(BufferBytes, OutData);: p; g/ o  w/ x. r9 P* |
  BitmapFile.Close();
* F" v0 T+ p: G/ |% u" B& _* w  bResult = TRUE;
8 o9 [# n! k# Z9 {1 J3 X  }  o5 f+ J8 |: i& S8 W5 w4 i
else // Write File Failed...
, j2 Q+ Q: X. g% x4 \! q: s  {
' E+ E. ~, r( Q9 s3 p( z  TCHAR szCause[255];
1 ^5 J, r6 t" [5 t, o' H+ h  e.GetErrorMessage(szCause, 255, NULL);
4 k& Q& d, q1 H. d# u1 r, Y* l  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
# f, a1 T' A2 V4 x. q) V  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);) c9 u+ `: F* d9 X  H
  bResult = FALSE;. K3 l8 j" K; `4 v' I6 i
  }/ |1 l: Y) Q6 Q4 r0 f
: T* k. Q/ u+ I+ S
Buffer->Release();6 v, n) d+ i' F7 l! A- w* W
free(BufferBytes);9 U% M! K- n7 c' d
+ n$ ?" L' Z' g7 X  |; X6 a6 z

* L) V% t. m" J3 K! ?
  ~& _! O6 B4 M! v; l return(bResult);
5 e! }* m1 x- ^0 H. H& @3 t6 w}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 02:37 , Processed in 0.018348 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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