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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)) ^; D: K4 i! l! z6 J8 r
//=============================================================================
4 Q: v2 j; C$ i* b4 M4 c+ L{
# A4 w: B% M, t1 ? BOOL bResult = FALSE;* W$ j# \* Q/ m* K# T
ILockBytes *Buffer = 0;
  Y' A8 Z+ ^1 ?2 B7 ~+ c1 N IStorage   *pStorage = 0;3 R' H# H* t* q- m* D
IStream    *FileStream = 0;9 s2 _6 Q1 d- Q% z2 B% y
BYTE    *BufferBytes;% A/ ]/ ~5 u  t4 _8 k: x( g0 ?
STATSTG  BytesStatistics;3 C8 L3 D0 F9 N" ^7 e# y5 z
DWORD  OutData;1 D& b' I% J5 f; ~+ ]7 X2 B5 n8 Z
long  OutStream;
5 H* ]- B& p" h4 R" C5 U CFile  BitmapFile; CFileException e;
/ ?5 }" ]4 _4 p4 j) } double  SkipFloat = 0;
. I* g  V( C5 S& f; }" o) f DWORD  ByteSkip = 0;1 W1 p* e7 z( E
_ULARGE_INTEGER RealData;. ^! S+ `" a3 C# P. }5 E
1 u- _' T* Z/ x- V4 F# O

9 u$ i8 n- r* x5 t! Y! p# a  `
+ D* v+ ?3 J; s- t3 | CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer( N2 W- a8 P) X) B- u

" E4 D3 ]" U1 T5 \/ S5 |* ]
/ o% i9 ^1 N$ ?# |) Q# \8 b7 |/ |& g$ d2 `& @& e+ a0 e, V
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,( W2 F) ?; j2 p) P% B
    STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
+ d- }; I8 E/ W: j( y
3 b  z7 l. y- x5 c+ @' h4 z  }) P" z5 p
5 U" I6 H$ J  V/ o/ d* c
hr = pStorage->CreateStream(LPICTURE,
/ Y! G9 h: x, K8 s' O  N: m: J   STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
  U, D: h1 U- @5 A4 h3 C3 B% i$ v9 \1 F$ D
6 G& p5 R6 o+ b$ ]3 e6 T
, [; F% E) [( f5 R+ G1 ]0 i6 i
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream; |9 |2 S! {$ ~9 ?% k
FileStream->Release();' v1 X$ P$ P6 p  Q0 F% |/ L2 U
pStorage->Release();( S$ _) |# a' s. N) b
Buffer->Flush(); 9 I' }" o' X0 t+ B. m2 z) w

: {3 o- y  w8 {, M* }& i
4 V! ^3 E3 p  M7 l& V4 N' v3 ^; o0 [
// Get Statistics For Final Size Of Byte Array
+ e' ?7 s% e0 Y Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);6 @5 @* |  c7 t/ |; \& \

0 N/ E, w1 k# O* s
7 Q# u2 ^. G' N% {4 j9 u3 O( H$ H# i+ r4 O
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
4 J, C# w0 o( L- h SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...9 }- q, ^' ]" R
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;" ]9 N. V  R) \9 O+ [* k+ B
else ByteSkip = (DWORD)SkipFloat;
3 Z% s' V' \" q9 f. F ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
2 J: L( P! ]' s( W
! _- ~& }+ p2 K, U) P6 f // Find Difference Between The Two Values" C7 s3 _* h# g% _! G& f- G
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
9 t2 `7 R6 J/ a( I. D
. N- l8 X& f2 y% j' |; Y7 f$ H6 M5 Q4 ]$ d& Q
3 o. n% x, }0 x; T, T. e
// Allocate Only The Pure Picture Data
* o: N) I" `7 W4 u RealData.LowPart = 0;
$ ?5 `: Y+ U/ w9 D( k2 L9 C RealData.HighPart = 0;
$ v3 J- u9 u) i: N$ B2 k, g' U7 j RealData.QuadPart = ByteSkip;# k$ I. ]( |5 W8 j
BufferBytes = (BYTE*)malloc(OutStream);
; p1 I; c, @3 b' h; i! w if(BufferBytes == NULL)4 t" {- ]8 r5 Z* _
  {
3 p5 u9 `3 @' N* F; l* v  Buffer->Release();
& V6 A6 R8 B+ A+ ~# b6 A9 M2 k2 }  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;, u2 S, C( w$ F
  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);5 R; z  G: D3 f4 _3 r' m/ q9 u7 g& @
  }3 w4 z6 }# h& V9 |+ }
$ d6 A) q* }5 {* r
+ |  t* r" Y  C# u
  I( n. D. G# \% s, M; Z
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);" h, ^4 X$ z2 _6 E
* j& \) g( B/ `$ E5 [

. ~, i+ R# e4 ], D; X8 c
) I# Z; e3 s8 a) f" N2 v4 b9 S% I if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))6 H) o) Y2 e0 x6 x) t& C  H' |) M
  {* C5 F, W/ H$ k2 ^0 n" x
  BitmapFile.Write(BufferBytes, OutData);' A, @3 Y/ ?, ?+ S  N8 `( d
  BitmapFile.Close();
! X) K2 k) Z. `4 t  bResult = TRUE;! f7 {* V; p0 c, z8 }3 P
  }
8 A$ `. I# ^8 A" j8 A" b' q else // Write File Failed...3 {2 b1 h( R3 |0 u, K7 h  g
  {
, y4 K" b1 ?1 P* o" Z  TCHAR szCause[255];
/ w: k- p5 s- H6 J  e.GetErrorMessage(szCause, 255, NULL);
; G+ k! R& a7 G5 W& \  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;. \8 x+ d  Q& F: s% C
  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);' F9 F. Y) R/ m
  bResult = FALSE;
/ U& }* w3 X! a1 q! \+ @  }& O" q$ b0 u& G5 R& E! |6 F  U( h- q& D

/ Y# G  Q) ?0 l Buffer->Release();% U: ^5 L3 a4 J4 ~0 |% Q7 K1 R
free(BufferBytes);/ @  H9 }; \8 Y) f. ]/ b8 Q  j

8 d5 |/ }: Q  @% X1 T  _1 A% g  u, M
; E. o& Z9 Z' X: ]- ~. M% }9 U) R0 u, l% w) t' ]+ |& J5 D3 U
return(bResult);
6 Q/ ^2 Z5 x9 I' g& j+ h' _! Y}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 12:26 , Processed in 0.018687 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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