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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)
: |& n5 p. i9 Q% q2 `//=============================================================================
, x1 o0 d3 J5 C# [( ^{
2 F$ F# d2 {3 w0 X BOOL bResult = FALSE;
! ]$ `/ m* n  y* P# T4 }6 s4 m ILockBytes *Buffer = 0;
/ E: z. _% C4 b4 @4 x; m IStorage   *pStorage = 0;& g, o6 @( s7 E7 d
IStream    *FileStream = 0;$ m9 P/ Z1 k7 t/ `* ~9 ^
BYTE    *BufferBytes;5 G- I! o3 ]3 k. C# N. E. s
STATSTG  BytesStatistics;
, g7 V# k' a6 F9 m2 J1 c$ y# ^ DWORD  OutData;! Q- K/ Z7 P  U
long  OutStream;
( [3 |3 Y" v  K CFile  BitmapFile; CFileException e;
8 M6 p3 Q/ Q) U5 C0 O% K) P/ J double  SkipFloat = 0;5 ^: w& O1 R0 q- \0 u8 ^  k$ s
DWORD  ByteSkip = 0;
- k! y" I( H+ E _ULARGE_INTEGER RealData;2 L- _' {) l* B+ ^0 L, }

9 G' u: f/ J2 u, ]' {- r/ M  c  U3 _* a

9 C+ \5 X7 {7 P! w3 I3 c# { CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
  d/ t5 R$ w" U! i9 S& P/ ~
+ H; M7 S- x! g5 h
& n" F* E% t. z9 e1 G5 J2 K8 N; i8 _7 X% u( {4 Z" L7 J: b% v6 J
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
9 |, m3 K4 Z. I* @# I     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);6 u: E' W; k, w/ s

9 n/ N' R9 b2 B# P5 I* E4 A% S" L, k1 n3 Z8 g- T& }5 s

- V  Q# e/ f) |  m2 g; J hr = pStorage->CreateStream(LPICTURE,- x% q# u  k1 ^; ~3 c; P- c8 l
  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
" n- v/ ]4 N  Q5 T8 j9 u- |" x& g9 f  P5 U( a& }; V' U0 L

' p, L2 _( ?8 w- A  e7 G/ D* I& ~
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
& [1 u1 E* C/ f! Z FileStream->Release();
" H+ r; @, {3 A- l& Y! u7 y pStorage->Release();- ?5 n! V  T. O% l' b7 `! x4 m) C
Buffer->Flush(); 2 ^/ {" d1 v$ F$ _/ n* n1 {
; R9 m/ N  c$ P

2 N+ b( r8 O0 J* u3 L8 ~
' Y& j, _, j1 f$ m% `  j% X6 W9 i( {, h // Get Statistics For Final Size Of Byte Array
: C' G2 s4 _% y2 X" L4 s4 M3 Z Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
+ ^! s- I, S+ ?" }7 ~
' v6 I* W0 A( ]1 N" k& s/ b: r( G7 h& p8 H6 q  t

5 O0 |1 Y. Q" m1 i3 s // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
/ C& |" ~8 T( `( q5 } SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
; m/ b- I# n% Z if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
4 b5 _; V& x! y0 f4 a4 w1 c+ s else ByteSkip = (DWORD)SkipFloat;
2 L; a* a( S9 b( H) q ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
/ P4 X+ E( }7 ]0 M
: Z, U. z& G) Y% }7 B4 z$ L // Find Difference Between The Two Values
$ _: C- Z2 D6 Y* x9 y4 ^ ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);7 _9 _/ Z9 K% `! k2 U

2 {4 ?  O8 n( Q8 Q  A" \8 V( e. P0 B# f3 F5 y  Z) x
8 O5 @3 |% F  Z2 v/ t
// Allocate Only The Pure Picture Data
) e3 \( M. k, U4 @1 c/ d2 A3 b' x RealData.LowPart = 0;
2 Y' D5 |4 w# x. ~& O) b RealData.HighPart = 0;
  u- A) }0 L5 l1 o; O8 X* M RealData.QuadPart = ByteSkip;& X# ^% Y# Q9 M( H% J. W
BufferBytes = (BYTE*)malloc(OutStream);
$ z$ ?9 |* l* k$ P+ w) g if(BufferBytes == NULL)
$ E9 |7 @2 h7 @% U* |- B; ]  {
5 c2 O6 P% u0 `: P3 G  Buffer->Release();
9 n7 L; V, L9 s5 w2 E- u" p  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
8 p$ o0 y) L9 h) t3 S4 o  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
7 ^" L% S3 ?# G/ R) t  }
3 g1 }' @% P' E
4 H. G$ n0 j0 T7 y0 u
9 X+ j% B0 y5 w8 K! |1 h  n9 C
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);* \- M- G$ y: h! X7 y+ O! T& e1 l

" K/ ^2 ?, z6 |0 `! m/ _; }. D* v+ S& e9 D( `2 R' D' |
: f2 `; @# o. [" z/ D0 l$ b
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))* P8 r6 }! r+ V6 c
  {
) x  ^: b7 c/ O. a. ^  BitmapFile.Write(BufferBytes, OutData);
$ Q  d+ s1 p2 ^; F# X" c' @$ F  BitmapFile.Close();
+ w) `5 i& U* K# ]8 R  bResult = TRUE;
$ Z, N+ h. ?, Q  }8 q' ^$ Y& s: a4 l
else // Write File Failed...
! T1 s1 T) ]5 y. v3 P- \  {
: ~  q$ f: y) x' k+ j; I  TCHAR szCause[255];% P/ I1 O/ }. q  n9 P$ e
  e.GetErrorMessage(szCause, 255, NULL);
) ?  T8 A( p# l4 |. S  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
3 R' `& N3 {, {/ y  Y  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
3 i9 L+ h8 r/ N0 h) y8 S2 ]  bResult = FALSE;) v9 {$ V+ _$ e
  }2 A$ m( Y2 P! N& I" z; Q
/ o" X5 b3 g7 v; r* R% ?  \% N" z
Buffer->Release();
- K. E5 g/ [- } free(BufferBytes);
% P4 v2 f- n% i$ i
8 e2 v  u  S! |" I' j+ m
" L% o* A) E) d: A' S; Z* C2 _- u9 {
1 ~* [) z# m! A5 `/ v& b return(bResult);
2 W3 u: S# `. U* G) b$ V+ o}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-5 04:32 , Processed in 0.015236 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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