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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)
( G; u, @/ t- a4 x8 ^$ k, k- G//=============================================================================/ w( H) C0 @2 v# K* J2 f0 f+ s
{6 H- q" F. x2 y4 V7 M
BOOL bResult = FALSE;, \3 ?1 n9 [9 G9 z7 x& I3 ?
ILockBytes *Buffer = 0;
1 j! C; r4 l, \+ S IStorage   *pStorage = 0;% l# y) U  }. T& }& d6 O6 E
IStream    *FileStream = 0;; E: ?+ d/ K) j" x4 ~9 j( A
BYTE    *BufferBytes;
6 q8 ~# A: Q9 ]% V( k; m STATSTG  BytesStatistics;  ]) j; ]% o/ F0 b" r: i+ S% z" w
DWORD  OutData;* u$ g/ V7 s( `; w
long  OutStream;
" D5 `/ L' U  s/ L8 o3 t6 b CFile  BitmapFile; CFileException e;' S/ B$ k$ _; j$ P! P+ t
double  SkipFloat = 0;
( |( h9 V) q1 i% N DWORD  ByteSkip = 0;8 l5 z7 c; K1 P0 N$ U* q) E
_ULARGE_INTEGER RealData;0 j% L% p% o5 L0 g, E
3 P! z& @& F& _$ [0 M

* g3 w0 b5 `5 i9 U/ L! L6 z* Q! t; D0 E( S4 M. x
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
5 u9 @" d/ C! }; U; v6 X+ Q% c/ \; W3 [: y, y1 u4 q
" q+ }/ ]5 ?/ R5 ~4 ~
! c1 c2 X( W1 B8 t1 u
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
+ N9 o' Z7 V! {9 J1 Q$ s* R     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
# M$ e) U+ g" x# [9 S
7 _# U, {2 U) _! Z4 g
% s" e! I0 c/ d0 q& M. U9 e
! m& u5 |2 l* |' ^4 \7 F5 `/ H6 U9 R- | hr = pStorage->CreateStream(LPICTURE,
) M( L3 ?! u: I# v7 E% _: v9 H   STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);# Z+ v# p% B( Y2 n

# A; V. m0 `2 A0 }) c- `  r1 l$ I; {: S/ d/ h* F
6 \) }' I; n+ ?1 ?
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
! S. @4 f# m, V& W! Q7 C: y" b FileStream->Release();/ e' o% R) F: r& o6 Q% I" d$ z8 V
pStorage->Release();
& @6 o; @' g$ @% T% d  M8 p$ l  ~ Buffer->Flush();
5 g7 x0 Z- Q$ @; C2 W' W; x" _
3 }  L+ _0 N5 w' ~. Y4 j" I: f, I0 g6 T$ B6 J! a) c7 Q

0 B1 I5 I4 A' [+ w // Get Statistics For Final Size Of Byte Array
; R  ~( I6 O4 b# J2 y2 b* V" c( r Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);5 G, ^8 }5 J4 W! W2 T1 I! M4 \
: I. N! n0 C( K; r+ H3 j
9 X- [  W& J  k8 ]) R

6 x6 H8 O- a1 X* @+ q# u- c* E // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
4 Y/ t" a+ p7 ^% A SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...; {7 V* _7 ?; |# o, j4 k
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
) D# t2 p/ ?* H4 P8 t* j/ A else ByteSkip = (DWORD)SkipFloat;
: X. y" y1 V1 Q- ^' X ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...& J  K& p) y7 l- |
$ ]8 I4 ^3 C2 E: |$ G8 Q
// Find Difference Between The Two Values
( v5 b/ H* G! K ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);/ N& e. o" M# E( p7 l' ]: X

' u6 ^* r8 p- I
5 h% ]: H" L% `8 |. |
7 s) a8 @, x/ X& c. F8 E  G5 } // Allocate Only The Pure Picture Data% b+ T" r! a3 F
RealData.LowPart = 0;
3 n6 B; n) l6 f, N/ n RealData.HighPart = 0;
4 Z" E' b0 k* N% l  `; D+ R RealData.QuadPart = ByteSkip;
0 b, l0 @; I2 ~- X( D BufferBytes = (BYTE*)malloc(OutStream);
9 r' r' M# u" U' I if(BufferBytes == NULL)
; Z# e" m. h$ G2 E  {
3 i, b# S) n! x6 S% e  Buffer->Release();% u. z- ?! C: `( G1 s
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;' a' k$ i) m+ Y4 h, ?
  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
) ]6 Q! V! S7 y4 W, [* |  }
/ q- k7 ^6 C0 A  n6 Z) d) l) E/ O. A( R& `# R
6 q, }9 G( I* I5 X' L" }' K8 g
% J# I% o5 g+ x2 ^$ f8 _" w" l% M- q
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);1 k* ^8 d: F" u1 S
$ S; @1 \, b; w# I
& c4 r+ S0 A8 K

5 w! X/ R6 U4 Q! C& r if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))2 d3 \( l1 k  W% r7 ]' S7 H7 b
  {
  q( l5 B4 A$ [* A( q  BitmapFile.Write(BufferBytes, OutData);; ~4 @$ _& i- \8 U) a( z/ Y
  BitmapFile.Close();
' ?( f0 _+ s0 [: H, f  bResult = TRUE;* G' l& O2 V/ [6 n$ [* f
  }
, v& h9 |- e4 w4 p1 K else // Write File Failed...+ i( u  ~5 k! y3 e: f
  {
" ^$ z% H! x* [. N, Y% I7 s  TCHAR szCause[255];  M8 F. N% x8 ~0 W
  e.GetErrorMessage(szCause, 255, NULL);
' l( I: r% y& f/ x  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
' U9 E5 J4 U+ x6 K; o; N  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);% {! S/ R, z4 s: v- b+ o, e, P
  bResult = FALSE;, i3 o' T  v7 T# v, T9 y
  }
' O4 A- L5 w4 I5 ?( V$ G % g- q$ V1 C7 C3 p
Buffer->Release();  E+ F7 Y7 K( }0 h% B, N9 H5 k$ R
free(BufferBytes);( @, k+ I' u# I- T& k( a

- o5 O& I! T% O! \% F. \4 ]- i2 s
# t$ I: M8 s, T; c  E% x
return(bResult);
4 ]* h: t$ O) t3 D& R}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 18:09 , Processed in 0.019998 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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