#php #api #unity3d #photoshop #image-manipulation
#php #API #unity3d #photoshop #обработка изображений
Вопрос:
Мне нужно применить фильтр crystallized pixels к изображению через некоторый API или библиотеку. Этот эффект должен выглядеть следующим образом:
Таким образом, это не обычный пиксельный эффект, пиксели не имеют квадратной формы.
Есть ли какой-либо API, который я могу использовать? Я искал это, но я немного заблудился.
Комментарии:
1. Crystalize — это алгоритм обработки изображений, который может быть реализован на многих разных языках. Я бы посоветовал выбрать предпочтительный технический стек и сузить ваш вопрос. например, я нашел реализацию Scala, которая, вероятно, не помогла бы за несколько минут поиска в Google…
Ответ №1:
Упс, я только что заметил, что вы отметили PHP, а не Python — извините! Я оставлю это пока в качестве ссылки и, возможно, сделаю версию PHP в другой день.
У меня была быстрая попытка сделать это, и это работает достаточно хорошо:
#!/usr/bin/env python3
import numpy
import random
import math
import sys
from PIL import Image
def crystallize(im, cnt):
# Make output image same size
res = np.zeros_like(im)
h, w = im.shape[:2]
# Generate some randomly placed crystal centres
nx = np.random.randint(0,w,cnt,dtype=np.uint16)
ny = np.random.randint(0,h,cnt,dtype=np.uint16)
# Pick up colours at those locations from source image
sRGB = []
for i in range(cnt):
sRGB.append(im[ny[i],nx[i]])
# Iterate over image
for y in range(h):
for x in range(w):
# Find nearest crystal centre...
dmin = sys.float_info.max
for i in range(cnt):
d = (y-ny[i])*(y-ny[i]) (x-nx[i])*(x-nx[i])
if d < dmin:
dmin = d
j = i
# ... and copy colour of original image to result
res[y,x,:] = sRGB[j]
return res
# Open image, crystallize and save
im = Image.open('duck.jpg')
res = crystallize(np.array(im),200)
Image.fromarray(res).save('result.png')
Это превращает это:
в это:
или это, если вы выбираете 500 кристаллов:
Скорость, вероятно, можно улучшить, уменьшив количество цветов до 256 и разложив изображение на палитры, найдя ближайший цвет для каждого, а затем просто просмотрев их в LUT. Может быть, работа на черный день…
Ключевые слова: Python, voronoi, crystal, crystallize, Photoshop, фильтр, изображение, обработка изображений, Numpy, PIL, Pillow.
Комментарии:
1. Удивительный ответ.
Ответ №2:
Вот как применить фильтр Crystallize с помощью Photoshop api на Python, взято из примераhttps://github.com/lohriialo/photoshop-scripting-python/blob/master/EmbossAction.py
from win32com.client import Dispatch, GetActiveObject
app = GetActiveObject("Photoshop.Application")
fileName = "C:GithubTest.psd"
docRef = app.Open(fileName)
docRef.ActiveLayer = docRef.ArtLayers.Item(1)
def applyCrystallize(cellSize):
cellSizeID = app.CharIDToTypeID("ClSz")
eventCrystallizeID = app.CharIDToTypeID("Crst")
filterDescriptor = Dispatch('Photoshop.ActionDescriptor')
filterDescriptor.PutInteger(cellSizeID, cellSize)
app.ExecuteAction(eventCrystallizeID, filterDescriptor)
applyCrystallize(25)