lovell/sharp

Enhancement: add support for libvips compiled with support for Radiance

Open

#3544 aperta il 2 feb 2023

Vedi su GitHub
 (3 commenti) (2 reazioni) (0 assegnatari)JavaScript (1389 fork)batch import
enhancementhelp wanted

Metriche repository

Star
 (31.994 star)
Metriche merge PR
 (Merge medio 4g 19h) (18 PR mergiate in 30 g)

Descrizione

System: OS: Linux 5.15 Amazon Linux 2 CPU: (8) x64 Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz Memory: 7.44 GB / 15.53 GB Container: Yes Shell: 4.2.46 - /bin/bash Binaries: Node: 16.18.1 - /var/lang/bin/node npm: 8.19.2 - /var/lang/bin/npm npmPackages: sharp: ^0.31.3 => 0.31.3

What are the steps to reproduce?

index.js

'use strict';

const sharp = require('sharp');
const util = require('util');

const run = async () => {
  console.log('sharp.format', util.inspect(sharp.format, false, null, true));
  console.log('sharp.versions', util.inspect(sharp.versions, false, null, true));
  console.log('sharp.vendor', util.inspect(sharp.vendor, false, null, true));

  // perform the resize operation
  const buffer = await sharp('vestibule_4k.hdr')
    .resize(256, 256)
    .toBuffer();
};

run();

Run the below Dockerfile with docker build -t dev-lambda . --progress plain --no-cache

Dockerfile

FROM amazon/aws-lambda-nodejs:16
# FROM amazonlinux:2

ARG BUILD_DIR="/var/build"
ARG FUNCTION_DIR="/var/task"
ARG VERSION_VIPS=8.14.1

RUN \
  yum -q -y groupinstall "Development Tools"

RUN \
  yum -q -y install \
    nano \
    cmake3 \
    wget \
    gobject-introspection-devel \
    glib2-devel \
    expat-devel \
    orc-devel \
    lcms2-devel \
    libexif-devel \
    libgsf-devel \
    libjpeg-turbo-devel \
    libpng-devel \
    giflib-devel \
    libwebp-devel \
    fftw-devel \
    libtiff-devel \
    ImageMagick-devel \
  && ln -s /usr/bin/cmake3 /usr/bin/cmake

RUN \
  pip3 install \
    meson \
    ninja

# Install awscli
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" -s
RUN unzip -q awscliv2.zip
RUN ./aws/install

# Create build directory
RUN mkdir -p ${BUILD_DIR}

RUN \
  cd ${BUILD_DIR} \
  && wget https://github.com/libvips/libvips/archive/refs/tags/v${VERSION_VIPS}.tar.gz \
  && tar xf v${VERSION_VIPS}.tar.gz

RUN \
  cd ${BUILD_DIR}/libvips-${VERSION_VIPS} \
  && meson setup build-dir \
      --buildtype=release \
      -Dexamples=false \
  && cd build-dir \
  && ninja \
  && ninja install \
  && ln -s /usr/local/lib64/libvips-cpp.so.42 /usr/lib64/libvips-cpp.so.42 \
  && ln -s /usr/local/lib64/libvips.so.42 /usr/lib64/libvips.so.42

# Create function directory
RUN mkdir -p ${FUNCTION_DIR}

# Copy handler function
COPY index.js ${FUNCTION_DIR}

RUN cd ${FUNCTION_DIR} && npm init -f -y \
     && PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig npm install --verbose --foreground-scripts sharp aws-sdk

CMD [ "index.handler" ]

What is the expected behaviour?

With a custom build of libvips that enables Rad (Radiance HDR), I expect sharp to be able to resize .hdr files.

Libvips installs says that Radiance HDR is enabled #13 12.96 enable RAD load/save : YES

#13 12.96 vips 8.14.1
#13 12.96 
#13 12.96   Build options
#13 12.96     enable debug                      : NO
#13 12.96     enable deprecated                 : YES
#13 12.96     enable modules                    : YES
#13 12.96     enable gtk-doc                    : NO
#13 12.96     enable doxygen                    : NO
#13 12.96     enable introspection              : YES
#13 12.96     enable examples                   : NO
#13 12.96     enable cplusplus                  : YES
#13 12.96     enable RAD load/save              : YES
#13 12.96     enable Analyze7 load/save         : YES
#13 12.96     enable PPM load/save              : YES
#13 12.96     enable GIF load                   : YES
#13 12.96 
#13 12.96   Optional external packages
#13 12.96     use fftw for FFTs                 : YES
#13 12.96     accelerate loops with ORC         : YES
#13 12.96     ICC profile support with lcms     : YES
#13 12.96     zlib                              : YES
#13 12.96     text rendering with pangocairo    : NO
#13 12.96     font file support with fontconfig : NO
#13 12.96     EXIF metadata support with libexif: YES
#13 14.19 
#13 14.19   External image format libraries
#13 14.19     JPEG load/save with libjpeg       : YES
#13 14.19     JXL load/save with libjxl         : NO (dynamic module: NO)
#13 14.19     JPEG2000 load/save with OpenJPEG  : NO
#13 14.19     PNG load/save with libspng        : NO
#13 14.19     PNG load/save with libpng         : YES
#13 14.19     selected quantisation package     : none
#13 14.19     TIFF load/save with libtiff       : YES
#13 14.19     image pyramid save with libgsf    : YES
#13 14.19     HEIC/AVIF load/save with libheif  : NO (dynamic module: NO)
#13 14.19     WebP load/save with libwebp       : NO
#13 14.19     PDF load with PDFium              : NO
#13 14.19     PDF load with poppler-glib        : NO (dynamic module: NO)
#13 14.19     SVG load with librsvg             : NO
#13 14.19     EXR load with OpenEXR             : NO
#13 14.19     OpenSlide load                    : NO (dynamic module: NO)
#13 14.19     Matlab load with libmatio         : NO
#13 14.19     NIfTI load/save with niftiio      : NO
#13 14.19     FITS load/save with cfitsio       : NO
#13 14.19     GIF save with cgif                : NO
#13 14.19     selected Magick package           : MagickCore (dynamic module: YES)
#13 14.19     Magick API version                : magick6
#13 14.19     Magick load                       : YES
#13 14.19     Magick save                       : YES
#13 14.19 
#13 14.19   User defined options
#13 14.19     buildtype                         : release
#13 14.19     examples                          : false
#13 14.19 

sharp build from source says that local libvips is found

#17 10.48 > sharp@0.31.3 install
#17 10.48 > (node install/libvips && node install/dll-copy && prebuild-install) || (node install/can-compile && node-gyp rebuild && node install/dll-copy)
#17 10.48 
#17 10.72 sharp: Detected globally-installed libvips v8.14.1
#17 10.72 sharp: Building from source via node-gyp

Im able to resize a Radiance HDR with vips cmdline

docker run -it --entrypoint "/bin/bash" --rm dev-lambda
wget https://dl.polyhaven.org/file/ph-assets/HDRIs/hdr/4k/vestibule_4k.hdr
vips resize vestibule_4k.hdr vestibule_256.hdr 0.125

but sharp raises an error

node index.js 
bash-4.2# node index.js 
sharp.format {
  jpeg: {
    id: 'jpeg',
    input: {
      file: true,
      buffer: true,
      stream: true,
      fileSuffix: [ '.jpg', '.jpeg', '.jpe' ]
    },
    output: { file: true, buffer: true, stream: true, alias: [ 'jpe', 'jpg' ] }
  },
  png: {
    id: 'png',
    input: { file: true, buffer: true, stream: true, fileSuffix: [ '.png' ] },
    output: { file: true, buffer: true, stream: true }
  },
  webp: {
    id: 'webp',
    input: { file: false, buffer: false, stream: false },
    output: { file: false, buffer: false, stream: false }
  },
  tiff: {
    id: 'tiff',
    input: {
      file: true,
      buffer: true,
      stream: true,
      fileSuffix: [ '.tif', '.tiff' ]
    },
    output: { file: true, buffer: true, stream: true, alias: [ 'tif' ] }
  },
  magick: {
    id: 'magick',
    input: { file: true, buffer: true, stream: true },
    output: { file: true, buffer: true, stream: true }
  },
  openslide: {
    id: 'openslide',
    input: { file: false, buffer: false, stream: false },
    output: { file: false, buffer: false, stream: false }
  },
  dz: {
    id: 'dz',
    input: { file: false, buffer: false, stream: false },
    output: { file: true, buffer: true, stream: true }
  },
  ppm: {
    id: 'ppm',
    input: {
      file: true,
      buffer: false,
      stream: false,
      fileSuffix: [ '.pbm', '.pgm', '.ppm', '.pfm', '.pnm' ]
    },
    output: { file: true, buffer: false, stream: false }
  },
  fits: {
    id: 'fits',
    input: { file: false, buffer: false, stream: false },
    output: { file: false, buffer: false, stream: false }
  },
  gif: {
    id: 'gif',
    input: { file: true, buffer: true, stream: true, fileSuffix: [ '.gif' ] },
    output: { file: false, buffer: false, stream: false }
  },
  svg: {
    id: 'svg',
    input: { file: false, buffer: false, stream: false },
    output: { file: false, buffer: false, stream: false }
  },
  heif: {
    id: 'heif',
    input: { file: false, buffer: false, stream: false },
    output: {
      file: false,
      buffer: false,
      stream: false,
      alias: [ 'avif', 'heic' ]
    }
  },
  pdf: {
    id: 'pdf',
    input: { file: false, buffer: false, stream: false },
    output: { file: false, buffer: false, stream: false }
  },
  vips: {
    id: 'vips',
    input: {
      file: true,
      buffer: false,
      stream: false,
      fileSuffix: [ '.v', '.vips' ]
    },
    output: { file: true, buffer: false, stream: false }
  },
  jp2k: {
    id: 'jp2k',
    input: { file: false, buffer: false, stream: false },
    output: {
      file: false,
      buffer: false,
      stream: false,
      alias: [ 'j2c', 'j2k', 'jp2', 'jpx' ]
    }
  },
  jxl: {
    id: 'jxl',
    input: { file: false, buffer: false, stream: false },
    output: { file: false, buffer: false, stream: false }
  },
  raw: {
    id: 'raw',
    input: { file: false, buffer: true, stream: true },
    output: { file: false, buffer: true, stream: true }
  }
}
sharp.versions { vips: '8.14.1' }
sharp.vendor { current: 'linux-x64', installed: [] }
node:internal/process/promises:279
            triggerUncaughtException(err, true /* fromPromise */);
            ^

[Error: Input file contains unsupported image format]

Guida contributor