|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)
0 m5 W# S! r& S6 F6 X7 j7 c//=============================================================================. j! ]) D: x# c. p& t
{
5 I" C' x! R9 Y b' W BOOL bResult = FALSE;
+ ~4 p% B8 h q) t, e) j5 j* e* ^ ILockBytes *Buffer = 0;
5 o; m+ k) _" y! `8 ?- s5 t2 f IStorage *pStorage = 0;5 F I, F+ v9 o E4 y6 ` S
IStream *FileStream = 0;' L. V* E: P, S1 A5 J( h
BYTE *BufferBytes;1 U6 [7 O1 ]8 v
STATSTG BytesStatistics;
) h- M0 ? X4 Z DWORD OutData;7 S3 m' ~& ?' u% B" \+ ^2 B2 s
long OutStream;
/ M' R# d2 f0 D CFile BitmapFile; CFileException e;3 z5 p r, Q7 @6 h4 a
double SkipFloat = 0;) n9 N% e2 Y1 l4 M- ]
DWORD ByteSkip = 0;6 ?( }9 ^6 x2 w Q9 x
_ULARGE_INTEGER RealData;- ^ v! X+ M/ ?1 O9 w2 i' x
! s$ @: q5 F- G8 ~6 f* W: u9 C& ?3 o& j& @
! C5 t' h" h4 ]6 o" E CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer' C. u" k9 E; B
' ^! @& ^, B" V- r
& ?/ ?$ e8 E* O" O6 V+ h! |) H5 t. e, |; G
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,3 Z A% s" J7 \- c0 i# K
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);! c3 X4 G: x+ _1 L
; f; v; ~7 ?$ A
4 T& O) ? G9 s+ d- {
/ L& Z; Z0 ]+ \ hr = pStorage->CreateStream(LPICTURE,
3 }. E$ w( ]; } STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
% L9 W' u |3 {3 d+ c0 H) w0 f( P' D) ], g* a$ N
2 W+ |$ I0 |3 t9 l
3 E# o% _& U# G! N# k# K
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream4 S$ a3 f- `0 o1 a1 Y7 ]$ o a) k
FileStream->Release();
4 h# S+ m( l4 v! H# K C8 m pStorage->Release();4 a( s9 S o& u$ P
Buffer->Flush();
U( c- K3 j* m! g! ?; J0 i
+ q3 p3 s1 ^ ]: D, \5 E
+ Z% E4 R6 v2 H& T9 `; m' y# B
! Y- \% {2 q5 P+ P4 Y // Get Statistics For Final Size Of Byte Array7 E+ D/ E1 ~7 B. ^+ i% g4 L
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME); s7 p% t7 X g
( K/ R% R1 l2 s5 g8 _. Y \1 t. [# K$ j7 m2 O1 n/ F( E% O
, u% ?8 O5 A7 T. [! V
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
' J1 @2 `2 I' W5 M6 j+ k( p: Y SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
0 N x7 m9 U: q4 _ if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;2 r9 b6 U6 k7 s5 A( k
else ByteSkip = (DWORD)SkipFloat;# y2 \1 P6 }+ C
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks..., j4 o$ [& ]7 K
/ O! `" ^" W8 k6 c' z# m( Z/ x // Find Difference Between The Two Values: d- k$ h, X; ]2 z8 _" ?
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
$ v) u: m/ X( A$ g2 x
! x/ q) w) t6 T1 X# c% l+ R& N) @% d0 M% S R' I1 p& V2 j
+ J! r9 Y, g9 K4 u
// Allocate Only The Pure Picture Data
9 S8 a. X7 a" X/ k7 K- k w# E RealData.LowPart = 0;# R$ g; |' V2 G- E2 D% m
RealData.HighPart = 0;' _" l8 x( {' G, [
RealData.QuadPart = ByteSkip;
- |2 x! s0 v+ e t2 }6 ] BufferBytes = (BYTE*)malloc(OutStream);$ E: D4 i4 C0 x- @/ Q% t9 W& R
if(BufferBytes == NULL)
|/ b9 y; Q' u4 _ {# M/ n% d: L. T; f- e1 y
Buffer->Release();; X' ~8 X9 s' O' `6 B6 y
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;. M& |/ x4 |# d+ R$ ~7 d0 D R
MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
) y" [, E1 C: N7 b$ A0 p }
& q/ Z1 U5 F1 x7 i+ _' U/ h6 N6 K* p7 u( A' \5 Y# |
6 J. l3 n( G% w- x9 m1 }) q6 u/ I
. n& q' L1 k A* M* m/ Z& [4 d! [
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
: e; X: t0 T1 Y, D* l- ^7 \9 P" |$ X
2 s9 a1 F6 x4 e0 T! u/ U' Z) E
8 V2 ^( F5 V" m* O0 i1 A0 s if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
5 R) s, G+ u: U x _; H1 y C {
$ `5 x1 N) V j+ q BitmapFile.Write(BufferBytes, OutData);
* q$ Q. A; t! y/ Z, w, S: u4 S BitmapFile.Close();7 }* O( u0 U8 t
bResult = TRUE;5 v+ O1 Z( ]+ e* h a$ K
}
/ I# m6 x' W9 l3 {7 ?3 X else // Write File Failed...
# m: z* v9 n/ K4 A0 {. o {
% L7 }! I* a( b TCHAR szCause[255];
$ l' h! r( m0 Y e.GetErrorMessage(szCause, 255, NULL);
8 a" g2 U9 ^( N HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
6 X2 i5 Z( T# U7 J& V) @: G8 b MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
* ?1 t6 T0 y# M2 P. ^9 o( } bResult = FALSE;
$ n' l; _0 E% m+ g( |# ] }8 N' z+ G& F0 X
) k+ J4 F) P0 J7 s# K
Buffer->Release();
) E$ i1 |" k" |6 ] free(BufferBytes);
( x5 ]! O) O8 ^% |
1 A% p9 y2 a7 ?2 m4 \ i4 @5 \: s2 K- Z% w7 d
6 }# b5 |* o# G I, e5 W
return(bResult);8 K% ?: Y. ?5 g. c' k- A) u' f
} |
|