使用python手动混合图像的像素

Bru*_*oni 0 python python-imaging-library

我正在尝试创建一个混合图像像素的算法,我可以像以前一样带来图像,但我不知道这样做.

我正在使用python和pil,但我可以使用其他库.

例: 在此输入图像描述在此输入图像描述 并回到 在此输入图像描述

谢谢.

drh*_*des 5

这应该做到这一点.没有错误处理,它不遵循pep8标准,它使用慢速PIL操作,它不使用参数解析库.我确定还有其他不好的事情.

它的工作原理是在加扰下使用python的随机数生成器和图像的不变量.使用大小的哈希值.由于大小没有改变,因此对于所有共享相同大小的图像,构建在其上的随机序列将是相同的.该序列用作一对一映射,因此它是可逆的.

可以从shell调用脚本两次以创建两个图像,"scrambled.png"和"unscrambled.png"."Qfhe3.png"是源图像.

python scramble.py scramble "./Qfhe3.png"
python scramble.py unscramble "./scrambled.png"
Run Code Online (Sandbox Code Playgroud)

-

#scramble.py
from PIL import Image
import sys
import os
import random

def openImage():
    return Image.open(sys.argv[2])

def operation():
    return sys.argv[1]

def seed(img):
    random.seed(hash(img.size))

def getPixels(img):
    w, h = img.size
    pxs = []
    for x in range(w):
        for y in range(h):
            pxs.append(img.getpixel((x, y)))
    return pxs

def scrambledIndex(pxs):
    idx = range(len(pxs))
    random.shuffle(idx)
    return idx

def scramblePixels(img):
    seed(img)
    pxs = getPixels(img)
    idx = scrambledIndex(pxs)
    out = []
    for i in idx:
        out.append(pxs[i])
    return out

def unScramblePixels(img):
    seed(img)
    pxs = getPixels(img)
    idx = scrambledIndex(pxs)
    out = range(len(pxs))
    cur = 0
    for i in idx:
        out[i] = pxs[cur]
        cur += 1
    return out

def storePixels(name, size, pxs):
    outImg = Image.new("RGB", size)
    w, h = size
    pxIter = iter(pxs)
    for x in range(w):
        for y in range(h):
            outImg.putpixel((x, y), pxIter.next())
    outImg.save(name)

def main():
    img = openImage()
    if operation() == "scramble":
        pxs = scramblePixels(img)
        storePixels("scrambled.png", img.size, pxs)
    elif operation() == "unscramble":
        pxs = unScramblePixels(img)
        storePixels("unscrambled.png", img.size, pxs)
    else:
        sys.exit("Unsupported operation: " + operation())

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)