MayaFlux 0.3.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ read_region()

std::vector< Kakshya::DataVariant > MayaFlux::IO::ImageReader::read_region ( const FileRegion region)
overridevirtual

Read a specific region of data.

Parameters
regionRegion descriptor.
Returns
DataVariant vector containing the requested data.

Implements MayaFlux::IO::FileReader.

Definition at line 151 of file ImageReader.cpp.

152{
153 if (!m_is_open || !m_image_data) {
154 m_last_error = "No image open";
155 return {};
156 }
157
158 if (region.start_coordinates.size() < 2 || region.end_coordinates.size() < 2) {
159 m_last_error = "Invalid region coordinates for image";
160 return {};
161 }
162
163 auto x_start = static_cast<uint32_t>(region.start_coordinates[0]);
164 auto y_start = static_cast<uint32_t>(region.start_coordinates[1]);
165 auto x_end = static_cast<uint32_t>(region.end_coordinates[0]);
166 auto y_end = static_cast<uint32_t>(region.end_coordinates[1]);
167
168 if (x_end > m_image_data->width || y_end > m_image_data->height) {
169 m_last_error = "Region out of bounds";
170 return {};
171 }
172
173 uint32_t region_width = x_end - x_start;
174 uint32_t region_height = y_end - y_start;
175 size_t region_size = static_cast<size_t>(region_width * region_height) * m_image_data->channels;
176 std::vector<uint8_t> region_data(region_size);
177
178 for (uint32_t y = 0; y < region_height; ++y) {
179 size_t src_offset = (static_cast<size_t>((y_start + y) * m_image_data->width + x_start)) * m_image_data->channels;
180 size_t dst_offset = static_cast<size_t>(y * region_width) * m_image_data->channels;
181 size_t row_size = static_cast<size_t>(region_width) * m_image_data->channels;
182 std::memcpy(
183 region_data.data() + dst_offset,
184 m_image_data->pixels.data() + src_offset,
185 row_size);
186 }
187
188 return { region_data };
189}
std::optional< ImageData > m_image_data

References MayaFlux::IO::FileRegion::end_coordinates, m_image_data, m_is_open, m_last_error, and MayaFlux::IO::FileRegion::start_coordinates.