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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)
0 m5 W# S! r& S6 F6 X7 j7 c//=============================================================================. j! ]) D: x# c. p& t
{
5 I" C' x! R9 Y  b' W BOOL bResult = FALSE;
+ ~4 p% B8 h  q) t, e) j5 j* e* ^ ILockBytes *Buffer = 0;
5 o; m+ k) _" y! `8 ?- s5 t2 f IStorage   *pStorage = 0;5 F  I, F+ v9 o  E4 y6 `  S
IStream    *FileStream = 0;' L. V* E: P, S1 A5 J( h
BYTE    *BufferBytes;1 U6 [7 O1 ]8 v
STATSTG  BytesStatistics;
) h- M0 ?  X4 Z DWORD  OutData;7 S3 m' ~& ?' u% B" \+ ^2 B2 s
long  OutStream;
/ M' R# d2 f0 D CFile  BitmapFile; CFileException e;3 z5 p  r, Q7 @6 h4 a
double  SkipFloat = 0;) n9 N% e2 Y1 l4 M- ]
DWORD  ByteSkip = 0;6 ?( }9 ^6 x2 w  Q9 x
_ULARGE_INTEGER RealData;- ^  v! X+ M/ ?1 O9 w2 i' x

! s$ @: q5 F- G8 ~6 f* W: u9 C& ?3 o& j& @

! C5 t' h" h4 ]6 o" E CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer' C. u" k9 E; B

' ^! @& ^, B" V- r
& ?/ ?$ e8 E* O" O6 V+ h! |) H5 t. e, |; G
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,3 Z  A% s" J7 \- c0 i# K
    STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);! c3 X4 G: x+ _1 L
; f; v; ~7 ?$ A
4 T& O) ?  G9 s+ d- {

/ L& Z; Z0 ]+ \ hr = pStorage->CreateStream(LPICTURE,
3 }. E$ w( ]; }   STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
% L9 W' u  |3 {3 d+ c0 H) w0 f( P' D) ], g* a$ N
2 W+ |$ I0 |3 t9 l
3 E# o% _& U# G! N# k# K
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream4 S$ a3 f- `0 o1 a1 Y7 ]$ o  a) k
FileStream->Release();
4 h# S+ m( l4 v! H# K  C8 m pStorage->Release();4 a( s9 S  o& u$ P
Buffer->Flush();
  U( c- K3 j* m! g! ?; J0 i
+ q3 p3 s1 ^  ]: D, \5 E
+ Z% E4 R6 v2 H& T9 `; m' y# B
! Y- \% {2 q5 P+ P4 Y // Get Statistics For Final Size Of Byte Array7 E+ D/ E1 ~7 B. ^+ i% g4 L
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);  s7 p% t7 X  g

( K/ R% R1 l2 s5 g8 _. Y  \1 t. [# K$ j7 m2 O1 n/ F( E% O
, u% ?8 O5 A7 T. [! V
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
' J1 @2 `2 I' W5 M6 j+ k( p: Y SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
0 N  x7 m9 U: q4 _ if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;2 r9 b6 U6 k7 s5 A( k
else ByteSkip = (DWORD)SkipFloat;# y2 \1 P6 }+ C
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks..., j4 o$ [& ]7 K

/ O! `" ^" W8 k6 c' z# m( Z/ x // Find Difference Between The Two Values: d- k$ h, X; ]2 z8 _" ?
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
$ v) u: m/ X( A$ g2 x
! x/ q) w) t6 T1 X# c% l+ R& N) @% d0 M% S  R' I1 p& V2 j
+ J! r9 Y, g9 K4 u
// Allocate Only The Pure Picture Data
9 S8 a. X7 a" X/ k7 K- k  w# E RealData.LowPart = 0;# R$ g; |' V2 G- E2 D% m
RealData.HighPart = 0;' _" l8 x( {' G, [
RealData.QuadPart = ByteSkip;
- |2 x! s0 v+ e  t2 }6 ] BufferBytes = (BYTE*)malloc(OutStream);$ E: D4 i4 C0 x- @/ Q% t9 W& R
if(BufferBytes == NULL)
  |/ b9 y; Q' u4 _  {# M/ n% d: L. T; f- e1 y
  Buffer->Release();; X' ~8 X9 s' O' `6 B6 y
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;. M& |/ x4 |# d+ R$ ~7 d0 D  R
  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
) y" [, E1 C: N7 b$ A0 p  }
& q/ Z1 U5 F1 x7 i+ _' U/ h6 N6 K* p7 u( A' \5 Y# |
6 J. l3 n( G% w- x9 m1 }) q6 u/ I
. n& q' L1 k  A* M* m/ Z& [4 d! [
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
: e; X: t0 T1 Y, D* l- ^7 \9 P" |$ X

2 s9 a1 F6 x4 e0 T! u/ U' Z) E
8 V2 ^( F5 V" m* O0 i1 A0 s if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
5 R) s, G+ u: U  x  _; H1 y  C  {
$ `5 x1 N) V  j+ q  BitmapFile.Write(BufferBytes, OutData);
* q$ Q. A; t! y/ Z, w, S: u4 S  BitmapFile.Close();7 }* O( u0 U8 t
  bResult = TRUE;5 v+ O1 Z( ]+ e* h  a$ K
  }
/ I# m6 x' W9 l3 {7 ?3 X else // Write File Failed...
# m: z* v9 n/ K4 A0 {. o  {
% L7 }! I* a( b  TCHAR szCause[255];
$ l' h! r( m0 Y  e.GetErrorMessage(szCause, 255, NULL);
8 a" g2 U9 ^( N  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
6 X2 i5 Z( T# U7 J& V) @: G8 b  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
* ?1 t6 T0 y# M2 P. ^9 o( }  bResult = FALSE;
$ n' l; _0 E% m+ g( |# ]  }8 N' z+ G& F0 X
) k+ J4 F) P0 J7 s# K
Buffer->Release();
) E$ i1 |" k" |6 ] free(BufferBytes);
( x5 ]! O) O8 ^% |
1 A% p9 y2 a7 ?2 m4 \  i4 @5 \: s2 K- Z% w7 d
6 }# b5 |* o# G  I, e5 W
return(bResult);8 K% ?: Y. ?5 g. c' k- A) u' f
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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