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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)' C! O5 x9 J" N, ~6 g& n, C
//=============================================================================# x+ f$ U! Z  g! O9 k  q" q
{
! c7 E7 y9 q& N' j+ p2 k* K BOOL bResult = FALSE;
) z& V' z9 d. a& y) } ILockBytes *Buffer = 0;
" @6 D. c. X6 @9 d1 b IStorage   *pStorage = 0;
: |! q1 j5 t" m; c! l+ w- q IStream    *FileStream = 0;; Y5 n7 v' s/ E" _$ m( f
BYTE    *BufferBytes;0 q, u1 i7 R% Z2 P& u9 Q
STATSTG  BytesStatistics;
) W& L- G9 z3 v5 ]  n' `2 [ DWORD  OutData;
. z7 X$ c* r1 x1 G5 _7 v) y( N long  OutStream;9 `4 e+ ^2 |5 t/ Y5 J. S5 [8 c
CFile  BitmapFile; CFileException e;6 ?8 t. t# d( R" E" A/ H
double  SkipFloat = 0;
$ g: K6 @8 }0 Y8 h4 `% j DWORD  ByteSkip = 0;- u4 I5 D8 |3 y
_ULARGE_INTEGER RealData;& R; I6 d9 E/ y* g$ t
" f- E! ]1 F& o, y) v# Y

4 O3 m* N5 d+ r" q! d! m0 x; Y% X1 @% W2 z- J; @, z
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
+ l$ a; f' @4 v  y
/ i9 J; R# b0 `* o6 @6 Y$ U  m& n3 _; F; [$ B, U) W
9 W' x( c+ j$ K5 p* n& E7 B
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,/ `5 U5 I- L% E) Z  k$ |- R
    STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
/ z( V) R) z. A# e2 P; `6 @# I, t; w( D. |4 @3 O/ T# V

5 g4 Z+ d5 i! _8 F* z- Q9 Q* h3 x. N" o" \+ U
hr = pStorage->CreateStream(LPICTURE,' F4 L+ K. ]  N) x4 |6 O/ h" Z' c8 A
  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);' L: |5 r+ ]* y

" P& z1 `5 K% m' R7 r
, S2 A* t+ Q9 J+ w; b7 L. o1 L  O! z( `0 T* y
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
) F' Q$ \) y$ a0 ~- A FileStream->Release();+ M  a2 z6 P2 s1 C7 _
pStorage->Release();- m# G1 J8 k: D# e+ j
Buffer->Flush();
" B7 g4 f$ k/ q3 X2 H4 O
) r& @. @. N! u2 m" @1 u( b3 o+ S8 Y8 b5 s! j2 c4 V
5 F5 K, @# G" ?/ W# y8 E
// Get Statistics For Final Size Of Byte Array& R, g# G2 ^) R- x) z
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
. {+ A" X5 g- w" u+ ?- ~' f1 @9 ?6 e2 ~- q9 `+ {) b. i. B
+ E( M+ N6 U8 a" e
) L, @  C( B) |, a' S
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)- P0 D7 h' w! Z% G0 D/ }; |0 w
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...2 y: L' y* Q; E+ z  C7 m* b
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
7 L3 _. l7 A) H0 a" `: j' D9 U0 Y else ByteSkip = (DWORD)SkipFloat;
; n; o, Y) @. p" }5 H ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...7 F7 t0 x  G, g5 e, j! P! M
6 U: ~- F! J1 O" J. q% ~$ x1 S
// Find Difference Between The Two Values
& j4 D  P) ?8 U: v# r ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);. [7 z9 W9 f4 m2 ^7 r6 ^

9 h5 c+ H: g# ~0 ~! g0 }" }- {9 w5 T  }- f

' f6 I0 `. L/ x' f9 L! S( M' t" R // Allocate Only The Pure Picture Data
5 H- ?! h' P8 x RealData.LowPart = 0;
+ I6 r: E1 x4 t3 L. x8 Z5 `/ j RealData.HighPart = 0;
( d& r% l* o7 V# v, { RealData.QuadPart = ByteSkip;
9 E9 y5 O! ~+ A# f0 F3 V- z# c/ b6 f' i BufferBytes = (BYTE*)malloc(OutStream);
" D& x& J5 ]& ~' L5 J if(BufferBytes == NULL)
- H$ F/ Y8 ?: s0 P5 z  {
& T5 }! |9 Q8 z% ^: Q4 O  Buffer->Release();
6 ^+ b$ W4 t9 `# @  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
: E0 ?( W* S! u0 A! g6 r  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);# W- M( u8 _1 m6 u5 w7 L
  }7 i3 `3 o1 P8 X

  N) L- r( ~- m( S: `1 ~+ y
! w$ Z. |- X- O8 s- j# a9 s5 H/ w' p/ {3 P7 r3 w/ a
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
  o. j  C9 M$ O! J
$ J5 l9 L; h  _9 q3 B( K; C' i" P
, s# `" _$ d* K2 N& q. [( G! B
& O( o! `9 P" R! y+ f5 m if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
4 c! U: [. r& n0 Q  d" h3 y  {4 L& n/ Z7 A, E! l
  BitmapFile.Write(BufferBytes, OutData);
* k2 g( M$ R/ v+ Q6 M$ ^- q  BitmapFile.Close();
. d9 M5 I' v/ S2 x+ B% q3 o5 Q  bResult = TRUE;
2 N/ y* ^7 E6 s1 V5 O( g! F  }
# k) j; B2 N* i+ t# L( e5 ` else // Write File Failed...* f8 k5 q  ~$ m! [: {6 c
  {
2 T& T6 o" F3 T* B+ T$ T! \1 e  TCHAR szCause[255];& z' `3 t! o2 x* q6 Z+ j
  e.GetErrorMessage(szCause, 255, NULL);
+ k  r; B# N) L+ P1 ?0 c& L  z  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;2 Y+ |1 b2 m$ l+ f" f4 h, u/ r# K8 T; E+ m3 G
  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);2 p. n& W& g7 N
  bResult = FALSE;& `4 s3 Z8 M3 E5 [2 C8 D7 _% d: ^4 k
  }
6 O% T  n7 A& t% U. j
5 F& k4 |* Y' _. L9 I' q' d Buffer->Release();# k) n" ~6 E8 j
free(BufferBytes);. a6 s6 a/ C& ~+ o3 F% f- Z, P

/ l9 n, X4 ~  v1 `" ?+ }/ o! u4 W+ t3 x; f2 K) g$ S, \$ v

9 I4 M% `. P$ O, `  D return(bResult);- U9 A9 q. s+ [' ?& g
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-30 13:04 , Processed in 0.036083 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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