Крутящийся круг с транслоадитом. Возможно ли это с водяным знаком или поворотом изображения?

Я пытаюсь создать вращающийся круг с изображением в качестве маски. Из того, что я видел, нет возможности использовать движущийся водяной знак или автоматический поворот изображения. Возможно ли это с помощью транслоадита?

В результате должен получиться «виниловый» спиннинг.


person Tudor-Radu Barbu    schedule 16.04.2020    source источник
comment
Можете ли вы предоставить минимальный пример вращающегося круга или художественного произведения? Как и когда появляется этот круг?   -  person Christos Lytras    schedule 20.04.2020
comment
Извините за отсутствие объяснений. Примерно так: youtube.com/watch?v=jN3J5ZVoDps — видео основание и вращение изображения внутри (как водяной знак). Если такой возможности нет, может быть просто статичное изображение, вращающееся, и в результате получится что-то вроде этого видео.   -  person Tudor-Radu Barbu    schedule 21.04.2020
comment
Почему вы должны делать это с помощью Transloadit? Я предоставил простой пример HTML/CSS/JS. Пожалуйста, проверьте мой ответ.   -  person Christos Lytras    schedule 27.04.2020
comment
Извините, я хочу создать видео для распространения, а не HTML...   -  person Tudor-Radu Barbu    schedule 27.04.2020


Ответы (1)


На этот вопрос довольно сложно ответить, но с Transloadit это вполне выполнимо. Я буду использовать python, чтобы ответить на него в первую очередь для OpenCV, но, конечно, вы можете использовать язык, который вы предпочитаете - я постараюсь сделать его как можно более независимым от языка. Я использовал 4 разных шаблона, чтобы получить желаемый результат, а также немного локальной магии Python, чтобы связать все вместе — вот и все.

  1. Сначала нам нужно изменить размер изображения, чтобы оно хорошо подходило для виниловой пластинки.
{
  "steps": {
    ":original": {
      "robot": "/upload/handle"
    },
    "resize": {
      "use": ":original",
      "robot": "/image/resize",
      "format": "png",
      "resize_strategy": "fillcrop",
      "width": 350,
      "height": 350,
      "imagemagick_stack": "v2.0.7"
    }
  }
}
  1. Теперь мы хотим замаскировать это изображение с помощью OpenCV и NumPy следующим образом:
# Mask the image
# Reads the input image
img = cv2.imread(img_path)
# Creates a mask with the same size as the image
mask = np.zeros(img.shape, dtype=np.uint8)
# Creates a white circle in the centre
mask = cv2.circle(mask, (175, 175), 175, (255, 255, 255), -1)
# Makes a small whole in the centre of the mask
mask = cv2.circle(mask, (175, 175), 20, (0, 0, 0), -1)
result = cv2.bitwise_and(img, mask)

Это возьмет изображение и создаст для него маску, которая должна выглядеть как пончик.

Маска

Затем, используя побитовую операцию и между изображением и маской, вы получаете форму для печенья исходного изображения.

После применения маски

  1. Тем не менее, нам все еще нужно удалить черный фон — для этого мы используем этот шаблон:
{
  "steps": {
    ":original": {
      "robot": "/upload/handle"
    },
    "trimmed": {
      "use": ":original",
      "robot": "/image/resize",
      "alpha": "Activate",
      "type": "TrueColor",
      "transparent": "0,0,0",
      "imagemagick_stack": "v2.0.7"
    }
  }
}

Это просто сделает все черные пиксели прозрачными.

  1. Теперь мы можем использовать функция водяного знака Transloadit, чтобы наложить это изображение на наш виниловая пластинка
{
  "steps": {
    ":original": {
      "robot": "/upload/handle"
    },
    "watermark": {
      "use": ":original",
      "robot": "/image/resize",
      "watermark_size": "33%",
      "watermark_position": "center",
      "imagemagick_stack": "v2.0.7"
    }
  }
}
  1. Теперь осталось только заставить его вращаться. Что мы можем сделать, так это создать, скажем, 60 кадров и повернуть изображение, а затем использовать /video /merge robot — склеить все вместе в бесшовный GIF.
{
  "steps": {
    ":original": {
      "robot": "/upload/handle"
    },
    "rotate_image": {
      "use": ":original",
      "robot": "/image/resize",
      "rotation": "${file.basename}",
      "resize_strategy": "crop",
      "imagemagick_stack": "v2.0.7"
    },
    "animated": {
      "robot": "/video/merge",
      "use": {
        "steps": [
          {
            "name": "rotate_image",
            "as": "image"
          }
        ],
        "bundle_steps": true
      },
      "result": true,
      "ffmpeg_stack": "v4.3.1",
      "ffmpeg": {
        "f": "gif",
        "pix_fmt": "rgb24"
      }
    }
  }
}

Здесь я использую имя изображения, чтобы определить, на сколько градусов его нужно повернуть, поэтому, когда я загружаю файлы в робота, я буду называть изображение на основе его индекса в массиве, используя этот код Python:

# Now we make a list of images that represent each frame
no_of_frames = 60
assembly = tl.new_assembly({'template_id': [SPINNING_VINYL_TEMPLATE_ID]})
directory = 'Assets/Frames/{image}'.format(image=img_name)
# Length of our animation in seconds
length = 2

for i in range(no_of_frames):
    if not os.path.exists(directory):
        os.mkdir(directory)
    # Creates an image based on the index in the animation
    # We pass this to the robot so it knows how many degrees to rotate the image by
    location = '{directory}/{index}.png'.format(directory=directory, index=round(i*360/no_of_frames))
    cv2.imwrite(location, finished_vinyl)
    assembly.add_file(open(location, 'rb'))

Это мой конечный результат

person MSSNG    schedule 25.02.2021