Ensure pipelineColourspace is applied to all inputs #2704

This commit is contained in:
Lovell Fuller 2021-07-14 19:22:31 +01:00
parent 3f6d9d6ee9
commit a9aa55c32d
3 changed files with 22 additions and 8 deletions

View File

@ -282,4 +282,16 @@ namespace sharp {
return image.linear(a, b);
}
}
/*
* Ensure the image is in a given colourspace
*/
VImage EnsureColourspace(VImage image, VipsInterpretation colourspace) {
if (colourspace != VIPS_INTERPRETATION_LAST && image.interpretation() != colourspace) {
image = image.colourspace(colourspace,
VImage::option()->set("source_space", image.interpretation()));
}
return image;
}
} // namespace sharp

View File

@ -97,6 +97,11 @@ namespace sharp {
*/
VImage Modulate(VImage image, double const brightness, double const saturation, int const hue);
/*
* Ensure the image is in a given colourspace
*/
VImage EnsureColourspace(VImage image, VipsInterpretation colourspace);
} // namespace sharp
#endif // SRC_OPERATIONS_H_

View File

@ -67,13 +67,7 @@ class PipelineWorker : public Napi::AsyncWorker {
vips::VImage image;
sharp::ImageType inputImageType;
std::tie(image, inputImageType) = sharp::OpenInput(baton->input);
if (baton->colourspaceInput != VIPS_INTERPRETATION_LAST) {
if (image.interpretation() != baton->colourspaceInput) {
image = image.colourspace(baton->colourspaceInput,
VImage::option()->set("source_space", image.interpretation()));
}
}
image = sharp::EnsureColourspace(image, baton->colourspaceInput);
// Calculate angle of rotation
VipsAngle rotation;
@ -419,6 +413,7 @@ class PipelineWorker : public Napi::AsyncWorker {
for (unsigned int i = 0; i < baton->joinChannelIn.size(); i++) {
std::tie(joinImage, joinImageType) = sharp::OpenInput(baton->joinChannelIn[i]);
joinImage = sharp::EnsureColourspace(joinImage, baton->colourspaceInput);
image = image.bandjoin(joinImage);
}
image = image.copy(VImage::option()->set("interpretation", baton->colourspace));
@ -560,7 +555,8 @@ class PipelineWorker : public Napi::AsyncWorker {
for (Composite *composite : baton->composite) {
VImage compositeImage;
sharp::ImageType compositeImageType = sharp::ImageType::UNKNOWN;
std::tie(compositeImage, compositeImageType) = OpenInput(composite->input);
std::tie(compositeImage, compositeImageType) = sharp::OpenInput(composite->input);
compositeImage = sharp::EnsureColourspace(compositeImage, baton->colourspaceInput);
// Verify within current dimensions
if (compositeImage.width() > image.width() || compositeImage.height() > image.height()) {
throw vips::VError("Image to composite must have same dimensions or smaller");
@ -669,6 +665,7 @@ class PipelineWorker : public Napi::AsyncWorker {
VImage booleanImage;
sharp::ImageType booleanImageType = sharp::ImageType::UNKNOWN;
std::tie(booleanImage, booleanImageType) = sharp::OpenInput(baton->boolean);
booleanImage = sharp::EnsureColourspace(booleanImage, baton->colourspaceInput);
image = sharp::Boolean(image, booleanImage, baton->booleanOp);
}