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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)
; u% |6 ]0 f! i2 h& J0 v8 {//=============================================================================" `" `7 f' t. h' h8 l- }
{
) O( D1 O; l8 X3 l BOOL bResult = FALSE;8 `' c+ b2 ?6 n0 D; [' b
ILockBytes *Buffer = 0;* Y# R4 l- L; T
IStorage   *pStorage = 0;
" F9 K- c& e( \# N5 L; }8 w# d IStream    *FileStream = 0;
' p: s! s8 p, B BYTE    *BufferBytes;* L; e) H$ x$ n6 S7 k/ b0 I8 E
STATSTG  BytesStatistics;
& R' u! \3 d6 p; _4 M2 F DWORD  OutData;' Y- j  B7 c4 c
long  OutStream;3 p6 P$ T. Y6 z5 K4 b
CFile  BitmapFile; CFileException e;! G5 Q2 U) R1 @
double  SkipFloat = 0;
* D+ k; T8 F3 s; ?) \; t4 S DWORD  ByteSkip = 0;
0 Y, L+ s7 p8 i+ o. o' R/ `" z _ULARGE_INTEGER RealData;) O6 N% I( f& j- n8 J# _7 [9 a) e

1 G8 Z. I% y" l4 h  ]2 q
2 N; e- Q8 x) t( o2 r6 _* o$ S+ r  I7 j
" o7 Q, h7 M! R  \1 W CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
. `! B! @4 P9 I. H( h* F1 z8 Z6 z% @4 ?4 G+ i# j0 {' w

& M5 [& W" d9 h/ ]3 V: r' y
3 h# Q1 Q& k4 f( I9 G5 O, |- L# z HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,& T: z' [% x! Y; |4 `
    STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);& v0 C6 |6 M+ T$ \# R' x. F
  l5 X0 F8 S- p) h" f

7 v# ?. w% f( C! B& p3 N" G4 X2 p
hr = pStorage->CreateStream(LPICTURE,7 |1 E+ j+ u; d4 k
  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);* X( ?3 ~/ u5 m

1 D& x( i9 c: n0 W) `9 d
( E; X; D, B, ?; F' Y1 D4 a: y2 a8 r$ ]% q! y4 w
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream8 y! Q. F- I9 c$ z3 G
FileStream->Release();
. U) X3 {& V# V pStorage->Release();! H. M# a5 e: B! E
Buffer->Flush();
" R) ?4 `+ r( ?! D0 a8 U
  d; r5 w$ ]0 c' C7 {/ v7 K3 L7 D, ]7 D3 N

- r6 N& y4 w, E // Get Statistics For Final Size Of Byte Array
; c# C' g7 X! r: u- C Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);) v- Y2 w4 x1 Z) `- g# y% O* p

. d. ~: R8 a3 ]$ F' E. u6 s- Y' ?1 S6 L1 j$ g% b! q- a

& N5 H7 i+ X9 q) ?, i // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
9 z; K( V7 j/ c4 D2 L5 L& C- [3 R7 N SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...5 L# S$ [; ^5 t1 R
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
1 x- a" n8 k( c& V4 D else ByteSkip = (DWORD)SkipFloat;
' H, R& Z  x" W* f0 W' g( O ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
! R% Y) C- x( f# P( u" ~+ |$ W ! I  n0 q& O% [; w0 D
// Find Difference Between The Two Values5 S' ]( ?0 q& j( }8 [% ?4 I9 N
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
: |5 B+ v) K) X, i: o9 }. t  b' W' U0 J6 T5 w
, U4 W% n1 x( f, O/ k+ s  ~
% v+ Y- d( f6 A4 c* W1 q- M
// Allocate Only The Pure Picture Data$ q9 @  L* b8 ?
RealData.LowPart = 0;: R" Y# |9 \5 ?) r# |, I
RealData.HighPart = 0;
8 s* g6 ^% p$ z: b3 E; n RealData.QuadPart = ByteSkip;" g7 N- o  t3 D$ t' c
BufferBytes = (BYTE*)malloc(OutStream);
8 t0 `/ H+ ^, F# K5 u. { if(BufferBytes == NULL)
  X! v6 l3 D6 \0 v+ u# K' Z  {
+ a: \5 z4 C+ a. \% E( y  Buffer->Release();) z* y. k% P) q6 ^9 T7 B! A: w
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
' ]# L* \5 u' C- |" w- y  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);. t( f: }& O% ~  p; H
  }. y* O0 q6 w' @, Q
9 R$ Z! x# c  _. \

9 J" K" i2 ~! s7 m4 W- n! @
$ p1 g' V6 @! k: t Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);9 a( w) j8 E/ g  u
% K8 ]/ {( G7 q) B- W( y- `" d
" k$ A0 _; N* F/ S1 @& j0 j, T7 p
. Q% }- R2 J) q* H% s2 O  s
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))* w3 F: F" X+ s1 S
  {2 B( `# W% y; ~
  BitmapFile.Write(BufferBytes, OutData);$ j# O6 S5 r9 z3 I! V8 L: z
  BitmapFile.Close();
( Q) T1 s9 ^+ Q' c) h! L  bResult = TRUE;" q& k* p/ F7 E8 I; f
  }6 b! O0 L4 w3 |2 {! X( }: p3 c5 h
else // Write File Failed..., t2 V7 f* U* |2 x
  {  a# w( k: ~8 j1 m/ T5 ]
  TCHAR szCause[255];
7 U8 J; [3 H2 A  e.GetErrorMessage(szCause, 255, NULL);' W' F3 k8 e' |# B% F
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
% @* v5 |* U2 q+ X2 Y/ E  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);% N' i. p' ]. ?4 n
  bResult = FALSE;
( u  i1 A- }% N" _4 K& u  }/ {# K6 S, W2 L" V0 Y1 H, J8 f

4 N) w3 u0 Q" A, {8 a Buffer->Release();
) k5 P4 E, u6 }; V( F2 z0 B; l free(BufferBytes);5 v! z% l$ ?3 c: Z# m# K
& ~0 ~7 P' ]; M

- i0 `* O3 A2 l$ W: A5 a6 r  ?6 k# V1 E: i, B
return(bResult);
5 B1 V  l+ J, H0 Z2 D$ z4 e$ k}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-14 02:18 , Processed in 0.028601 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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