|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)
" X- N. |7 E) n+ |//=============================================================================
8 [' O0 |9 N6 I1 K' Z. u# l' N{
2 G: S! D% D! X% q3 f" w: [# }9 r1 C BOOL bResult = FALSE;1 {" p) w, g. o8 x/ n& K
ILockBytes *Buffer = 0;
4 b2 H/ s& a" t( l5 W% E" X4 J4 ? IStorage *pStorage = 0;5 E& e" x# O2 A! A1 K& I& T
IStream *FileStream = 0;/ |% ?" o b5 s7 d
BYTE *BufferBytes;8 {" }% V3 C7 E: O9 @+ C* Q
STATSTG BytesStatistics;
2 ~1 z& m3 u% h" h+ M7 u, g; E DWORD OutData;
, ?# _9 F6 h" C5 Q+ A3 A( F long OutStream;
' Q2 I" d& s3 r7 d CFile BitmapFile; CFileException e;+ r) |2 O# O, r. C3 n, a, x
double SkipFloat = 0;
5 J# G; a; M. R+ Q9 W6 q DWORD ByteSkip = 0;1 [5 c# ~ w& c* E6 {1 a3 m
_ULARGE_INTEGER RealData;
( @3 ^! `( F6 E9 _4 f- E; `1 C
/ g- ~3 U$ j2 G# t
7 B( E! D% K" O6 j' C$ }5 @# J
8 O+ V; M: h! } CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
9 H2 n. H; ]! Z v; ]2 T+ a" `) M
, s6 @5 k/ B5 X3 F) S; p0 Q# O# L1 W5 i) f. Z5 P( k0 E' e
1 r% L D/ n4 V; \9 B# j8 N HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
) U. `' L' g6 c( O9 o STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
, F+ S/ B ~* X. p3 Y3 q; |( Z( v f, A. a- R# d) m
/ k- K! ~8 t7 A1 s
3 x9 v8 K3 |0 a
hr = pStorage->CreateStream(LPICTURE,
/ }- B o, ^+ F0 H7 ` STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
3 P7 k( ^. ^, a. C1 ^' @, p/ f( I8 L+ r( b: r" ^
* t: i8 U: u G" j2 e, Y* K
: ~4 h& p6 ]5 M5 }* l) r m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
; p; z( o# v: V8 }3 s FileStream->Release();
! f" w& Z# \- H! j0 _3 ? pStorage->Release();
/ L$ ]. x6 B" p5 a Buffer->Flush(); ; [6 q$ Z% g! N+ f
8 t9 Q/ I% F- g( }. K
# ^+ v4 j' ~$ U: `. X
: T; }& ]$ s+ g1 ~2 A3 ` // Get Statistics For Final Size Of Byte Array# v: y- c4 V! E {. y( d0 U
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
* |& m1 ~/ L, I' r' e! H& U, ^/ L1 x! K( A
! j n2 C- g5 M0 [6 e# I& Z
0 I6 x) B2 X7 L B9 G
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)) w o& h# V% [4 g
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...) J, b. d9 u- o( h' E6 r
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;3 g/ D. s/ V$ y2 u$ _
else ByteSkip = (DWORD)SkipFloat;
' f& N1 h1 G& x7 {0 c2 e ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
/ w p2 v7 u8 z( f) A, S # ^3 `; E) k5 A& k: E
// Find Difference Between The Two Values, j3 ~+ c, Q9 a$ M- Y- d
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
' ^$ |7 S) g+ u; s/ z6 i8 U
$ j% u; y, ]- g! L
3 Z5 M9 [ ?" }1 X8 { n' Y
' Q* ?: B& [% B. x* {" { // Allocate Only The Pure Picture Data$ o1 B# A3 b, f! L. ], n2 i
RealData.LowPart = 0;, w9 r- N2 W4 \4 R* W
RealData.HighPart = 0;% s' {& V2 z4 \( U3 x0 g% n% X
RealData.QuadPart = ByteSkip;
9 _( Y ~: o$ z- O/ i BufferBytes = (BYTE*)malloc(OutStream);: h6 v8 c1 w% c' ?2 ?6 b
if(BufferBytes == NULL)5 n9 k5 D" T2 ^4 |+ }$ K
{3 f' O! E7 G4 m" _: Z4 |, T5 i
Buffer->Release();
( t+ P/ S0 t7 q$ F HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd; T$ l6 {! l: u4 }% r$ C! }
MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
* Q7 t% w' N# t# j2 } }
0 C& B- O" f& _- a% p9 ?
* A$ l+ B6 l" l6 Q$ A, p9 ~5 y* a; @9 [
) v6 ?( |5 \; w" c" @ Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
9 ?5 L/ F& o" k0 R. n3 @9 o( |0 X8 e# P2 |' j1 M+ v9 k2 F
1 d ?0 W `- \2 L( J9 {
4 ?) _ l8 M8 e V
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
; Z* s# z1 r! F* z$ {9 g: y& b {7 R$ L; {" }2 b( @* _; _
BitmapFile.Write(BufferBytes, OutData);
# @5 v* o- K7 O6 K# @ BitmapFile.Close();
- g% U/ K! J% ^% k3 h! f bResult = TRUE;* u- [3 O+ M3 T+ \) K- T4 `
}. K& M$ K8 \- _+ p
else // Write File Failed...& z0 v9 w3 o( ]1 o
{. P+ ]: Z- _3 u
TCHAR szCause[255];& [% K/ U' k5 Q( p# {+ T
e.GetErrorMessage(szCause, 255, NULL);
9 A$ c) g( j. ^. F HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;: q. X# V- R+ A4 l
MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
1 h+ f x4 u! o% y, s; f+ e bResult = FALSE;
: \6 n. n/ N5 J! _ }
! f5 e L& D: N' Z 5 l) _1 g+ V% B' B3 q$ d# N
Buffer->Release();
0 I* I9 n( x# p: O* P free(BufferBytes);
# {- p( J( c! O+ a: u& ^. w, M! D+ E; V# }$ @7 _
8 B4 F, Z3 w7 ^, k% x( D
* B: J5 ?0 z0 i; F, Z5 r return(bResult);. B! X* g1 b/ y; j
} |
|