|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)' C! O5 x9 J" N, ~6 g& n, C
//=============================================================================# x+ f$ U! Z g! O9 k q" q
{
! c7 E7 y9 q& N' j+ p2 k* K BOOL bResult = FALSE;
) z& V' z9 d. a& y) } ILockBytes *Buffer = 0;
" @6 D. c. X6 @9 d1 b IStorage *pStorage = 0;
: |! q1 j5 t" m; c! l+ w- q IStream *FileStream = 0;; Y5 n7 v' s/ E" _$ m( f
BYTE *BufferBytes;0 q, u1 i7 R% Z2 P& u9 Q
STATSTG BytesStatistics;
) W& L- G9 z3 v5 ] n' `2 [ DWORD OutData;
. z7 X$ c* r1 x1 G5 _7 v) y( N long OutStream;9 `4 e+ ^2 |5 t/ Y5 J. S5 [8 c
CFile BitmapFile; CFileException e;6 ?8 t. t# d( R" E" A/ H
double SkipFloat = 0;
$ g: K6 @8 }0 Y8 h4 `% j DWORD ByteSkip = 0;- u4 I5 D8 |3 y
_ULARGE_INTEGER RealData;& R; I6 d9 E/ y* g$ t
" f- E! ]1 F& o, y) v# Y
4 O3 m* N5 d+ r" q! d! m0 x; Y% X1 @% W2 z- J; @, z
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
+ l$ a; f' @4 v y
/ i9 J; R# b0 `* o6 @6 Y$ U m& n3 _; F; [$ B, U) W
9 W' x( c+ j$ K5 p* n& E7 B
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,/ `5 U5 I- L% E) Z k$ |- R
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
/ z( V) R) z. A# e2 P; `6 @# I, t; w( D. |4 @3 O/ T# V
5 g4 Z+ d5 i! _8 F* z- Q9 Q* h3 x. N" o" \+ U
hr = pStorage->CreateStream(LPICTURE,' F4 L+ K. ] N) x4 |6 O/ h" Z' c8 A
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);' L: |5 r+ ]* y
" P& z1 `5 K% m' R7 r
, S2 A* t+ Q9 J+ w; b7 L. o1 L O! z( `0 T* y
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
) F' Q$ \) y$ a0 ~- A FileStream->Release();+ M a2 z6 P2 s1 C7 _
pStorage->Release();- m# G1 J8 k: D# e+ j
Buffer->Flush();
" B7 g4 f$ k/ q3 X2 H4 O
) r& @. @. N! u2 m" @1 u( b3 o+ S8 Y8 b5 s! j2 c4 V
5 F5 K, @# G" ?/ W# y8 E
// Get Statistics For Final Size Of Byte Array& R, g# G2 ^) R- x) z
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
. {+ A" X5 g- w" u+ ?- ~' f1 @9 ?6 e2 ~- q9 `+ {) b. i. B
+ E( M+ N6 U8 a" e
) L, @ C( B) |, a' S
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)- P0 D7 h' w! Z% G0 D/ }; |0 w
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...2 y: L' y* Q; E+ z C7 m* b
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
7 L3 _. l7 A) H0 a" `: j' D9 U0 Y else ByteSkip = (DWORD)SkipFloat;
; n; o, Y) @. p" }5 H ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...7 F7 t0 x G, g5 e, j! P! M
6 U: ~- F! J1 O" J. q% ~$ x1 S
// Find Difference Between The Two Values
& j4 D P) ?8 U: v# r ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);. [7 z9 W9 f4 m2 ^7 r6 ^
9 h5 c+ H: g# ~0 ~! g0 }" }- {9 w5 T }- f
' f6 I0 `. L/ x' f9 L! S( M' t" R // Allocate Only The Pure Picture Data
5 H- ?! h' P8 x RealData.LowPart = 0;
+ I6 r: E1 x4 t3 L. x8 Z5 `/ j RealData.HighPart = 0;
( d& r% l* o7 V# v, { RealData.QuadPart = ByteSkip;
9 E9 y5 O! ~+ A# f0 F3 V- z# c/ b6 f' i BufferBytes = (BYTE*)malloc(OutStream);
" D& x& J5 ]& ~' L5 J if(BufferBytes == NULL)
- H$ F/ Y8 ?: s0 P5 z {
& T5 }! |9 Q8 z% ^: Q4 O Buffer->Release();
6 ^+ b$ W4 t9 `# @ HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
: E0 ?( W* S! u0 A! g6 r MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);# W- M( u8 _1 m6 u5 w7 L
}7 i3 `3 o1 P8 X
N) L- r( ~- m( S: `1 ~+ y
! w$ Z. |- X- O8 s- j# a9 s5 H/ w' p/ {3 P7 r3 w/ a
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
o. j C9 M$ O! J
$ J5 l9 L; h _9 q3 B( K; C' i" P
, s# `" _$ d* K2 N& q. [( G! B
& O( o! `9 P" R! y+ f5 m if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
4 c! U: [. r& n0 Q d" h3 y {4 L& n/ Z7 A, E! l
BitmapFile.Write(BufferBytes, OutData);
* k2 g( M$ R/ v+ Q6 M$ ^- q BitmapFile.Close();
. d9 M5 I' v/ S2 x+ B% q3 o5 Q bResult = TRUE;
2 N/ y* ^7 E6 s1 V5 O( g! F }
# k) j; B2 N* i+ t# L( e5 ` else // Write File Failed...* f8 k5 q ~$ m! [: {6 c
{
2 T& T6 o" F3 T* B+ T$ T! \1 e TCHAR szCause[255];& z' `3 t! o2 x* q6 Z+ j
e.GetErrorMessage(szCause, 255, NULL);
+ k r; B# N) L+ P1 ?0 c& L z HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;2 Y+ |1 b2 m$ l+ f" f4 h, u/ r# K8 T; E+ m3 G
MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);2 p. n& W& g7 N
bResult = FALSE;& `4 s3 Z8 M3 E5 [2 C8 D7 _% d: ^4 k
}
6 O% T n7 A& t% U. j
5 F& k4 |* Y' _. L9 I' q' d Buffer->Release();# k) n" ~6 E8 j
free(BufferBytes);. a6 s6 a/ C& ~+ o3 F% f- Z, P
/ l9 n, X4 ~ v1 `" ?+ }/ o! u4 W+ t3 x; f2 K) g$ S, \$ v
9 I4 M% `. P$ O, ` D return(bResult);- U9 A9 q. s+ [' ?& g
} |
|