MayaFlux 0.1.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 118 of file ImageReader.cpp.

119{
120 if (!m_is_open || !m_image_data) {
121 m_last_error = "No image open";
122 return {};
123 }
124
125 if (region.start_coordinates.size() < 2 || region.end_coordinates.size() < 2) {
126 m_last_error = "Invalid region coordinates for image";
127 return {};
128 }
129
130 auto x_start = static_cast<uint32_t>(region.start_coordinates[0]);
131 auto y_start = static_cast<uint32_t>(region.start_coordinates[1]);
132 auto x_end = static_cast<uint32_t>(region.end_coordinates[0]);
133 auto y_end = static_cast<uint32_t>(region.end_coordinates[1]);
134
135 if (x_end > m_image_data->width || y_end > m_image_data->height) {
136 m_last_error = "Region out of bounds";
137 return {};
138 }
139
140 uint32_t region_width = x_end - x_start;
141 uint32_t region_height = y_end - y_start;
142 size_t region_size = static_cast<size_t>(region_width * region_height) * m_image_data->channels;
143 std::vector<uint8_t> region_data(region_size);
144
145 for (uint32_t y = 0; y < region_height; ++y) {
146 size_t src_offset = (static_cast<size_t>((y_start + y) * m_image_data->width + x_start)) * m_image_data->channels;
147 size_t dst_offset = static_cast<size_t>(y * region_width) * m_image_data->channels;
148 size_t row_size = static_cast<size_t>(region_width) * m_image_data->channels;
149 std::memcpy(
150 region_data.data() + dst_offset,
151 m_image_data->pixels.data() + src_offset,
152 row_size);
153 }
154
155 return { region_data };
156}
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.