Basic Image AlgorithmS Library  2.8.0
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
ToInterleaved.cpp
1 /*
2 This file is part of the BIAS library (Basic ImageAlgorithmS).
3 
4 Copyright (C) 2003, 2004 (see file CONTACTS for details)
5  Multimediale Systeme der Informationsverarbeitung
6  Institut fuer Informatik
7  Christian-Albrechts-Universitaet Kiel
8 
9 
10 BIAS is free software; you can redistribute it and/or modify
11 it under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation; either version 2.1 of the License, or
13 (at your option) any later version.
14 
15 BIAS is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU Lesser General Public License for more details.
19 
20 You should have received a copy of the GNU Lesser General Public License
21 along with BIAS; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 */
24 
25 #include "ImageConvert.hh"
26 
27 using namespace BIAS;
28 
29 namespace BIAS {
30 
31 template <class StorageType>
32 BIASImageBase_EXPORT
34  Image<StorageType>& dest) {
35 
36  switch (source.GetColorModel()) {
37  case ImageBase::CM_Grey:
38  BIASERR("Does not make sense to convert grey images to interleaved or planar. Target image left unchanged!");
39  return -1;
40  break;
41 
42  case ImageBase::CM_HSV:
43  case ImageBase::CM_BGR:
44  case ImageBase::CM_RGB:
45  return ToInterleavedRGB_(source,dest);
46  break;
47 
48 // case MIP_YUYV422:
49 // return ToInterleavedYUYV422_(source);
50 // break;
51 
52  default:
53  BIASERR("Conversion To Interleaved only implemented for ImageBase::CM_HSV, ImageBase::CM_BGR, ImageBase::CM_RGB. Target image left unchanged!");
54  return -1;
55  }
56 
57  //return 0;
58 }
59 
60 template <class StorageType>
62  const Image<StorageType>& green,
63  const Image<StorageType>& blue,
64  Image<StorageType>& dest)
65 {
66 #ifdef BIAS_DEBUG
67  if (!red.SamePixelAndChannelCount(green) ||
68  !red.SamePixelAndChannelCount(blue)){
69  BIASERR("image sizes of input images does not match");
70  return -2;
71  }
72 #endif
73  register const StorageType *r=red.GetImageData();
74  register const StorageType *g=green.GetImageData();
75  register const StorageType *b=blue.GetImageData();
76  if (!dest.IsEmpty()){
77  if (dest.GetHeight() != red.GetHeight() ||
78  dest.GetWidth() != red.GetWidth()){
79  dest.Release();
80  dest.Init(red.GetWidth(), red.GetHeight(), 3,dest.GetStorageType());
81  }
82  } else {
83  dest.Init(red.GetWidth(), red.GetHeight(), 3,dest.GetStorageType());
84  }
85  register StorageType *sink = dest.GetImageData();
86  register StorageType *end = dest.GetImageData() + 3 * dest.GetPixelCount();
87 
88  while (sink<end){
89  *sink++=*r++;
90  *sink++=*g++;
91  *sink++=*b++;
92  }
93  dest.SetInterleaved(true);
95  return 0;
96 }
97 
98 template <class StorageType>
99 int
101  Image<StorageType>& /*dest*/)
102 {
103  BIASERR("not implemented");
104  return 0;
105 }
106 
107 
108 template <class StorageType>
110  Image<StorageType>& dest) {
111 
112  bool IsInplace = source.GetImageData()==dest.GetImageData();
113  Image<StorageType>* tmpdest;
114  if (IsInplace)
115  tmpdest = new Image<StorageType>;
116  else
117  tmpdest = &dest;
118  if (!tmpdest->IsEmpty()) tmpdest->Release();
119  tmpdest->Init(source.GetWidth(), source.GetHeight(), source.GetChannelCount(),
120  source.GetStorageType());
121  tmpdest->SetColorModel(source.GetColorModel());
122 
123  // Is it already interleaved?
124  if ( !source.IsPlanar() ) {
125  BIASERR("Source image was already interleaved.");
126  register StorageType* pDest = tmpdest->GetImageData();
127  register StorageType* destStop = pDest + 3 * tmpdest->GetPixelCount();
128  register const StorageType* src = source.GetImageData();
129  for(;pDest < destStop; pDest++, src++)
130  *pDest = *src;
131 
132  } else {
133 
134  register StorageType* pDest = tmpdest->GetImageData();
135  register StorageType* destStop = pDest + 3 * tmpdest->GetPixelCount();
136 
137  register const StorageType* src_red = source.GetImageData();
138  register const StorageType* src_green = source.GetImageData() + source.GetPixelCount();
139  register const StorageType* src_blue = source.GetImageData() + 2*source.GetPixelCount();
140 
141  while (pDest < destStop) {
142 
143  *(pDest++) = *(src_red++);
144  *(pDest++) = *(src_green++);
145  *(pDest++) = *(src_blue++);
146  }
147  }
148 
149  tmpdest->SetInterleaved(true);
150  if (IsInplace)
151  {
152  dest = *tmpdest;
153  delete tmpdest;
154  }
155  return 0;
156 }
157 
158 } // namespace BIAS
void Release()
reimplemented from ImageBase
Definition: Image.cpp:1579
static int ToInterleavedYUYV422_(const Image< StorageType > &source, Image< StorageType > &dest)
gray values, 1 channel
Definition: ImageBase.hh:130
bool IsEmpty() const
check if ImageData_ points to allocated image buffer or not
Definition: ImageBase.hh:245
void SetColorModel(EColorModel Model)
Definition: ImageBase.hh:561
bool IsPlanar() const
Definition: ImageBase.hh:484
unsigned int GetWidth() const
Definition: ImageBase.hh:312
void SetInterleaved(bool interleaved)
Definition: ImageBase.hh:568
color values, 3 channels, order: blue,green,red
Definition: ImageBase.hh:132
unsigned int GetChannelCount() const
returns the number of Color channels, e.g.
Definition: ImageBase.hh:382
color values, 3 channels, order: red,green,blue
Definition: ImageBase.hh:131
unsigned int GetHeight() const
Definition: ImageBase.hh:319
static BIASImageBase_EXPORT int ToInterleavedRGB(const Image< StorageType > &red, const Image< StorageType > &green, const Image< StorageType > &blue, Image< StorageType > &dest)
Takes the three channels and composes one interleaved RGB image.
The image template class for specific storage types.
Definition: Image.hh:78
bool SamePixelAndChannelCount(const ImageBase &Image) const
checks if data area has same &quot;size&quot; as Image of other type
Definition: ImageBase.hh:73
static int ToInterleavedRGB_(const Image< StorageType > &source, Image< StorageType > &dest)
void Init(unsigned int Width, unsigned int Height, unsigned int channels=1, enum EStorageType storageType=ST_unsignedchar, const bool interleaved=true)
calls Init from ImageBase storageType is ignored, just dummy argument
Definition: Image.cpp:421
const StorageType * GetImageData() const
overloaded GetImageData() from ImageBase
Definition: Image.hh:137
enum EColorModel GetColorModel() const
Definition: ImageBase.hh:407
enum EStorageType GetStorageType() const
Definition: ImageBase.hh:414
HSV, 3 channels, order: hue, sat , value.
Definition: ImageBase.hh:138
unsigned long int GetPixelCount() const
returns number of pixels in image
Definition: ImageBase.hh:422
static BIASImageBase_EXPORT int ToInterleaved(const Image< StorageType > &source, Image< StorageType > &dest)
Takes the source image, and build an interleaved version.