MayaFlux 0.4.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 347 of file ImageReader.cpp.

348{
349 if (!m_is_open || !m_image_data) {
350 m_last_error = "No image open";
351 return {};
352 }
353
354 if (region.start_coordinates.size() < 2 || region.end_coordinates.size() < 2) {
355 m_last_error = "Invalid region coordinates for image";
356 return {};
357 }
358
359 auto x_start = static_cast<uint32_t>(region.start_coordinates[0]);
360 auto y_start = static_cast<uint32_t>(region.start_coordinates[1]);
361 auto x_end = static_cast<uint32_t>(region.end_coordinates[0]);
362 auto y_end = static_cast<uint32_t>(region.end_coordinates[1]);
363
364 if (x_end > m_image_data->width || y_end > m_image_data->height) {
365 m_last_error = "Region out of bounds";
366 return {};
367 }
368
369 uint32_t region_width = x_end - x_start;
370 uint32_t region_height = y_end - y_start;
371
372 const size_t bytes_per_pixel = m_image_data->byte_size() / m_image_data->element_count() * m_image_data->channels;
373 const size_t bytes_per_elem = m_image_data->byte_size() / m_image_data->element_count();
374 const size_t pixel_stride_bytes = bytes_per_elem * m_image_data->channels;
375
376 std::vector<uint8_t> region_data(
377 static_cast<size_t>(region_width) * region_height * pixel_stride_bytes);
378
379 const auto* src = static_cast<const uint8_t*>(m_image_data->data());
380
381 for (uint32_t y = 0; y < region_height; ++y) {
382 size_t src_offset = (static_cast<size_t>((y_start + y) * m_image_data->width + x_start)) * pixel_stride_bytes;
383 size_t dst_offset = static_cast<size_t>(y * region_width) * pixel_stride_bytes;
384 size_t row_size = static_cast<size_t>(region_width) * pixel_stride_bytes;
385 std::memcpy(
386 region_data.data() + dst_offset,
387 src + src_offset,
388 row_size);
389 }
390
391 return { region_data };
392}
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.