Read a specific region of data.
353{
356 return {};
357 }
358
359 if (region.start_coordinates.size() < 2 || region.end_coordinates.size() < 2) {
361 return {};
362 }
363
364 auto x_start = static_cast<uint32_t>(region.start_coordinates[0]);
365 auto y_start = static_cast<uint32_t>(region.start_coordinates[1]);
366 auto x_end = static_cast<uint32_t>(region.end_coordinates[0]);
367 auto y_end = static_cast<uint32_t>(region.end_coordinates[1]);
368
371 return {};
372 }
373
374 uint32_t region_width = x_end - x_start;
375 uint32_t region_height = y_end - y_start;
376
379 const size_t pixel_stride_bytes = bytes_per_elem *
m_image_data->channels;
380
381 std::vector<uint8_t> region_data(
382 static_cast<size_t>(region_width) * region_height * pixel_stride_bytes);
383
385
386 for (uint32_t y = 0; y < region_height; ++y) {
387 size_t src_offset = (
static_cast<size_t>((y_start + y) *
m_image_data->width + x_start)) * pixel_stride_bytes;
388 size_t dst_offset = static_cast<size_t>(y * region_width) * pixel_stride_bytes;
389 size_t row_size = static_cast<size_t>(region_width) * pixel_stride_bytes;
390 std::memcpy(
391 region_data.data() + dst_offset,
393 row_size);
394 }
395
396 return { region_data };
397}
std::optional< ImageData > m_image_data