31 #include "../../include/effects/Crop.h"
36 Crop::Crop() : left(0.1), top(0.1), right(0.1), bottom(0.1) {
38 init_effect_details();
43 left(left), top(top), right(right), bottom(bottom)
46 init_effect_details();
50 void Crop::init_effect_details()
65 std::shared_ptr<Frame>
Crop::GetFrame(std::shared_ptr<Frame> frame, int64_t frame_number)
68 std::shared_ptr<QImage> frame_image = frame->
GetImage();
71 std::shared_ptr<QImage> tempColor = std::shared_ptr<QImage>(
new QImage(frame_image->width(), 1, QImage::Format_RGBA8888));
72 tempColor->fill(QColor(QString::fromStdString(
"transparent")));
81 unsigned char *pixels = (
unsigned char *) frame_image->bits();
82 unsigned char *color_pixels = (
unsigned char *) tempColor->bits();
85 int top_bar_height = top_value * frame_image->height();
86 int bottom_bar_height = bottom_value * frame_image->height();
87 int left_bar_width = left_value * frame_image->width();
88 int right_bar_width = right_value * frame_image->width();
91 for (
int row = 0; row < frame_image->height(); row++) {
94 if ((top_bar_height > 0.0 && row <= top_bar_height) || (bottom_bar_height > 0.0 && row >= frame_image->height() - bottom_bar_height)) {
95 memcpy(&pixels[row * frame_image->width() * 4], color_pixels,
sizeof(
char) * frame_image->width() * 4);
98 if (left_bar_width > 0.0) {
99 memcpy(&pixels[row * frame_image->width() * 4], color_pixels,
sizeof(
char) * left_bar_width * 4);
103 if (right_bar_width > 0.0) {
104 memcpy(&pixels[((row * frame_image->width()) + (frame_image->width() - right_bar_width)) * 4], color_pixels,
sizeof(
char) * right_bar_width * 4);
148 catch (
const std::exception& e)
151 throw InvalidJSON(
"JSON is invalid (missing keys or invalid data types)");
162 if (!root[
"left"].isNull())
164 if (!root[
"top"].isNull())
166 if (!root[
"right"].isNull())
168 if (!root[
"bottom"].isNull())
177 root[
"id"] =
add_property_json(
"ID", 0.0,
"string",
Id(), NULL, -1, -1,
true, requested_frame);
178 root[
"position"] =
add_property_json(
"Position", Position(),
"float",
"", NULL, 0, 1000 * 60 * 30,
false, requested_frame);
179 root[
"layer"] =
add_property_json(
"Track", Layer(),
"int",
"", NULL, 0, 20,
false, requested_frame);
180 root[
"start"] =
add_property_json(
"Start", Start(),
"float",
"", NULL, 0, 1000 * 60 * 30,
false, requested_frame);
181 root[
"end"] =
add_property_json(
"End", End(),
"float",
"", NULL, 0, 1000 * 60 * 30,
false, requested_frame);
182 root[
"duration"] =
add_property_json(
"Duration", Duration(),
"float",
"", NULL, 0, 1000 * 60 * 30,
true, requested_frame);
191 return root.toStyledString();