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

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

[复制链接]
发表于 2005-12-21 21:31:42 | 显示全部楼层 |阅读模式
  BOOL CPicture::SaveAsBitmap(CString sFilePathName)+ @: \* S* _: T. c2 E8 D3 _  H4 T
//=============================================================================% `0 E  m* _6 k+ f4 {
{* I1 _9 T& x- H, n
BOOL bResult = FALSE;
$ d* ]  ^. q8 |1 w8 U; T; D ILockBytes *Buffer = 0;: P( C! l! c6 r" j! i; }' x2 ?& i
IStorage   *pStorage = 0;  M' N! T% b' Y* R" q  ^  T
IStream    *FileStream = 0;
4 o1 R0 _$ g( d  x- F2 E% Z: P: U BYTE    *BufferBytes;
, ^# {3 I3 U" |) {. x8 ` STATSTG  BytesStatistics;
1 \8 {6 a6 L8 [9 ? DWORD  OutData;
' u- |+ p- ~' a long  OutStream;5 y( Z4 X, K6 i5 K9 A3 k
CFile  BitmapFile; CFileException e;
% C8 {! v( x- x' l2 } double  SkipFloat = 0;1 J) d& h8 g' c1 W/ d7 X* Y3 Q! ]' |. y
DWORD  ByteSkip = 0;: D, B% T* ]7 c" m2 F7 N! `6 F7 o
_ULARGE_INTEGER RealData;' ~# H" c2 z' s6 ^2 a

$ L4 [) P- |0 b5 ^' c  ?. S) W+ u+ c! p8 Y$ N8 u; r

' U; a' y7 K) y# A CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer$ \7 N9 R; f! p4 T

0 {4 Z9 u6 f9 {# m6 m! c, c
- {& i4 L: `( p
9 f, v5 m' ?9 X; @" q* n  t HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
, |) [' q: u5 n/ e. `5 \! f     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);1 Y" _4 C) E1 M3 m( N. C/ `& f8 h

2 C1 W9 O1 N" @( ]4 J4 A, @3 G
$ J( ~  {) S7 H
5 w* }4 k' A1 L7 B$ p hr = pStorage->CreateStream(LPICTURE,
' b4 ?" F: Y/ }5 E- o   STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);: ]9 S. X; _8 |

9 m# p! n- y- j/ c# _* x. G- j! {8 W+ W0 M
3 S, f: i8 A3 N8 }$ ^4 Z
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
, |2 v! M5 D# ]  o  i FileStream->Release();
! R' ~; _) [* _6 U pStorage->Release();
5 L  {9 F- N4 Y+ N Buffer->Flush();
. V; g$ Z( f3 `: S& ^0 u/ L* N
; F; D. C0 R# B* R3 U7 z
! ?0 P3 W$ i4 s( M5 G( R) f3 y
7 j1 K9 h2 j+ U% Y: [ // Get Statistics For Final Size Of Byte Array
  y2 e2 T4 i7 Y8 ~ Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);: C8 ?! V' Y$ I& z, P8 g) d. p
! D* g2 y: \5 O: p

3 ^0 g% f$ X9 S) ~' S  z; s
8 q9 ?7 ^% [8 [ // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
/ c' d- ~. V( j3 {8 R SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
- x7 q9 e1 s/ o; u if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
( ]* l. B. |8 t  N9 r else ByteSkip = (DWORD)SkipFloat;6 b! Z8 c; R* g9 ~+ A" C
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
! q% _8 O3 s2 O/ n ( B3 X1 V: ~5 `, _* h9 w  [$ P
// Find Difference Between The Two Values2 T5 s& x# `: f* k- R! `
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
! u, u* ~+ |! b/ h$ j" N, ]
. ^2 j+ g7 u" V9 M! T7 p( H. ^; R( l$ W/ I

) f! }  Z* B" i) f2 k5 U- W // Allocate Only The Pure Picture Data
5 G; a. }1 m! M1 w RealData.LowPart = 0;
9 M* m! U; L5 i; R' {$ ^4 g RealData.HighPart = 0;
; }* e! t+ ~2 e: Z: k RealData.QuadPart = ByteSkip;
- \% I! H+ J' e0 g7 i BufferBytes = (BYTE*)malloc(OutStream);! ?3 F/ d9 f! S
if(BufferBytes == NULL), \  R4 i$ V; }6 N
  {
) ^- q- X; d8 o: x( f9 N% s  Buffer->Release();! |/ h8 g& @6 n4 k# C; B
  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;5 Q6 F: v+ D) P/ f6 q8 x5 z
  MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
+ ]9 g* p6 X3 ?% x" I. W1 W  }  y2 R5 T7 Y7 Q+ N

3 k0 D) D& H- Z5 ~
8 }9 z! u- ]4 a5 E, {( Z: {
% S, p5 m7 y, Y Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
% A; g9 D# q2 _% z% G# ^3 {- l+ s7 U+ q  N. }. X
- |9 [. n9 t5 n1 @2 f5 n5 ^2 f6 M
1 I; [- R7 q+ `8 |2 _( ^  j7 B, [/ q) T
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
4 p. u. q5 l- h0 [. i" y  {
2 k  {* v& Z* l# S  BitmapFile.Write(BufferBytes, OutData);7 t& `' B" e% q8 _
  BitmapFile.Close();5 a6 J2 h& |, T# r' x
  bResult = TRUE;
! K* o. k3 B$ v8 T  }4 X5 ^) t4 `/ i& ^2 t- U' W
else // Write File Failed...
$ z" O3 R) h' Q( \$ J  {5 @$ v! _( h* X/ W
  TCHAR szCause[255];
3 r- [9 i# I* {, H7 M$ o  e.GetErrorMessage(szCause, 255, NULL);
- x: X- j! E' |: V4 t! H  HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;# x3 ?0 u' T9 |5 c) l
  MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
' f0 x4 y) q. d8 ]3 _  bResult = FALSE;
  Q! K* v% V. w( r( d: D  }
. g. \& s1 H1 ?- D4 J/ S
$ {6 Z  _( T8 y Buffer->Release();  F6 q  U$ j9 D) A
free(BufferBytes);
6 t1 ]% X+ Z, W! {# f: g& S' u! R& \. o  t

" g* x$ Q) {( Y8 C/ z% F5 P: v7 A9 d: y
return(bResult);
" z9 R1 O5 }$ {' g}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-5 09:22 , Processed in 0.014454 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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