|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)
( G; u, @/ t- a4 x8 ^$ k, k- G//=============================================================================/ w( H) C0 @2 v# K* J2 f0 f+ s
{6 H- q" F. x2 y4 V7 M
BOOL bResult = FALSE;, \3 ?1 n9 [9 G9 z7 x& I3 ?
ILockBytes *Buffer = 0;
1 j! C; r4 l, \+ S IStorage *pStorage = 0;% l# y) U }. T& }& d6 O6 E
IStream *FileStream = 0;; E: ?+ d/ K) j" x4 ~9 j( A
BYTE *BufferBytes;
6 q8 ~# A: Q9 ]% V( k; m STATSTG BytesStatistics; ]) j; ]% o/ F0 b" r: i+ S% z" w
DWORD OutData;* u$ g/ V7 s( `; w
long OutStream;
" D5 `/ L' U s/ L8 o3 t6 b CFile BitmapFile; CFileException e;' S/ B$ k$ _; j$ P! P+ t
double SkipFloat = 0;
( |( h9 V) q1 i% N DWORD ByteSkip = 0;8 l5 z7 c; K1 P0 N$ U* q) E
_ULARGE_INTEGER RealData;0 j% L% p% o5 L0 g, E
3 P! z& @& F& _$ [0 M
* g3 w0 b5 `5 i9 U/ L! L6 z* Q! t; D0 E( S4 M. x
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
5 u9 @" d/ C! }; U; v6 X+ Q% c/ \; W3 [: y, y1 u4 q
" q+ }/ ]5 ?/ R5 ~4 ~
! c1 c2 X( W1 B8 t1 u
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
+ N9 o' Z7 V! {9 J1 Q$ s* R STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
# M$ e) U+ g" x# [9 S
7 _# U, {2 U) _! Z4 g
% s" e! I0 c/ d0 q& M. U9 e
! m& u5 |2 l* |' ^4 \7 F5 `/ H6 U9 R- | hr = pStorage->CreateStream(LPICTURE,
) M( L3 ?! u: I# v7 E% _: v9 H STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);# Z+ v# p% B( Y2 n
# A; V. m0 `2 A0 }) c- ` r1 l$ I; {: S/ d/ h* F
6 \) }' I; n+ ?1 ?
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
! S. @4 f# m, V& W! Q7 C: y" b FileStream->Release();/ e' o% R) F: r& o6 Q% I" d$ z8 V
pStorage->Release();
& @6 o; @' g$ @% T% d M8 p$ l ~ Buffer->Flush();
5 g7 x0 Z- Q$ @; C2 W' W; x" _
3 } L+ _0 N5 w' ~. Y4 j" I: f, I0 g6 T$ B6 J! a) c7 Q
0 B1 I5 I4 A' [+ w // Get Statistics For Final Size Of Byte Array
; R ~( I6 O4 b# J2 y2 b* V" c( r Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);5 G, ^8 }5 J4 W! W2 T1 I! M4 \
: I. N! n0 C( K; r+ H3 j
9 X- [ W& J k8 ]) R
6 x6 H8 O- a1 X* @+ q# u- c* E // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
4 Y/ t" a+ p7 ^% A SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...; {7 V* _7 ?; |# o, j4 k
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
) D# t2 p/ ?* H4 P8 t* j/ A else ByteSkip = (DWORD)SkipFloat;
: X. y" y1 V1 Q- ^' X ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...& J K& p) y7 l- |
$ ]8 I4 ^3 C2 E: |$ G8 Q
// Find Difference Between The Two Values
( v5 b/ H* G! K ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);/ N& e. o" M# E( p7 l' ]: X
' u6 ^* r8 p- I
5 h% ]: H" L% `8 |. |
7 s) a8 @, x/ X& c. F8 E G5 } // Allocate Only The Pure Picture Data% b+ T" r! a3 F
RealData.LowPart = 0;
3 n6 B; n) l6 f, N/ n RealData.HighPart = 0;
4 Z" E' b0 k* N% l `; D+ R RealData.QuadPart = ByteSkip;
0 b, l0 @; I2 ~- X( D BufferBytes = (BYTE*)malloc(OutStream);
9 r' r' M# u" U' I if(BufferBytes == NULL)
; Z# e" m. h$ G2 E {
3 i, b# S) n! x6 S% e Buffer->Release();% u. z- ?! C: `( G1 s
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;' a' k$ i) m+ Y4 h, ?
MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
) ]6 Q! V! S7 y4 W, [* | }
/ q- k7 ^6 C0 A n6 Z) d) l) E/ O. A( R& `# R
6 q, }9 G( I* I5 X' L" }' K8 g
% J# I% o5 g+ x2 ^$ f8 _" w" l% M- q
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);1 k* ^8 d: F" u1 S
$ S; @1 \, b; w# I
& c4 r+ S0 A8 K
5 w! X/ R6 U4 Q! C& r if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))2 d3 \( l1 k W% r7 ]' S7 H7 b
{
q( l5 B4 A$ [* A( q BitmapFile.Write(BufferBytes, OutData);; ~4 @$ _& i- \8 U) a( z/ Y
BitmapFile.Close();
' ?( f0 _+ s0 [: H, f bResult = TRUE;* G' l& O2 V/ [6 n$ [* f
}
, v& h9 |- e4 w4 p1 K else // Write File Failed...+ i( u ~5 k! y3 e: f
{
" ^$ z% H! x* [. N, Y% I7 s TCHAR szCause[255]; M8 F. N% x8 ~0 W
e.GetErrorMessage(szCause, 255, NULL);
' l( I: r% y& f/ x HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
' U9 E5 J4 U+ x6 K; o; N MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);% {! S/ R, z4 s: v- b+ o, e, P
bResult = FALSE;, i3 o' T v7 T# v, T9 y
}
' O4 A- L5 w4 I5 ?( V$ G % g- q$ V1 C7 C3 p
Buffer->Release(); E+ F7 Y7 K( }0 h% B, N9 H5 k$ R
free(BufferBytes);( @, k+ I' u# I- T& k( a
- o5 O& I! T% O! \% F. \4 ]- i2 s
# t$ I: M8 s, T; c E% x
return(bResult);
4 ]* h: t$ O) t3 D& R} |
|