|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)+ U3 |8 T- J8 E! t: Q! k& F
//=============================================================================
% p5 q- s/ T- j{
6 ?/ c6 {+ w6 }( _4 }) E BOOL bResult = FALSE;
. @5 J: o5 s2 Y* b! u ILockBytes *Buffer = 0;3 |* m' I' U# Q0 L' }
IStorage *pStorage = 0;5 D2 o+ s- U& U
IStream *FileStream = 0;$ p! f; Y2 e; }3 T$ L3 x9 i
BYTE *BufferBytes;6 E8 x: K1 c# a. z: C$ r9 @
STATSTG BytesStatistics;. o- W, s& Q* m$ B( u7 _
DWORD OutData;' U& p' I {, m q
long OutStream;; f; {+ j0 d) \6 b: k5 r! Y
CFile BitmapFile; CFileException e;: X1 L5 l- Q% P* p# t: u
double SkipFloat = 0;
; s# p4 o' I; a- I& p/ l7 @ DWORD ByteSkip = 0;' ^+ N: }- V$ m- q. {/ I( U
_ULARGE_INTEGER RealData;
0 F7 _9 E& C9 e6 j. T; J0 c8 q% ?* u2 L
. a1 ], B! Z8 f4 |
4 C& f1 e! ]9 x
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
* k3 Z# E# A j. o. x& }: f; m
+ t+ W& b, f8 ^, \. g; _% p- v: `; m
8 ^9 E( z8 D& m0 K, \1 N; x c8 J HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,7 {, A, q$ Y" @/ h9 n+ F
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);" z" L" F% J5 j9 M
M8 x; V" O1 R, }# ]7 Q- j4 G6 s8 U: ?
% o7 t1 t3 t+ t
hr = pStorage->CreateStream(LPICTURE," X( a e* |7 s1 v3 T
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
. I; k4 u5 Q& l" D9 r6 g( Z9 Z6 I) u! Z8 n9 n' V
( K4 A% L4 p3 E4 k# m9 L1 `2 V. o5 n4 H
3 U- G8 G6 A' T' P0 a m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
, z$ K2 Q( F4 j V! k6 R; A3 D# A FileStream->Release();5 _6 o5 y; j. Y% R' [
pStorage->Release();" ]4 m( S- o* k4 p& d9 P3 x
Buffer->Flush();
$ [; m `& q% X2 l6 j0 p
! X. {4 u% M2 d, O) E) l1 J9 ] a5 O, |' u- n) y6 Q2 |) Z
$ C) d) S; j! T$ v2 O+ c
// Get Statistics For Final Size Of Byte Array2 @& k+ J9 I {4 h- }
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME); d7 ~1 ^0 X. b' c/ K
- d R! o# c F/ u9 r$ O& m& p) O& A
. M9 p+ T& w% `& v. I+ L$ h3 Y; q: d; \; S5 S |1 d
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
7 ^7 e+ y0 c, j# D9 M- g2 ?" W, \3 z SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks.... P0 _8 ?+ h2 M' F- @9 D
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;1 C; ^3 u) A) ]% _' L5 b# X; p0 o1 ~; |
else ByteSkip = (DWORD)SkipFloat;
# l# ?1 Y3 _" l, Y6 b4 v: C. A ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...3 v' |. T5 r7 @4 ]$ H0 y4 J' ^
* h1 r3 ^9 h% Y+ N6 N+ |
// Find Difference Between The Two Values
! J' w* A& U( u0 _ ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
9 w9 R* S; _$ g& J p
- d7 `/ \: B! l/ g2 x% \- }
# `. @% o' F8 @
% s- J. w1 Q- i/ V- U4 H // Allocate Only The Pure Picture Data8 W6 r! \; O' j7 I
RealData.LowPart = 0;
# }# c' o: ^& {6 q) I RealData.HighPart = 0;0 |: M1 @ e& z1 y" @+ w! p" ~5 ]
RealData.QuadPart = ByteSkip;: X& w# K$ x$ W% ~) e
BufferBytes = (BYTE*)malloc(OutStream);
" p0 N3 S" k% J4 g9 N. d, q if(BufferBytes == NULL); W! s$ a$ p, V: N7 w9 L3 B
{
- v h+ A+ J4 N' T, _: y Buffer->Release();, ^& H& u1 k% x
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;* P9 u; }% b) O
MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
" y/ U) Z7 I, t3 ^- i6 m+ h5 V }( `" a$ a8 s7 W% ]. f( z* {
7 ~! e7 x6 p0 q
" ?+ a2 Q' X; e" i8 ~
" _* o# ]$ l1 ] Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);" U/ v3 w3 e1 x x) P
( L2 o0 a1 V( |+ o4 `6 D
' @1 g0 O' I G& @* ]) d- s1 J# M L7 _2 P( n
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
: D; F& z; l$ M4 r {
) |' x3 W4 ~3 J; @' B8 N BitmapFile.Write(BufferBytes, OutData);
) k% d8 W. ?' e6 F; o% L BitmapFile.Close();# Z1 _7 b* h9 X+ Z& ~
bResult = TRUE;
6 J" N' k# o; P' M } }
- ^* {, |& g' G# \ else // Write File Failed...
1 b0 _- x+ s# X+ [$ z7 Z: U {' {2 @9 T+ N3 M
TCHAR szCause[255];1 _! x. d* n- J6 ~- X
e.GetErrorMessage(szCause, 255, NULL);
1 i+ Z3 p( l$ [) [# b0 M HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;4 s! M: X5 |& x) K* E2 u7 Q
MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
' T. T& M! n' z; Q& S# w; h bResult = FALSE;
5 g2 c) a P5 ]0 p/ m: r3 o }
, M5 W+ |" i: X7 ]
: P1 z/ {6 V% z/ Y8 T3 _, c7 j$ r Buffer->Release();
* C* x- k6 d/ N! X. l8 ? free(BufferBytes);
# i+ c. s5 B7 a0 j- o7 F. j f
! e5 Q- V! I8 s: @- ~2 U; ~* A, h5 N Y. o0 _/ ?2 u$ s4 q8 ^& ]
Z& i1 n' s: [7 m- f& D. j# J. O
return(bResult);
3 _* u$ F2 J) o: o8 _3 @# }2 T7 v} |
|