/
itkConvertPixelBuffer.h
190 lines (163 loc) · 7.67 KB
/
itkConvertPixelBuffer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/*=========================================================================
*
* Copyright NumFOCUS
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*=========================================================================*/
#ifndef itkConvertPixelBuffer_h
#define itkConvertPixelBuffer_h
#include "ITKIOImageBaseExport.h"
#include "itkObject.h"
#include "itkNumericTraits.h"
#include <type_traits> // for enable_if
namespace itk
{
/**
* \class ConvertPixelBuffer
* \brief Class to convert blocks of data from one type to another.
*
* ConvertPixelBuffer has a static method Convert(). It is used by
* itkImageFileReader to convert from an unknown type at run-time to the
* compile-time template pixel type in itkImageFileReader. To work with
* complex pixel types like RGB and RGBA a traits class is used.
* OutputConvertTraits() is the traits class. The default one used is
* DefaultConvertPixelTraits.
*
* \ingroup ITKIOImageBase
*
* \sphinx
* \sphinxexample{IO/ImageBase/ConvertImageToAnotherType, Convert Image To Another Type}
* \endsphinx
*/
template <typename InputPixelType, typename OutputPixelType, typename OutputConvertTraits>
class ITK_TEMPLATE_EXPORT ConvertPixelBuffer
{
public:
/** Determine the output data type. */
using OutputComponentType = typename OutputConvertTraits::ComponentType;
using Self = ConvertPixelBuffer;
// Remove all constructor/ destructor / assignments for class with only static member functions.
ConvertPixelBuffer(const ConvertPixelBuffer &) = delete;
ConvertPixelBuffer(ConvertPixelBuffer &&) = delete;
ConvertPixelBuffer &
operator=(const ConvertPixelBuffer &) = delete;
ConvertPixelBuffer &
operator=(ConvertPixelBuffer &&) = delete;
virtual ~ConvertPixelBuffer() = delete;
/** General method converts from one type to another. */
static void
Convert(const InputPixelType * inputData, int inputNumberOfComponents, OutputPixelType * outputData, size_t size);
static void
ConvertVectorImage(const InputPixelType * inputData,
int inputNumberOfComponents,
OutputPixelType * outputData,
size_t size);
protected:
/** Convert to Gray output. */
/** Input values are cast to output values. */
static void
ConvertGrayToGray(const InputPixelType * inputData, OutputPixelType * outputData, size_t size);
/** Weights convert from linear RGB to CIE luminance assuming a
* modern monitor. See Charles Poynton's Colour FAQ
*
* http://www.poynton.com/ColorFAQ.html */
static void
ConvertRGBToGray(const InputPixelType * inputData, OutputPixelType * outputData, size_t size);
/** Weights convert from linear RGB to CIE luminance assuming a
* modern monitor. Values are attenuated by the Alpha channel. See
* Charles Poynton's Colour FAQ
* http://www.poynton.com/ColorFAQ.html */
static void
ConvertRGBAToGray(const InputPixelType * inputData, OutputPixelType * outputData, size_t size);
static void
ConvertMultiComponentToGray(const InputPixelType * inputData,
int inputNumberOfComponents,
OutputPixelType * outputData,
size_t size);
/** Convert to RGB output. */
/** Each RGB output component is set the
* input Gray value. */
static void
ConvertGrayToRGB(const InputPixelType * inputData, OutputPixelType * outputData, size_t size);
/** Input values are cast component by component to output values. */
static void
ConvertRGBToRGB(const InputPixelType * inputData, OutputPixelType * outputData, size_t size);
/** Input values are attenuated by the Alpha channel. */
static void
ConvertRGBAToRGB(const InputPixelType * inputData, OutputPixelType * outputData, size_t size);
/** Conversion depends upon the number of components in the
* input. If the number of input components is 2, the output
* components are each set to the first input component attenuated
* by the second input component. This assumes that a two input
* pixel represents intensity and alpha. If the number of input
* components is not 2, the first three output components a are set
* to the first three input components. The remaining input
* components are ignored. */
static void
ConvertMultiComponentToRGB(const InputPixelType * inputData,
int inputNumberOfComponents,
OutputPixelType * outputData,
size_t size);
/** Convert to RGBA output. */
static void
ConvertGrayToRGBA(const InputPixelType * inputData, OutputPixelType * outputData, size_t size);
static void
ConvertRGBToRGBA(const InputPixelType * inputData, OutputPixelType * outputData, size_t size);
static void
ConvertRGBAToRGBA(const InputPixelType * inputData, OutputPixelType * outputData, size_t size);
static void
ConvertMultiComponentToRGBA(const InputPixelType * inputData,
int inputNumberOfComponents,
OutputPixelType * outputData,
size_t size);
/** This is meant for many component vectors, e.g. converting 31-component float to 31-component double. */
static void
ConvertVectorToVector(const InputPixelType * inputData,
int inputNumberOfComponents,
OutputPixelType * outputData,
size_t size);
/** Convert tensor output. */
/** Each input is made into a 6 component symmetric pixel */
static void
ConvertTensor6ToTensor6(const InputPixelType * inputData, OutputPixelType * outputData, size_t size);
static void
ConvertTensor9ToTensor6(const InputPixelType * inputData, OutputPixelType * outputData, size_t size);
/** Conversions related to complex */
static void
ConvertGrayToComplex(const InputPixelType * inputData, OutputPixelType * outputData, size_t size);
static void
ConvertComplexToComplex(const InputPixelType * inputData, OutputPixelType * outputData, size_t size);
static void
ConvertMultiComponentToComplex(const InputPixelType * inputData,
int inputNumberOfComponents,
OutputPixelType * outputData,
size_t size);
/** the most common case, where InputComponentType == unsigned
* char, the alpha is in the range 0..255. I presume in the
* mythical world of rgba<X> for all integral scalar types X, alpha
* will be in the range 0..X::max(). In the even more fantastical
* world of rgb<float> or rgb<double> alpha would have to be 1.0
*/
template <typename UComponentType>
static std::enable_if_t<!std::is_integral_v<UComponentType>, UComponentType>
DefaultAlphaValue();
template <typename UComponentType>
static std::enable_if_t<std::is_integral_v<UComponentType>, UComponentType>
DefaultAlphaValue();
};
} // namespace itk
#ifndef ITK_MANUAL_INSTANTIATION
# include "itkConvertPixelBuffer.hxx"
#endif
#endif // itkConvertPixelBuffer_h