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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)8 Y- l- h# D/ g. _* C* y
//=============================================================================* O4 k% U. j& C1 A% p4 y
{
& Q" o: Y' t: T! O% @2 |; n- M* v BOOL bResult = FALSE;
- o, X; }& v5 N2 w. T1 L ILockBytes *Buffer = 0;
- Y4 H6 \: }/ ^' Q5 Y. H! I" k IStorage   *pStorage = 0;: A1 v: f, @$ z7 V  x
IStream    *FileStream = 0;
  v4 c) C' [( B$ I" p BYTE    *BufferBytes;; ^7 x1 V1 v8 s  m" s$ l5 j
STATSTG  BytesStatistics;
& @/ r8 J/ X* a( d DWORD  OutData;
' W- k# m+ l' F4 ?8 r long  OutStream;
0 ?9 d% [$ n* W CFile  BitmapFile; CFileException e;
7 d- d. L% F6 V* \# y- b3 x double  SkipFloat = 0;8 `/ j; k; F, }$ U) ^9 K, Q
DWORD  ByteSkip = 0;4 P- w* ]3 i. D) @6 u- \
_ULARGE_INTEGER RealData;
+ i+ S+ W/ ]" P( [& ^$ P. D" R2 E+ J- y8 K, |- P. d  J% d) C
  z& {8 E. o5 b

. W' {8 i  Z3 X: E CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer* w9 `+ D3 B' O1 ~0 q; u4 \- P; t

% w' f" ~8 t1 D; |/ X4 y* a0 h8 g1 T) J6 ^% O
; d/ o) u9 k% w8 r5 D
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,0 X* h( Q( \7 s) B
    STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
( K8 [! M2 t4 H) |
9 f9 S1 j  q) h$ D' d& l
/ F: X5 g& f2 G# ?4 D* [1 F, ]5 O- A& l* d" X
hr = pStorage->CreateStream(LPICTURE,
5 ?3 r- {1 r0 B- d- f   STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);8 B3 Z8 B5 _' s& i4 P  C

9 C: u0 Y7 @$ }$ r% ]2 R) s" p& P$ c6 G4 y; C7 G: V

. S1 d/ b5 j! ^ m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream* Y/ n0 k! {2 g3 q3 G% t+ M
FileStream->Release();
# {$ A/ y0 z+ l4 `, g8 P1 u pStorage->Release();3 u3 l: m+ T2 {% E4 I; G
Buffer->Flush();
, Z; s, n+ x7 z* j# F4 O5 z  y& ?
) b0 {  B! S( h: X
( E& [; w* T- S. X. ~9 d( X3 J! J6 U4 K. N) N  E
// Get Statistics For Final Size Of Byte Array4 P7 w, z* o) u5 I! m. u
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
# _3 B+ E" R1 K; y' R6 o' `$ p; G9 _/ r3 |

; O: I- @' V2 e  W# F4 ?& \, r7 G5 j$ z% C
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data): K" d* c% a4 p7 |
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...- a. V& `) N! V+ y$ H+ N
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;, U/ j- I1 Z, m: B6 P) j# x1 a) t
else ByteSkip = (DWORD)SkipFloat;7 X% V* Z& q! F! L' l
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
8 ]% l9 A+ N5 j; V
; E& w9 N/ F+ I+ `# D- @ // Find Difference Between The Two Values
" G# U7 b+ |% i: h; \8 i5 ]9 s ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);) f7 i* u0 E9 d' Y5 b
) Z4 r& Z) d. E, I% d/ r

: i+ V, J; v4 f9 o$ \& D. G$ }
+ P* z/ g* [  j8 F7 |' F // Allocate Only The Pure Picture Data0 U, Z% _, z  K( Q9 b
RealData.LowPart = 0;
7 i- E" t. C. g6 H7 S RealData.HighPart = 0;
/ L; i5 Q. `; u2 \+ j  P RealData.QuadPart = ByteSkip;6 P& G6 N9 r" c( t* [; L! t- a( T
BufferBytes = (BYTE*)malloc(OutStream);
7 v) r& y& A" q) [ if(BufferBytes == NULL)
( F. X7 q( |4 c$ E  {/ _6 c1 Y2 R% _2 C) v+ F
  Buffer->Release();" O  `# u0 z4 |
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;5 _. F+ c% T  r$ v" [
  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);1 c7 D! b, _, _0 x% M- Y4 S5 o! G
  }
+ f/ _% y) I! o  u1 N9 {2 j4 [+ E0 U0 W! `4 y& u

; a& W1 d9 h) Z0 d9 u  l& f
- P# O4 ^& r7 L; k) e- J Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
# V3 i" N  j0 b4 b% X9 L4 ]0 ~& m, y& K! m# \

) l$ |, {! D$ [4 p8 s+ ?$ ^. e) a+ a: {9 L7 k; ]0 Z* d
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e)); L; F! E, C+ M/ Y* Q! V( m
  {
* Z- w- m0 r6 g/ t  BitmapFile.Write(BufferBytes, OutData);8 s- J* Z( L0 I( ~
  BitmapFile.Close();& K, u1 i5 D1 y$ w, V' d
  bResult = TRUE;
/ H9 B6 ^+ w' {: L2 U' q0 x0 f  }" I/ Q  v; C& \" M' Z
else // Write File Failed...
' u( h0 y( t  j4 C  {* U0 C1 x/ ^# R8 x- p
  TCHAR szCause[255];! P2 S- ^! P: l3 z& J
  e.GetErrorMessage(szCause, 255, NULL);$ o7 Z3 s( w& A2 u( z+ P
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
3 H" a5 G* g' j( m- A6 P  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);6 }. z. A5 ~, \; A, x
  bResult = FALSE;
" W  p+ H, a4 [: B( o4 G  }' n2 r, W" l4 |  d% k6 Q. I
) k$ @2 T# N" u
Buffer->Release();& D( o& Y3 e5 v( T6 k- l4 L
free(BufferBytes);
" c: v: g* U( ?/ @/ w. f5 U
7 F9 t4 u- x0 C
. V, Z& ^0 q+ r# a4 e" W- o' ?+ ^' n, j" t
return(bResult);
1 q+ k6 z$ f& ?5 }" \}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 10:22 , Processed in 0.019596 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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