Skip to content

Error scaling/cropping a grayscale JPEG #85

@earthiverse

Description

@earthiverse

Describe the bug

I get the following output with libvips 8.17.2. It seems to work fine on libvips 8.16.1...

PHP Fatal error:  Uncaught Jcupitt\Vips\Exception: libvips error: jpegload: no property named `n'
linear: vector must have 1 or 4 elements
 in /Users/earthiverse/Sites/media-store/vendor/jcupitt/vips/src/VipsOperation.php:311
Stack trace:
#0 /Users/earthiverse/Sites/media-store/vendor/jcupitt/vips/src/VipsOperation.php(371): Jcupitt\Vips\VipsOperation::callBase('VipsForeignSave...', Object(Jcupitt\Vips\Image), Array)
#1 /Users/earthiverse/Sites/media-store/vendor/jcupitt/vips/src/Image.php(1017): Jcupitt\Vips\VipsOperation::call('VipsForeignSave...', Object(Jcupitt\Vips\Image), Array, Array)
#2 /Users/earthiverse/Sites/media-store/vendor/intervention/image-driver-vips/src/Encoders/JpegEncoder.php(31): Jcupitt\Vips\Image->writeToBuffer('.jpg', Array)
#3 /Users/earthiverse/Sites/media-store/vendor/intervention/image/src/Image.php(287): Intervention\Image\Drivers\Vips\Encoders\JpegEncoder->encode(Object(Intervention\Image\Image))
#4 /Users/earthiverse/Sites/media-store/vendor/intervention/image/src/Encoders/FilePathEncoder.php(32): Intervention\Image\Image->encode(Object(Intervention\Image\Encoders\JpegEncoder))
#5 /Users/earthiverse/Sites/media-store/vendor/intervention/image/src/Image.php(287): Intervention\Image\Encoders\FilePathEncoder->encode(Object(Intervention\Image\Image))
#6 /Users/earthiverse/Sites/media-store/vendor/intervention/image/src/Image.php(923): Intervention\Image\Image->encode(Object(Intervention\Image\Encoders\FilePathEncoder))
#7 /Users/earthiverse/Sites/media-store/vendor/intervention/image/src/Image.php(305): Intervention\Image\Image->encodeByPath('out.jpeg')
#8 /Users/earthiverse/Sites/media-store/tests/Codeception/Support/Data/images/floorplan2/test.php(14): Intervention\Image\Image->save('out.jpeg')
#9 {main}
  thrown in /Users/earthiverse/Sites/media-store/vendor/jcupitt/vips/src/VipsOperation.php on line 311

Fatal error: Uncaught Jcupitt\Vips\Exception: libvips error: jpegload: no property named `n'
linear: vector must have 1 or 4 elements
 in /Users/earthiverse/Sites/media-store/vendor/jcupitt/vips/src/VipsOperation.php on line 311

Jcupitt\Vips\Exception: libvips error: jpegload: no property named `n'
linear: vector must have 1 or 4 elements
 in /Users/earthiverse/Sites/media-store/vendor/jcupitt/vips/src/VipsOperation.php on line 311

Call Stack:
    0.0008     397584   1. {main}() /Users/earthiverse/Sites/media-store/tests/Codeception/Support/Data/images/floorplan2/test.php:0
    0.0544    3752104   2. Intervention\Image\Image->save($path = 'out.jpeg') /Users/earthiverse/Sites/media-store/tests/Codeception/Support/Data/images/floorplan2/test.php:14
    0.0544    3752104   3. Intervention\Image\Image->encodeByPath($path = 'out.jpeg') /Users/earthiverse/Sites/media-store/vendor/intervention/image/src/Image.php:305
    0.0556    3842624   4. Intervention\Image\Image->encode($encoder = class Intervention\Image\Encoders\FilePathEncoder { protected array $options = []; public Intervention\Image\MediaType|string|null $mediaType = *uninitialized*; public Intervention\Image\FileExtension|string|null $extension = 'jpeg'; protected ?string $path = 'out.jpeg' }) /Users/earthiverse/Sites/media-store/vendor/intervention/image/src/Image.php:923
    0.0556    3842624   5. Intervention\Image\Encoders\FilePathEncoder->encode($image = class Intervention\Image\Image { private Intervention\Image\Origin $origin = class Intervention\Image\Origin { protected string $mediaType = 'image/jpeg'; protected ?string $filePath = 'base.jpeg' }; private Intervention\Image\Interfaces\DriverInterface $driver = class Intervention\Image\Drivers\Vips\Driver { protected Intervention\Image\Config $config = class Intervention\Image\Config { ... } }; private Intervention\Image\Interfaces\CoreInterface $core = class Intervention\Image\Drivers\Vips\Core { protected int $iteratorIndex = 1; protected Jcupitt\Vips\Image $vipsImage = class Jcupitt\Vips\Image { ... } }; private Intervention\Image\Interfaces\CollectionInterface $exif = class Intervention\Image\Collection { protected array $items = [...] } }) /Users/earthiverse/Sites/media-store/vendor/intervention/image/src/Image.php:287
    0.0560    3862448   6. Intervention\Image\Image->encode($encoder = class Intervention\Image\Encoders\JpegEncoder { protected Intervention\Image\Interfaces\DriverInterface $driver = *uninitialized*; public int $quality = 75; public bool $progressive = FALSE; public ?bool $strip = NULL }) /Users/earthiverse/Sites/media-store/vendor/intervention/image/src/Encoders/FilePathEncoder.php:32
    0.0566    4054968   7. Intervention\Image\Drivers\Vips\Encoders\JpegEncoder->encode($image = class Intervention\Image\Image { private Intervention\Image\Origin $origin = class Intervention\Image\Origin { protected string $mediaType = 'image/jpeg'; protected ?string $filePath = 'base.jpeg' }; private Intervention\Image\Interfaces\DriverInterface $driver = class Intervention\Image\Drivers\Vips\Driver { protected Intervention\Image\Config $config = class Intervention\Image\Config { ... } }; private Intervention\Image\Interfaces\CoreInterface $core = class Intervention\Image\Drivers\Vips\Core { protected int $iteratorIndex = 1; protected Jcupitt\Vips\Image $vipsImage = class Jcupitt\Vips\Image { ... } }; private Intervention\Image\Interfaces\CollectionInterface $exif = class Intervention\Image\Collection { protected array $items = [...] } }) /Users/earthiverse/Sites/media-store/vendor/intervention/image/src/Image.php:287
    0.0574    4125144   8. Jcupitt\Vips\Image->writeToBuffer($suffix = '.jpg', $options = ['Q' => 75, 'interlace' => FALSE, 'optimize_coding' => TRUE, 'background' => [0 => 255, 1 => 255, 2 => 255], 'keep' => 31]) /Users/earthiverse/Sites/media-store/vendor/intervention/image-driver-vips/src/Encoders/JpegEncoder.php:31
    0.0577    4139120   9. Jcupitt\Vips\VipsOperation::call($name = 'VipsForeignSaveJpegTarget', $instance = class Jcupitt\Vips\Image { private FFI\CData ${Jcupitt\Vips\GObject}pointer = class FFI\CData {  }; private FFI\CData ${Jcupitt\Vips\VipsObject}pointer = class FFI\CData {  }; private FFI\CData ${Jcupitt\Vips\VipsObject}gObject = class FFI\CData {  }; public FFI\CData $pointer = class FFI\CData {  } }, $arguments = [0 => class Jcupitt\Vips\Target { private FFI\CData ${Jcupitt\Vips\GObject}pointer = class FFI\CData { ... }; private FFI\CData ${Jcupitt\Vips\VipsObject}pointer = class FFI\CData { ... }; private FFI\CData ${Jcupitt\Vips\VipsObject}gObject = class FFI\CData { ... }; public FFI\CData $pointer = class FFI\CData { ... } }], $options = ['Q' => 75, 'interlace' => FALSE, 'optimize_coding' => TRUE, 'background' => [0 => 255, 1 => 255, 2 => 255], 'keep' => 31]) /Users/earthiverse/Sites/media-store/vendor/jcupitt/vips/src/Image.php:1017
    0.0577    4139336  10. Jcupitt\Vips\VipsOperation::callBase($operation_name = 'VipsForeignSaveJpegTarget', $instance = class Jcupitt\Vips\Image { private FFI\CData ${Jcupitt\Vips\GObject}pointer = class FFI\CData {  }; private FFI\CData ${Jcupitt\Vips\VipsObject}pointer = class FFI\CData {  }; private FFI\CData ${Jcupitt\Vips\VipsObject}gObject = class FFI\CData {  }; public FFI\CData $pointer = class FFI\CData {  } }, $arguments = [0 => class Jcupitt\Vips\Target { private FFI\CData ${Jcupitt\Vips\GObject}pointer = class FFI\CData { ... }; private FFI\CData ${Jcupitt\Vips\VipsObject}pointer = class FFI\CData { ... }; private FFI\CData ${Jcupitt\Vips\VipsObject}gObject = class FFI\CData { ... }; public FFI\CData $pointer = class FFI\CData { ... } }, 1 => ['Q' => 75, 'interlace' => FALSE, 'optimize_coding' => TRUE, 'background' => [...], 'keep' => 31]]) /Users/earthiverse/Sites/media-store/vendor/jcupitt/vips/src/VipsOperation.php:371

Might be related to #80.
Fails to pad a grayscale jpeg with the error linear: vector must have 1 or 4 elements

Code Example

<?php

use Intervention\Image\Drivers\Vips\Driver;
use Intervention\Image\ImageManager;

require '../../../../../../vendor/autoload.php';

$imageManager = ImageManager::withDriver(Driver::class);

$image = $imageManager->read('base.jpeg');
$image->scaleDown(484, 311);
$image->crop(280, 180, 0, 0, 'ffffff', 'center');

$image->save('out.jpeg');

Expected behavior

Should be padded without errors (this image was produced using libvips 8.16.1)

Image

Images

Image

Environment:

  • PHP Version: 8.4.13
  • OS: MacOS
  • Intervention Image Version: 3.11.4 (intervention/image-driver-vips 1.0.7)
  • php-vips Version: 1.0.13
  • libvips Version: 8.17.2

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions