00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "StdAfx.h"
00011 #include "CamImage.h"
00012
00013 #include <cstdlib>
00014 #include <cstring>
00015 #include <cmath>
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 extern "C" TCameraAbstract* CreateCamera(const char * filename)
00029 {
00030 return TCameraImage::CreateCamera(filename);
00031 }
00032
00033
00034
00035
00036
00037
00038
00039 TCameraImage* TCameraImage::CreateCamera(const char * filename)
00040 {
00041
00042 TCameraImage * cam = new TCameraImage;
00043
00044
00045 if ( cam->Initialize( filename ) )
00046 {
00047
00048 return cam;
00049 }
00050 else
00051 {
00052
00053 delete cam;
00054 return NULL;
00055 }
00056 }
00057
00058
00059
00060
00061
00062 TCameraImage::TCameraImage(void)
00063 {
00064 m_data = NULL;
00065 }
00066
00067
00068
00069 TCameraImage::~TCameraImage(void)
00070 {
00071 delete [] m_data;
00072 m_data = NULL;
00073 }
00074
00075
00076
00077
00078
00079 bool TCameraImage::Initialize( const char * filename)
00080 {
00081
00082 GdiplusStartupInput gdiplusStartupInput;
00083 ULONG_PTR gdiplusToken;
00084 GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
00085
00086
00087 size_t len = strlen( filename );
00088 size_t bytes = mbstowcs( NULL, filename, strlen( filename ) ) + 1;
00089 wchar_t * str_dst = new wchar_t[bytes];
00090 mbstowcs( str_dst, filename, strlen( filename ) + 1 );
00091
00092
00093 Bitmap * bmp = Bitmap::FromFile( str_dst );
00094
00095 delete [] str_dst;
00096
00097 if ( ! bmp )
00098 {
00099
00100
00101 GdiplusShutdown(gdiplusToken);
00102
00103 return false;
00104 }
00105
00106
00107 int width = (int)bmp->GetWidth();
00108 int height = (int)bmp->GetHeight();
00109
00110
00111 Bitmap * bmpTemp = new Bitmap( width, height, PixelFormat24bppRGB );
00112 if ( ! bmpTemp )
00113 {
00114 delete bmp;
00115
00116 GdiplusShutdown(gdiplusToken);
00117
00118 return false;
00119 }
00120
00121
00122 Graphics * graph = Graphics::FromImage( bmpTemp );
00123 if ( ! graph )
00124 {
00125 delete bmp;
00126 delete bmpTemp;
00127
00128 GdiplusShutdown(gdiplusToken);
00129
00130 return false;
00131 }
00132
00133 graph->DrawImage( bmp, 0, 0 );
00134
00135 delete graph;
00136 delete bmp;
00137
00138
00139 Rect rect( 0, 0, width, height );
00140 BitmapData data;
00141 if ( Ok == bmpTemp->LockBits( &rect, ImageLockModeRead, PixelFormat24bppRGB , &data ) )
00142 {
00143 const DWORD rowSize = data.Width * 3;
00144 const DWORD pitch = (DWORD) abs(data.Stride);
00145
00146 m_width = (int)data.Width;
00147 m_height = (int)data.Height;
00148
00149
00150 m_data = new unsigned char[ 3 * m_width * m_height ];
00151 const char * m_source = (const char *) data.Scan0;
00152
00153
00154 if ( data.Stride >= 0 )
00155 {
00156
00157 for ( int y = 0 ; y < height ; y++ )
00158 {
00159 memcpy( &m_data[ y * m_width * 3 ], &m_source[ y * pitch ], rowSize );
00160 }
00161 }
00162 else
00163 {
00164
00165 DWORD offsetSrc = 0;
00166 for ( int y = (height - 1) ; y >= 0 ; y-- )
00167 {
00168 memcpy( &m_data[ y * m_width * 3 ], &m_source[ offsetSrc ], rowSize );
00169
00170 offsetSrc += pitch;
00171 }
00172 }
00173
00174 bmpTemp->UnlockBits( &data );
00175 delete bmpTemp;
00176
00177 GdiplusShutdown(gdiplusToken);
00178
00179 return true;
00180 }
00181 else
00182 {
00183
00184 delete bmpTemp;
00185
00186 GdiplusShutdown(gdiplusToken);
00187
00188 return false;
00189 }
00190 }
00191
00192
00193
00194 DWORD TCameraImage::GetDataSize(void)
00195 {
00196 return this->GetWidth() * this->GetHeight() * 3;
00197 }
00198
00199
00200
00201
00202
00203 void TCameraImage::GetData(void * dest)
00204 {
00205 memcpy( dest, m_data, this->GetDataSize() );
00206 }
00207
00208
00209
00210 int TCameraImage::GetWidth(void)
00211 {
00212 return m_width;
00213 }
00214
00215
00216
00217 int TCameraImage::GetHeight(void)
00218 {
00219 return m_height;
00220 }
00221
00222
00223
00224 void TCameraImage::Destroy(void)
00225 {
00226 delete this;
00227 }
00228
00229
00230
00231
00232