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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)6 _' G- @5 X1 d# g
//=============================================================================8 F" k6 k2 j8 }% D) L+ q' K
{; t: c* L; f$ q0 w2 b$ S* J4 n
BOOL bResult = FALSE;* E+ u& E$ v9 ^3 Q% X$ w
ILockBytes *Buffer = 0;
# E' a1 T) F7 D" n) e IStorage   *pStorage = 0;+ p5 w% C( [( ?
IStream    *FileStream = 0;
; c: h; f+ r5 f BYTE    *BufferBytes;
8 g- y! G1 }7 p/ b STATSTG  BytesStatistics;' S+ V2 [% c( S
DWORD  OutData;1 \% d% o5 }: t  D) B8 b8 N
long  OutStream;
9 i; U4 ?" w: p, X5 G1 n1 a( o" n CFile  BitmapFile; CFileException e;% L' Z  c5 B4 M
double  SkipFloat = 0;5 z6 H; @2 e1 @: n
DWORD  ByteSkip = 0;# E, F$ k% Y! X& G
_ULARGE_INTEGER RealData;
/ q8 S. I$ A* o: g3 D3 C  j8 H
7 V% a$ m4 L9 o6 t+ p9 u5 q
( f$ y4 ?6 ]/ }$ M" y1 \1 n4 Y+ W5 k0 ~5 W. n$ j* \5 M
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
7 S/ D' {4 Q5 W% u3 S& u1 k, O7 R- B1 V7 l( `, v
; C# y) b' r1 G# G; D! i
6 ^1 P. e3 W! k# Z2 q' g
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,0 l9 c5 Y7 C( w2 y5 g+ o6 @
    STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
, z, r2 E; y+ P( Q5 o" Y! t+ K+ i
" {5 `; h% j% C
' y7 N1 L! o5 w. P) l6 f
hr = pStorage->CreateStream(LPICTURE,) u% X0 k" D* q3 r5 Q+ V
  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
5 m: }# |1 p1 _7 m
5 ]1 T) E5 g! Z
" r2 I4 Z6 l. f1 x. P: e# O, ^+ E4 p: X$ @+ G  y8 J" F. H) k
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream: d3 n& I& {; c) }( }
FileStream->Release();/ a. f5 B$ |. A; v  \
pStorage->Release();# o0 A. ~# R. Y& a
Buffer->Flush();
- }' n; d5 s0 f1 e  ^9 ]+ N+ T, z; \& [1 q
' F( o: [: B2 ^0 P4 B5 c
6 m2 F6 y2 A- H) x( H8 ]$ s9 p: q
// Get Statistics For Final Size Of Byte Array7 \% m0 j; _8 t* f, C! C
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);- A7 z- ?' e: y3 j; A

. X- P7 ^4 W* s) E- b0 U& o5 R3 Y+ P! G$ e

' D; S5 K, ^# P, Z- P& G // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)( D* t. l: x8 p+ F
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
7 d0 H' e" M% u5 l. ^8 L$ y( h if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
& L) d9 ?; H- X9 c else ByteSkip = (DWORD)SkipFloat;- B2 _% d2 D1 s3 ~8 V7 l
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
# i2 r$ Z" L( X, N 8 j: G- f5 |/ n- ?3 p4 I2 f
// Find Difference Between The Two Values1 Z+ ~# N5 a( R
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
) _6 \) m% w3 {8 A+ k* J* Q3 p0 q# x' D* M# C( [8 N1 @. K

2 G! a2 }9 I6 J% D( V& i0 z) B5 b; ~5 O5 H; _
// Allocate Only The Pure Picture Data
% f6 f' i6 K. |( r/ J, n" ^( C! o5 I' ? RealData.LowPart = 0;
9 A8 W6 i  r9 q# e) S RealData.HighPart = 0;2 B1 ^4 p6 [7 b% s! x0 c$ Z
RealData.QuadPart = ByteSkip;
  R5 w  G8 A" k; J, M4 c BufferBytes = (BYTE*)malloc(OutStream);
3 s# a9 j. ]1 d! e if(BufferBytes == NULL)) x. B6 W2 T3 ]0 O6 N
  {
! g$ }. C( |9 w1 s. _) @  Buffer->Release();
' B; @) O7 u5 e6 o, g$ }% @  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
* ?! t7 c" C' a+ |* v1 a  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);/ s, m7 v6 _7 m
  }  d8 Q, d/ ]5 }; W8 o! O- y
& J0 C  u/ h8 }4 O9 ~0 t
& C4 ~( e5 i/ ]0 n' w# t' p6 T/ {

' l7 r! b9 x5 c+ A: e1 w. \  _2 H Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
- {8 P; h- F5 s1 P( K" G0 t6 J7 U4 P: b7 [. X1 F" e
  y& l3 g9 v; @5 A

, s/ N* p: R7 q' I if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
- ~5 E" C2 _: u$ S, _  {
9 d/ Y6 |- k$ q; L- o/ @3 {* u. e+ k  BitmapFile.Write(BufferBytes, OutData);
2 Q  o) I" j5 I2 O$ @  n8 p# Y- |4 X  BitmapFile.Close();
" ]! A4 v. w& h: y/ g. a% n  bResult = TRUE;
6 Q6 }$ K2 W$ }* h2 A  }; ~# R5 K0 \0 F; u! q
else // Write File Failed...4 H$ ]; Y4 L0 V! W
  {; W/ ^+ l! |/ e9 Y( h0 k
  TCHAR szCause[255];; j* @! {( f( K% A0 ?- _  j' o
  e.GetErrorMessage(szCause, 255, NULL);
9 r. u7 h; ~( c) \, R9 N" p- n& t  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;; `, m8 L, o# F- h1 B4 ?; Q) Z* c) D7 W/ x
  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
7 Z. q! i2 V+ o/ n2 M  bResult = FALSE;1 Z1 d- W* K% ?' U
  }9 d+ N+ X  H. i; U

" d! J3 t& |. v+ S Buffer->Release();% V5 K3 ~% f/ \
free(BufferBytes);
1 R/ _. e; V$ h3 _- K! y2 p: g

. Q0 V4 f" Z, o2 o$ A
6 n  q! r  m6 Z( T  b9 G return(bResult);
2 f1 W- L5 v: G& S+ K) p: [0 _}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-30 11:11 , Processed in 0.035872 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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