python PIL Image 图片与矩阵的转换, 加密

对图片进行简单的加密

  1. 直接在字节上进行异或操作,这样破坏了图片格式。2. 百度了一下,发现可以直接变动像素的位置实现某种程度上的加密。

流程上:

  1. 获取图片的像素数据
  2. 随机化一个序列,根据这个序列重新排列像素,需要把像素值存储到矩阵中
  3. 随机后的矩阵转为图片
  • 如何获取图片的像素
1. p = img.load()  # img = Image.open('x.png')
# 可以用p[x,y]的方式取像素
2. arr = np.array(img) # np = numpy
  • 随机序列
random.seed(1)
random.shuffle()
def convert(content):
    i = BytesIO(content)
    img = Image.open(i)
    width, height = img.size
    x, y = range(height), range(width)
    random.seed(width+height)
    random.shuffle(x)
    random.shuffle(y)
    temp = np.zeros((height, width, 3), dtype='|u1') # 如果不指定dtype 在Image.fromarray 时会有异常
    g = np.array(img)
    for i in range(height):
        for j in range(width):
            temp[i][j] = g[x[i]][y[j]]
    new_img = Image.fromarray(temp)
    new_img.show()

测试:
转换前图片
转换后图片

解密后图片

结果发现,解开后的图片和原来的图片内容是差不多的,但质量上下降很多,再次百度
发现, img.save时 有quality参数可选
修改qulity参数后,看上去没有那么大的区别了
修改qulity参数

但是通过查看矩阵的时候,发现还是有很多差距的
 查看

quality设置为100都不能彻底解决问题,想到这是不是Image模块本身的问题,于是换用cv2

def _convert(content, de_encry=False):
    # i = StringIO(content)
    # img = cv2.imread(i)
    img = np.fromstring(content, np.uint8)
    img = cv2.imdecode(img, cv2.IMREAD_COLOR)
    print img.shape
    height, width, c = img.shape
    x, y = range(height), range(width)
    random.seed(width+height)
    random.shuffle(x)
    random.shuffle(y)
    temp = np.zeros((height, width, 3), dtype='uint8')
    g = img
    if de_encry is False:
        ff(temp, g, range(height), range(width), x, y)
    else:
        ff(temp, g, x, y, range(height), range(width))
    cv2.imwrite('n.jpg', temp, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
    cv2.imshow('img', temp)

结果出来后,在矩阵上看仍有很大不同, 再次去搜索,发现保存为bmp,可以解决失真的问题233
保存为bmp对比

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值