找回密码
 注册
查看: 9897|回复: 0

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)$ v8 d$ ^: R! |5 F
//=============================================================================9 \5 x. l/ f- E# r! K0 M
{
$ c  G: ?) `( i/ A8 v  ~ BOOL bResult = FALSE;
) z6 N! L$ K6 H& W2 a ILockBytes *Buffer = 0;
, C. T7 K! l8 k( f IStorage   *pStorage = 0;
5 t! J. L% L- {( | IStream    *FileStream = 0;# n* g2 @0 [) g: H4 M
BYTE    *BufferBytes;' X) p9 P7 }) ?
STATSTG  BytesStatistics;
3 t9 H6 {, \* I9 Y% l, A3 R+ |$ P DWORD  OutData;' u) i2 a2 }" [7 i
long  OutStream;3 i& K" C! }% I$ F+ g  v' m4 O
CFile  BitmapFile; CFileException e;2 d, x& S& `. F8 E2 B8 |2 C
double  SkipFloat = 0;( w. m0 C4 g: c* [
DWORD  ByteSkip = 0;
+ I. A" b: O1 Q! } _ULARGE_INTEGER RealData;& p/ C5 [# v. C. }/ i+ c+ @2 y1 ~

) z& e0 Z' E- g  i- n) l8 q+ ]7 j! r. O- H" b7 o8 x: M" N4 }
* B9 i& r; c& ~: h
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer* Q* L$ ~; m  [$ U; O

# G1 V) i% ?( K- v& B
! {  X; D$ d8 t% p7 m3 U5 O) q% X0 j, H9 _) J* T
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
% y9 [# o1 i+ ~, I7 v6 L9 |2 c! q- O     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
! A5 z) [7 n2 e0 g1 ?  {( T4 h) [: U+ {' `" f% I& t2 _0 W
8 G# I, y+ j" M4 @  _' w
4 H+ v+ U2 e/ ?' |1 d! Y9 B6 ~# `
hr = pStorage->CreateStream(LPICTURE," o# ~$ G5 G3 q, N+ W0 N3 A
  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
/ r' u; b& e' ^# ^: M( |
. R* s: u; n" y0 Y, ~* I: U4 s6 P" [$ F7 J/ j+ k8 d
/ C* |7 b5 s' r% p
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream$ R0 N' |, Q+ F% {7 k7 b- ~: {
FileStream->Release();4 W* T: w2 e+ [" ~  R) u
pStorage->Release();( [: s' G4 X1 a& O, y
Buffer->Flush(); , V4 R8 Y% y  i0 \; t# R  g
0 F' h& N" G8 [

, m4 \+ q& ~  c% y, R) x9 R
' o3 S5 U& [* U9 |! P+ @! i( `' s // Get Statistics For Final Size Of Byte Array
+ Y  v8 u9 W5 J) y( X Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
6 w/ y" G* V) J4 J" E+ ^, {4 A
* E% B: j0 H% l1 c) e7 B
7 A1 C! F! `* M1 a! [* D
) k' n, F1 r$ h; z& H* l+ F, t$ v // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)+ M# b% {; ?4 |0 i2 ^# i5 T
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
7 w$ {7 R+ Z7 t. ~3 D1 r+ n/ M if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;" L6 ?& j  o% E, {) Q0 y
else ByteSkip = (DWORD)SkipFloat;/ w/ x; _# w  p  q
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
- n% e/ B9 _' C! g7 i: @$ U/ Z : g0 m  v7 X3 Q  I( G& I. g
// Find Difference Between The Two Values6 p6 @9 J6 W6 H+ z( u; Q
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
1 ^- J! P, C: G. w/ |0 z. r/ F, Y* z# ]3 _+ }8 w) @7 c

9 Y. {2 s% m5 I4 K, W9 ?* A  A' W  q7 k8 }" y3 ~% c
// Allocate Only The Pure Picture Data
  V0 S& _% ~- K* X& d) V7 d# | RealData.LowPart = 0;' M8 ~0 ^: X# w2 x
RealData.HighPart = 0;
! u' O8 d% Z2 r, @: G: u9 d( J5 \% R! ~ RealData.QuadPart = ByteSkip;3 @$ K# T7 `( y
BufferBytes = (BYTE*)malloc(OutStream);$ ^) q/ P. h7 P0 b
if(BufferBytes == NULL)
6 ~" b0 V& R0 O% X+ {  {
! @; d% O: ~* z% d$ C- P$ q1 ~  Buffer->Release();% ^- w8 K0 v; O5 A% o2 [
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;' W% b- s1 `4 f& Q: |
  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
6 z2 K. _, B$ I: [' W* @/ f  }
7 B0 w! |, j  K6 W' t5 H9 K+ p
2 G' T7 u/ a& u; n  }2 X4 W1 v# j5 z
' {. v8 `, O2 i
8 t' |4 V% j* g3 F4 J& y Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
0 q; S8 }5 @/ S0 r: R6 g  ^( `0 {' k1 ]: @( e' q3 j/ k

$ D3 m) c6 j1 e9 ?7 z- c( t: v
7 J% u8 [2 j5 K# x if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
5 S4 C% `- z; x  l/ g4 v  {( D- c" K4 @) P
  BitmapFile.Write(BufferBytes, OutData);/ [8 Y) f" T* c" b5 {4 ~
  BitmapFile.Close();
$ H; e# e; _' X2 q7 {# i  bResult = TRUE;
4 i# l/ ?% P2 |6 g% \! x  }/ [+ j! T# W- j( a! u8 {0 J
else // Write File Failed...
+ P3 [  w5 E1 ]& t1 a; v- V; ~  {9 x/ c5 c, F) h1 L& [
  TCHAR szCause[255];
6 }- A& ]# q, w  e.GetErrorMessage(szCause, 255, NULL);
, B, `" r  W' x0 n- d/ i5 ~  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
; _. X4 n9 ^. L5 v+ B2 h# P# W  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);- s& R' @: U2 n9 O
  bResult = FALSE;( E" E% Z  H9 W6 i
  }' M' H: s" w7 f4 J: p; T

2 `6 _4 c% B" E! i2 w7 w  ? Buffer->Release();$ q! Y- O. o" s( ?! {* O; A) D
free(BufferBytes);
0 ^$ m: Y1 l5 q$ X, b$ Z
! ~2 s1 {& i2 R1 i* N) E. ~# H  I( Q- Z4 ?% u

0 W0 t- C8 t, x& y return(bResult);
' r5 n- x- x$ j}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 02:25 , Processed in 0.018401 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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