Php 如何以编程方式将Photoshop过滤器Pixelate>Crystalize应用于图像?

Php 如何以编程方式将Photoshop过滤器Pixelate>Crystalize应用于图像?,php,api,unity3d,photoshop,image-manipulation,Php,Api,Unity3d,Photoshop,Image Manipulation,我需要通过一些API或库将结晶像素过滤器应用于图像。此效果应如下所示: 所以这不是通常的像素效果,像素不是方形的 有什么API我可以使用吗?我一直在寻找这个,但我有点迷路了。哎呀,我刚刚注意到你是用PHP而不是Python标记的-对不起!我现在就把它作为参考,改天可能会做一个PHP版本 我对此进行了快速尝试,效果很好: #!/usr/bin/env python3 import numpy import random import math import sys from PIL import

我需要通过一些API或库将结晶像素过滤器应用于图像。此效果应如下所示:

所以这不是通常的像素效果,像素不是方形的


有什么API我可以使用吗?我一直在寻找这个,但我有点迷路了。

哎呀,我刚刚注意到你是用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、crystal、Photoshop、filter、image、image processing、Numpy、PIL、Pill。

以下是如何在Python中使用Photoshop api应用Crystalize filter的示例


Crystalize是一种图像处理算法,可以用多种不同的语言实现。我建议选择一个首选的技术堆栈,缩小你的问题范围。e、 我发现了一个Scala实现,可能在谷歌搜索几分钟后就帮不上忙了……令人惊讶的答案。
from win32com.client import Dispatch, GetActiveObject

app = GetActiveObject("Photoshop.Application")
fileName = "C:\Github\Test.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)