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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)
1 c# l4 c9 K3 i/ a0 i//=============================================================================
3 d  I: N5 l* }1 V{8 e# `* {* p- S3 R' P( f* d
BOOL bResult = FALSE;' B5 }/ h% @1 Y6 t1 h4 x4 ?$ Q# T  d- W
ILockBytes *Buffer = 0;
- B4 {/ _  d8 e' _4 c IStorage   *pStorage = 0;- }' b$ p" K! y  {3 j" ]+ [5 P: q
IStream    *FileStream = 0;
" K( k3 {7 i, @% `/ l BYTE    *BufferBytes;  ?- j+ E, V" k/ j9 z9 `
STATSTG  BytesStatistics;
5 p6 r5 Q( _* p3 n. B4 x DWORD  OutData;! H% u- E& v+ v: @$ I/ N+ ^
long  OutStream;! u9 U& y2 _* q& N% h& w2 D& `. z" z
CFile  BitmapFile; CFileException e;+ Y) G6 w" |) W
double  SkipFloat = 0;1 h9 V" N6 X0 u6 J) Q
DWORD  ByteSkip = 0;9 g$ N8 L+ x+ z: ?
_ULARGE_INTEGER RealData;" [. D+ k) E' u: y. ]2 [

5 t* @" R6 M) [  v7 r1 Q9 h& b, `1 M; u
6 F9 b' m. L8 H( G- y2 M; R
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer6 ?: t% [3 V6 o' }

; y' [# ~8 a6 t6 u3 U
% Y6 Z$ _8 P6 O4 E* E  i1 \
) n, k4 V0 r$ A  A HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
  D0 g2 k( s* Y6 z+ y* J     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);3 ~+ g: F8 K5 n& [

8 K, r6 G- Z, s* T# S' x8 ?, ~
# X8 g% e9 ]- _/ Q$ R
hr = pStorage->CreateStream(LPICTURE,
: P) }# _4 B; Z8 q+ J   STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
% `" g7 h: [1 u, u4 j5 U
. }" G. i3 g0 z$ i: `
# Y9 ]+ Q8 Q4 X! U" q4 w3 ^$ [
+ ?3 a7 M4 m- T4 q" B+ ^1 l; U$ x m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
6 m* w1 n# i( G2 a7 A  {/ E FileStream->Release();$ V' d8 c% t+ T5 C
pStorage->Release();1 }) J3 \4 b/ o0 O7 x
Buffer->Flush(); # c  l$ y% |% o8 {% B! h' B, ?& _, U
1 a- q0 d7 W: d/ ]

+ Q8 {, u5 q& w" D3 J, S" E+ a' `. S  u, P' j
// Get Statistics For Final Size Of Byte Array
& c" R. f) z7 A: O0 p+ C/ S Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
5 q0 ?5 X# ]1 D# q
0 h: \$ ^& q9 W3 i4 M0 O  Y% m1 }6 [3 U/ `+ T( ^

3 E: p0 e$ \4 u# g5 ]$ U5 y9 U // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
1 S4 A* I0 U1 V! e0 ^# C SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...3 i6 j# q( {. x7 Q% ]% w
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
2 x/ E7 x0 v7 B2 Z" j7 U$ ? else ByteSkip = (DWORD)SkipFloat;
) m( {+ R0 C- Z! v' @4 D' A! S ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...$ c/ N. }# D: R' R' x+ W
, e' H! v% I4 S2 y" o# {
// Find Difference Between The Two Values5 i- ^  f8 C4 p9 _. M' H) \+ I
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
* _# M" I7 Z. v# l8 A, `3 Q+ B
. Q: e$ |+ e2 r+ d* W. Z
% T7 K$ M1 x( D" U$ f/ N7 t; ^4 Y# F0 B% @
// Allocate Only The Pure Picture Data
& b. o% R7 H- N9 @) n$ B RealData.LowPart = 0;0 D. E0 y, c( L. L& E# n8 f
RealData.HighPart = 0;
+ n7 _) s: A' a, \5 P0 X0 x2 D, t RealData.QuadPart = ByteSkip;
. R; R' r+ U! i0 K7 ]. e BufferBytes = (BYTE*)malloc(OutStream);9 D* r  k8 q3 Q. x
if(BufferBytes == NULL)
, ~5 B/ ?  A( [& ?, x  @  {9 _8 a" D1 @4 V) ~  t- \7 j
  Buffer->Release();0 S7 K/ S7 m9 X$ [$ ]$ g
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
! t: B1 i# p: V) @& c5 d) [8 t% ^) I  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
% i  R* J0 }9 l" K0 d9 U  }
1 K0 J( M3 b, B2 _' G. _" N, ]- U# x! A
' @1 g, l$ U2 Z8 V  a/ ^! T
, d' q& n: i/ n+ W# o- ?
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);! O- k9 Y  n; W8 ?$ b
* o. C8 I5 r1 l6 g
$ [  _. |; u' R: i

( V. R$ e0 f( J$ m; R if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
/ {) q2 {2 i, Z4 t) R  {
8 [- A5 x& Y# V' J) e; n  BitmapFile.Write(BufferBytes, OutData);
! k4 \+ z% L, G4 c  BitmapFile.Close();
  |, D& e2 L. ~  bResult = TRUE;/ n* M3 A3 f' d! N
  }; \: I' j" @. G) Z6 o4 Q( [  i
else // Write File Failed...
3 T: _7 |/ j8 k! ^+ i. V+ `  {2 _. S( `) L$ D( c! t
  TCHAR szCause[255];
! _9 ]/ i; r5 g1 T* D; M  e.GetErrorMessage(szCause, 255, NULL);, O# |, ?8 S- `# P# ]1 p2 j! j% A. g
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
: P6 E1 l0 E) x# u  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);  f8 s# O/ l# o1 g
  bResult = FALSE;6 ?8 [3 x3 W! e4 @- N( E6 h; Z4 [
  }4 h* b' I  d; T
* V* {+ n* W6 z
Buffer->Release();: ]! ]0 H+ e7 g2 y+ m- m2 T, d* z% B9 d
free(BufferBytes);
$ M( Y, o2 j! `+ w9 k- E! U; U8 T
. r# m  i5 g' Q/ i& n2 o7 y; V

% r6 ?8 q5 R% c$ [0 Z9 Z; k return(bResult);. }- s1 L8 w& {3 e4 s1 I& X' M  K$ A! R
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 08:14 , Processed in 0.017230 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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