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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)
3 o6 X7 {; e( c% O) s7 d//=============================================================================
' f" H; t8 e- ?# `1 X{
" F2 k0 H* q3 n BOOL bResult = FALSE;
) b7 E: R* Y' g# y. J ILockBytes *Buffer = 0;% L0 w  g+ a& J
IStorage   *pStorage = 0;# ?$ j6 F% u1 B5 a) H
IStream    *FileStream = 0;
" p" z% p2 }* V1 z! D" ?+ y BYTE    *BufferBytes;
3 q- I2 n& o3 y" K! q STATSTG  BytesStatistics;
* C, @0 n+ o, s7 t3 e' j2 D8 p5 x DWORD  OutData;
% A- ?( h3 Q) [$ q5 A/ T long  OutStream;4 Y9 F9 o, S$ {- A4 b$ o
CFile  BitmapFile; CFileException e;# ]$ r: ~$ k' V/ G7 B' x. P9 j4 g9 T
double  SkipFloat = 0;* r: `; ~2 t7 o- z, q4 Q( k
DWORD  ByteSkip = 0;! V% f: ]2 T; d( t# c
_ULARGE_INTEGER RealData;
5 B( ]5 P4 K/ R3 p: S. ]# j% C
& c  v+ i2 v# R5 I/ V  I& v
. J5 r4 C2 r: \
4 L8 {& Z! y- l9 _3 M7 X" o CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
: g( W+ b0 y, \* n% x6 d& S" I2 A
' c# n3 `, f/ h6 V( l3 b
' Z; l7 D  m0 }8 W4 c8 Q+ C
9 F+ ]1 A4 H6 Z% l* }7 h! ~ HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
2 M8 Q8 a! F8 _- s3 k& W# o/ A! O8 Q6 L0 s     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
% M% Y! C, v5 Z) X- M; `/ `
1 X+ y+ |, G, ]+ |' x) J
+ _0 D, F/ ?4 n* y0 ~' d; a  g- W
3 f* M' k( O( l1 Y, k4 l8 q hr = pStorage->CreateStream(LPICTURE,- }* u$ u4 }( ]3 |& B4 A
  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);: H2 T! \! f: H0 g4 _  W3 `9 ^

2 J. r* T5 B8 @$ B# X
- n1 G3 Q2 K3 V* \3 C6 V* ~) p3 g3 C+ i9 x5 N
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
9 o& J9 @8 J* B4 M# i FileStream->Release();
: Y$ J* C; R) q( M' _ pStorage->Release();/ A7 O7 K8 R6 v! C6 v7 _
Buffer->Flush(); ; U, s& L. X; y7 x1 X0 I4 b7 n
$ u# A' U* i& [: u2 n# F" Y" `
2 V9 b- C% Y# B3 Y  j2 l
: P- N: R- {7 e" E+ c# Z! S2 s& B
// Get Statistics For Final Size Of Byte Array
" J1 k, x# q; p  N Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);" ^% J5 m0 b$ O4 y

9 N. M. e  V4 l; g" r+ {$ n; L# K/ U3 Q

5 E/ m5 ]) d5 _4 \, i* v, l; Z! D // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
! C8 F2 \( r" D8 U; x. c' j SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...+ {. ^! p% W. o  x4 B% {% w6 a7 i
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;* T3 y" t, S# }$ j& }! Y
else ByteSkip = (DWORD)SkipFloat;
- n, ]) o% v4 t9 h: W ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks.... J* _5 r8 }. \0 x

+ u" @. W& Z/ `% ] // Find Difference Between The Two Values
& ^1 N5 n6 h2 |) \ ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);1 }$ a2 R: _# q$ a8 ~0 k
4 m" C8 ?  p, D% [2 T% d
+ ^: M2 m- ?; W+ G; d+ E- W* w- i

% J' b' V9 V5 b8 _, ] // Allocate Only The Pure Picture Data
8 ?  Z, H1 Q& L+ |7 i& t RealData.LowPart = 0;
% ^  G; V7 P$ ]6 u$ q4 h RealData.HighPart = 0;
4 C% U# V5 [0 |  T RealData.QuadPart = ByteSkip;6 ^2 M, H- w5 w" U$ t- F
BufferBytes = (BYTE*)malloc(OutStream);; t4 w  y8 }9 {! B) g2 {2 }: r
if(BufferBytes == NULL)
1 M3 M5 h  b" }) Q; t$ H3 a  {
7 [0 V& b4 U# O4 o# W' i  Buffer->Release();; p% D: ~; I) U/ Q9 |5 V
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
- V) _8 X) r9 J2 L: Z4 N" U8 M; v  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
6 p' Q# U4 u  B7 J$ h! D# ~' Z  }
3 f2 E$ u2 q; ?# ]' Q- _4 ]% u- L- M

8 x1 |0 Q+ K' w+ O& Z; j" _. ^1 S* K$ {* f0 R" N
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);% L# P, q: C! W
! [9 X7 U7 C; e$ s# H
7 s* h$ _1 i  J) M7 P  }

6 l, ?3 {, e$ L8 v0 E8 A& Y2 y. O if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
, _+ H2 L0 H0 V( N  {; s3 \# r% W0 U2 K  j2 I, X
  BitmapFile.Write(BufferBytes, OutData);
$ J8 w7 S, o1 X( v  BitmapFile.Close();
% y' d1 Q5 Q# }, }6 Q9 f* J- w  bResult = TRUE;5 {6 n" q6 N% d8 V- |; ?
  }
! p! e6 |( P# L# Q& t3 m else // Write File Failed...
& K5 Q' w4 W: o3 d9 V3 @  {/ u$ a4 C; |5 e# g/ b8 B3 y
  TCHAR szCause[255];
) m4 P& W% r' \2 f2 Y! k" d' L  e.GetErrorMessage(szCause, 255, NULL);
' c) }1 X3 W! L% K: R. s: {  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;$ d3 B9 i4 H% r3 u. \9 K
  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);8 `! t9 ~4 _1 X! Q" h
  bResult = FALSE;8 f, X' F, m! U
  }
* R- M2 `& \' s
, U- P1 E; ^& y# C2 p7 H. I# g Buffer->Release();
9 E$ c& E* h" v9 | free(BufferBytes);
* w6 Z! S# ?+ m  k
" X* A% H2 U( z- l& a) Y$ V1 Y. }5 T$ p( z' A9 Q: Z; S

1 u+ [9 R5 {) ?$ _' T return(bResult);6 l- {. m1 R! P" c+ f; T( p3 o6 d
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-4 16:51 , Processed in 0.018702 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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