1/*M/////////////////////////////////////////////////////////////////////////////////////// 2// 3// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 4// 5// By downloading, copying, installing or using the software you agree to this license. 6// If you do not agree to this license, do not download, install, 7// copy or use the software. 8// 9// 10// Intel License Agreement 11// For Open Source Computer Vision Library 12// 13// Copyright (C) 2000, Intel Corporation, all rights reserved. 14// Third party copyrights are property of their respective owners. 15// 16// Redistribution and use in source and binary forms, with or without modification, 17// are permitted provided that the following conditions are met: 18// 19// * Redistribution's of source code must retain the above copyright notice, 20// this list of conditions and the following disclaimer. 21// 22// * Redistribution's in binary form must reproduce the above copyright notice, 23// this list of conditions and the following disclaimer in the documentation 24// and/or other materials provided with the distribution. 25// 26// * The name of Intel Corporation may not be used to endorse or promote products 27// derived from this software without specific prior written permission. 28// 29// This software is provided by the copyright holders and contributors "as is" and 30// any express or implied warranties, including, but not limited to, the implied 31// warranties of merchantability and fitness for a particular purpose are disclaimed. 32// In no event shall the Intel Corporation or contributors be liable for any direct, 33// indirect, incidental, special, exemplary, or consequential damages 34// (including, but not limited to, procurement of substitute goods or services; 35// loss of use, data, or profits; or business interruption) however caused 36// and on any theory of liability, whether in contract, strict liability, 37// or tort (including negligence or otherwise) arising in any way out of 38// the use of this software, even if advised of the possibility of such damage. 39// 40//M*/ 41 42// 43// Image.cpp: implementation of the CvvImage class. 44// 45////////////////////////////////////////////////////////////////////// 46 47#include "_highgui.h" 48 49#if defined __cplusplus && (!defined WIN32 || !defined __GNUC__) 50 51////////////////////////////////////////////////////////////////////// 52// Construction/Destruction 53////////////////////////////////////////////////////////////////////// 54 55CvvImage::CvvImage() 56{ 57 m_img = 0; 58} 59 60void CvvImage::Destroy() 61{ 62 cvReleaseImage( &m_img ); 63} 64 65CvvImage::~CvvImage() 66{ 67 Destroy(); 68} 69 70bool CvvImage::Create( int w, int h, int bpp, int origin ) 71{ 72 const unsigned max_img_size = 10000; 73 74 if( (bpp != 8 && bpp != 24 && bpp != 32) || 75 (unsigned)w >= max_img_size || (unsigned)h >= max_img_size || 76 (origin != IPL_ORIGIN_TL && origin != IPL_ORIGIN_BL)) 77 { 78 assert(0); // most probably, it is a programming error 79 return false; 80 } 81 82 if( !m_img || Bpp() != bpp || m_img->width != w || m_img->height != h ) 83 { 84 if( m_img && m_img->nSize == sizeof(IplImage)) 85 Destroy(); 86 87 /* prepare IPL header */ 88 m_img = cvCreateImage( cvSize( w, h ), IPL_DEPTH_8U, bpp/8 ); 89 } 90 91 if( m_img ) 92 m_img->origin = origin == 0 ? IPL_ORIGIN_TL : IPL_ORIGIN_BL; 93 94 return m_img != 0; 95} 96 97void CvvImage::CopyOf( CvvImage& image, int desired_color ) 98{ 99 IplImage* img = image.GetImage(); 100 if( img ) 101 { 102 CopyOf( img, desired_color ); 103 } 104} 105 106 107#define HG_IS_IMAGE(img) \ 108 ((img) != 0 && ((const IplImage*)(img))->nSize == sizeof(IplImage) && \ 109 ((IplImage*)img)->imageData != 0) 110 111 112void CvvImage::CopyOf( IplImage* img, int desired_color ) 113{ 114 if( HG_IS_IMAGE(img) ) 115 { 116 int color = desired_color; 117 CvSize size = cvGetSize( img ); 118 119 if( color < 0 ) 120 color = img->nChannels > 1; 121 122 if( Create( size.width, size.height, 123 (!color ? 1 : img->nChannels > 1 ? img->nChannels : 3)*8, 124 img->origin )) 125 { 126 cvConvertImage( img, m_img, 0 ); 127 } 128 } 129} 130 131 132bool CvvImage::Load( const char* filename, int desired_color ) 133{ 134 IplImage* img = cvLoadImage( filename, desired_color ); 135 if( !img ) 136 return false; 137 138 CopyOf( img, desired_color ); 139 cvReleaseImage( &img ); 140 141 return true; 142} 143 144 145bool CvvImage::LoadRect( const char* filename, 146 int desired_color, CvRect r ) 147{ 148 if( r.width < 0 || r.height < 0 ) return false; 149 150 IplImage* img = cvLoadImage( filename, desired_color ); 151 if( !img ) 152 return false; 153 154 if( r.width == 0 || r.height == 0 ) 155 { 156 r.width = img->width; 157 r.height = img->height; 158 r.x = r.y = 0; 159 } 160 161 if( r.x > img->width || r.y > img->height || 162 r.x + r.width < 0 || r.y + r.height < 0 ) 163 { 164 cvReleaseImage( &img ); 165 return false; 166 } 167 168 /* truncate r to source image */ 169 if( r.x < 0 ) 170 { 171 r.width += r.x; 172 r.x = 0; 173 } 174 if( r.y < 0 ) 175 { 176 r.height += r.y; 177 r.y = 0; 178 } 179 180 if( r.x + r.width > img->width ) 181 r.width = img->width - r.x; 182 183 if( r.y + r.height > img->height ) 184 r.height = img->height - r.y; 185 186 cvSetImageROI( img, r ); 187 CopyOf( img, desired_color ); 188 189 cvReleaseImage( &img ); 190 return true; 191} 192 193 194bool CvvImage::Save( const char* filename ) 195{ 196 if( !m_img ) 197 return false; 198 cvSaveImage( filename, m_img ); 199 return true; 200} 201 202 203 204#ifdef WIN32 205 206void CImage::DrawToHDC( HDC hDCDst, RECT* pDstRect ) 207{ 208 if( pDstRect && m_img && m_img->depth == IPL_DEPTH_8U && m_img->imageData ) 209 { 210 uchar buffer[sizeof(BITMAPINFOHEADER) + 1024]; 211 BITMAPINFO* bmi = (BITMAPINFO*)buffer; 212 int bmp_w = m_img->width, bmp_h = m_img->height; 213 214 CvRect roi = cvGetImageROI( m_img ); 215 CvRect dst = RectToCvRect( *pDstRect ); 216 217 if( roi.width == dst.width && roi.height == dst.height ) 218 { 219 Show( hDCDst, dst.x, dst.y, dst.width, dst.height, roi.x, roi.y ); 220 return; 221 } 222 223 if( roi.width > dst.width ) 224 { 225 SetStretchBltMode( 226 hDCDst, // handle to device context 227 HALFTONE ); 228 } 229 else 230 { 231 SetStretchBltMode( 232 hDCDst, // handle to device context 233 COLORONCOLOR ); 234 } 235 236 FillBitmapInfo( bmi, bmp_w, bmp_h, Bpp(), m_img->origin ); 237 238 ::StretchDIBits( 239 hDCDst, 240 dst.x, dst.y, dst.width, dst.height, 241 roi.x, roi.y, roi.width, roi.height, 242 m_img->imageData, bmi, DIB_RGB_COLORS, SRCCOPY ); 243 } 244} 245 246#endif 247 248void CvvImage::Fill( int color ) 249{ 250 cvSet( m_img, cvScalar(color&255,(color>>8)&255,(color>>16)&255,(color>>24)&255) ); 251} 252 253#endif 254 255/* End of file. */ 256