diff options
| author | Carl Hetherington <cth@carlh.net> | 2024-12-06 18:35:14 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2024-12-26 17:20:25 +0100 |
| commit | 5d9c3bcd4b3c84ba0621281728a4b39f1108c63d (patch) | |
| tree | 408f186ec4683a30ecd9f191531bd03b81cd0b86 | |
| parent | 61a85a446cdc8c9010af2f16ccfe96380d186930 (diff) | |
Add guess_crop_by_alpha().
| -rw-r--r-- | src/lib/guess_crop.cc | 26 | ||||
| -rw-r--r-- | src/lib/guess_crop.h | 1 |
2 files changed, 27 insertions, 0 deletions
diff --git a/src/lib/guess_crop.cc b/src/lib/guess_crop.cc index d82db1824..7089d245d 100644 --- a/src/lib/guess_crop.cc +++ b/src/lib/guess_crop.cc @@ -149,3 +149,29 @@ guess_crop_by_brightness(shared_ptr<const Film> film, shared_ptr<const Content> return crop; } + +Crop +guess_crop_by_alpha(shared_ptr<const Image> image) +{ + std::function<bool (int, int, int, bool)> image_in_line = [image](int start_x, int start_y, int pixels, bool rows) { + switch (image->pixel_format()) { + case AV_PIX_FMT_RGBA: + { + int const increment = rows ? 3 : image->stride()[0]; + uint8_t const* data = image->data()[0] + start_x * std::lround(image->bytes_per_pixel(0)) + start_y * image->stride()[0]; + for (int p = 0; p < pixels; ++p) { + if (data[3]) { + return true; + } + data += increment; + } + return false; + } + default: + throw PixelFormatError("guess_crop_by_alpha()", image->pixel_format()); + } + }; + + return guess_crop(image, image_in_line); +} + diff --git a/src/lib/guess_crop.h b/src/lib/guess_crop.h index 9585ed92a..7c500faf0 100644 --- a/src/lib/guess_crop.h +++ b/src/lib/guess_crop.h @@ -31,4 +31,5 @@ class Image; Crop guess_crop_by_brightness(std::shared_ptr<const Image> image, double threshold); Crop guess_crop_by_brightness(std::shared_ptr<const Film> fillm, std::shared_ptr<const Content> content, double threshold, dcpomatic::ContentTime position); +Crop guess_crop_by_alpha(std::shared_ptr<const Image> image); |
