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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)  u& n# ~0 l& d9 w0 A. S
//=============================================================================5 A. ^1 J% ^* a9 {( B: Y
{8 j, K9 s; y( n" `/ A8 t. g  o' @* f
BOOL bResult = FALSE;) s# y+ Q3 k+ N) {# H
ILockBytes *Buffer = 0;& J9 }/ M6 d; \: ?$ A
IStorage   *pStorage = 0;
3 x% t) Z' \/ x$ Z IStream    *FileStream = 0;# w! f$ @4 C/ g' X
BYTE    *BufferBytes;. a4 U: \- r2 \2 t7 D: z
STATSTG  BytesStatistics;5 Y$ u  o! G3 k/ i/ `( Q0 `' w% M
DWORD  OutData;) e& Z5 |- @6 E/ x1 H; \  g
long  OutStream;
& \7 i5 p8 U2 M5 W/ K, O  k" e$ C CFile  BitmapFile; CFileException e;7 F1 D) X5 r7 U* D$ s; ^) x1 R
double  SkipFloat = 0;
2 \7 E  R9 |! G: ` DWORD  ByteSkip = 0;% g' [4 [! \# \7 n8 U1 t8 }5 N
_ULARGE_INTEGER RealData;
/ R0 C/ F' k$ i9 I& M7 l3 [$ z6 i6 k- b0 z( x/ u  F* y

8 ~6 W& H. n  @0 g0 q3 H+ M( p) ]# W
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
" ^1 _8 q7 P" x3 c0 p' F
" B, c/ k, f9 t; j) a. U0 o5 h' C, b1 W( L; G) e
$ ^, |, P" p+ O* \! p
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,& U5 v: C# [1 R% y7 }. f
    STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);$ Z$ `9 \8 p7 |: \  E( D
5 m' w2 @6 e3 V6 M' D3 l
* S6 B, W& ?/ d2 I5 S

% {1 U$ K( i* q: b$ b+ y6 i2 F& m hr = pStorage->CreateStream(LPICTURE,6 U- v  B! F" v* I3 _
  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
$ U  U$ [1 E; c* Z0 |* ]& n5 h: s5 W

# z5 i( V; ?/ C9 S0 p
5 a0 f6 p4 b6 `; b  O2 k4 S m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
# k( ]# ~3 D- z: @3 o- r7 M! { FileStream->Release();( f* y& r1 g7 S' s3 T
pStorage->Release();
# k+ |5 n) k7 Y" t' C: N Buffer->Flush();
+ m/ Y, N, o# i- P8 |( k  u, r
% l: ~; R" M3 W8 ^
* F/ y1 w9 o0 T( n. ?
, S( h) C) H. ~7 w9 f0 ~ // Get Statistics For Final Size Of Byte Array
0 D% T  e4 J# q! V Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
% c8 Z+ h' C3 P. T. `, Z0 {3 N* K4 H' i7 {5 ^* g. i

# p# N- S$ R& H2 b! a+ W) [0 M& b1 O2 G& ?' ~3 p
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)- e1 i: n7 x( L1 j  X: V
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
' R- [  U5 R( K4 D; O- o0 l4 c if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
/ `$ @# w6 l- Q/ A2 R else ByteSkip = (DWORD)SkipFloat;0 `- o4 O6 E1 Y0 H$ T2 }( a! k8 ?
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...0 R: m  D* e4 z0 E5 H3 H
9 G9 W( ~+ l# L7 X# P& c0 W$ z
// Find Difference Between The Two Values' J0 k: K7 A3 o+ t1 P
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
- i/ Z1 _  Z1 N$ z4 t
& k2 k. W. C; M% x, e* A0 Q5 R# H& V' b: |. \! H" G7 h& a
: i- Q+ l) n* c/ w1 |
// Allocate Only The Pure Picture Data' C# S( V( F! o; D
RealData.LowPart = 0;
$ r$ y1 H3 _$ r- ^5 z RealData.HighPart = 0;
6 V$ O$ B& u& i( z+ `3 @ RealData.QuadPart = ByteSkip;% N* {! j* K( F* V
BufferBytes = (BYTE*)malloc(OutStream);
5 Q- O! \3 ?9 ^4 Z1 u6 Z if(BufferBytes == NULL)8 M+ z, {' M/ h6 O* k
  {6 d( {; J8 ]# U) k8 Y2 R
  Buffer->Release();
" W  B0 W' S" j( A$ R# S3 U4 I% D: _  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
5 ~0 k: V+ P- g0 u' _, @  a0 _  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);" h5 j- _2 S: }5 Q( V' |) F" z; t
  }
, V9 H+ M# c. q5 P+ k, P  i( T4 P; ?* x5 y

- C; ^' s  ^" p9 |( x) x  v% f
. g6 x$ s, F+ B6 {! @' t: h Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
6 R  e$ C- p, R4 d1 n( \$ P
% u! z2 j% l: }5 }: y* Z0 H' K+ p( Q/ H( x2 z9 D/ F
# r9 Q1 p% F2 Q# }
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
8 n3 L% a+ m# u* s% @6 r  {2 X  @/ _# d6 w: S
  BitmapFile.Write(BufferBytes, OutData);
, F+ [" t/ j+ @  `* |  BitmapFile.Close();
% v2 N5 P' N5 D: i; s  bResult = TRUE;
' R8 v% k* D9 x/ y& j  t  }3 M( t  q' T2 }9 s2 ]; `
else // Write File Failed...' @9 ?- D, d; n2 R# M3 s7 u" x
  {
" {, B4 u8 S- W* j  TCHAR szCause[255];% T8 d( O2 P3 e5 i) {# I3 P1 f+ c4 W
  e.GetErrorMessage(szCause, 255, NULL);% s# ?& F' u$ k
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
: y* N7 x' K: i4 w' H) U( z+ J  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
% ~# Z& a% R9 c3 y6 E2 U% J/ Q7 i3 J  bResult = FALSE;
% y3 @8 f. Z8 |+ @0 k' A  }# A$ x% f0 \# f0 O

5 J  p4 ]2 @9 T, E! i# Y; c1 ~ Buffer->Release();4 M% `& Q# ]+ R' k, n0 H* U/ `" E
free(BufferBytes);4 A" K7 X& E7 \9 M5 ~, K

' r1 B5 d0 I( @9 X7 W" {; ~3 k. d" }, K# S
5 D3 A* E& Q$ U8 M" i( ]# g8 r0 Z! P
return(bResult);/ w$ ]* h. S3 T
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 06:57 , Processed in 0.018310 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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