Как эффективно создать однотонное фоновое изображение с помощью Ruby-Vips

Я хочу создать однотонный фоновый холст заданного размера, используя методы, доступные в Ruby-Vips. Прямо сейчас я могу сделать это, например:

canvas = Vips::Image.black(600, 600).ifthenelse([0,0,0], [252, 186, 3])

Тем не менее, кажется странным создавать черное изображение, а затем применять цвет попиксельно таким образом. Есть ли лучший или более эффективный способ сделать это?


person adam tropp    schedule 09.04.2020    source источник


Ответы (1)


Если вы пытаетесь сопоставить существующее изображение, вы можете использовать new_from_image:

y = x.new_from_image [1, 2, 3]

Создает изображение, которое копирует большинство свойств из x, но каждое значение пикселя заменяется на [1, 2, 3].

Источник для new_from_image показывает, как эффективно создать изображение с нуля:

    def new_from_image value
      pixel = (Vips::Image.black(1, 1) + value).cast(format)
      image = pixel.embed 0, 0, width, height, extend: :copy
      image.copy interpretation: interpretation, xres: xres, yres: yres,
        xoffset: xoffset, yoffset: yoffset
    end

So:

  • сделать однопиксельное черное изображение
  • добавить константу
  • привести к нужному формату (uint8, double и т.д.)
  • расширить до нужного размера
  • установить метаданные, такие как разрешение, интерпретация и т. д.
person jcupitt    schedule 09.04.2020
comment
Конечно, я сравнил это с примером из поста, и он примерно в 3,5 раза быстрее. Спасибо! - person adam tropp; 10.04.2020