百行代码教你隐藏私密图片

思路详解

 直奔主题吧,就不瞎侃了。

整个流程的思路呢,就是将图片批量保存到数据库,但是呢又想学习一下加密算法,不过先不加密先,先将图片转为字符再保存到数据库。起初用4M大小的图片试了下,不试不知道,一试吓一跳,一张4M多的图片,转为字符有整整5百多万个字符。

尝试着把它存到数据库,成是成了,就是用SqliteSpy打开该数据库并且点击该列查看详情时直接导致该软件崩溃。

此路行不通,没办法,只能另寻辟径。思来想去只好把图片压缩了,可怜了我的高清大图,不过没大碍,我已经上升到了心中无码的强大境地。

但是为了不至于压缩到眯着眼都看不清楚,使用cv2库进行了多个压缩比的探究,最后得出几个比较实用的压缩比。在下面的成果图我们就可以看到将4M多的图片按40的压缩比进行压缩时图片变成了400多k,整整少了十倍左右。当然,400多k的图片看起来还是挺不错的,不过200多k的图片按40的压缩比成了50多k,感觉有点过度了,应该将70改为80甚至90更为合适。

成果截图

模块代码

解释

话就不多说了,基本上都写有注释,按逻辑思路一步一步来,适合无聊时打发时间消遣学习使用。

整体

from img_date_sql import *
import base64,time,os,cv2
def get_time():
    """
    该函数返回当前时间戳
    时间戳转为可视化时间
    time_stamps=time.strftime('%Y-%m-%d %H:%M:%S ',time.localtime(float(time_stamp)))
    """
    return str(time.time())

def get_FileSize(filePath):
    """
    该函数返回当前文件大小,单位M
    1M=0.1
    """
    fsize = os.path.getsize(filePath)
    fsize = fsize/float(1024*1024)
    return round(fsize,2)

def get_ratio(img_size):
    """
    该函数根据图片大小返回压缩比
    压缩比越高压缩率越低
    单位 M
    1M=0.1
    """
    if 0<img_size<=0.1:
        return 95
    elif 0.1<img_size<=0.5:
        return 70
    elif 0.5<img_size<=1.5:
        return 55
    elif 1.5<img_size<=2.5:
        return 50
    elif 2.5<img_size<=3.5:
        return 45
    elif 3.5<img_size<=5.0:
        return 40
    else:
        return 30
    
def img_compress(img_path,ratio):
    new_img_path=''
    """
    img_path:图片地址
    ratio:压缩比率0-100,
    该函数返回已压缩后的图片路径
    jpg是有损压缩
    0时图像可以得到极大地压缩,但是图像的品质会被大大降低。
    """
    img=cv2.imread(img_path,1)
    new_img_path=img_path.replace('.', '_%s_'%str(ratio))+'.jpg'
    cv2.imwrite(new_img_path,img,[cv2.IMWRITE_JPEG_QUALITY,ratio])
    return new_img_path
    
def str_img(imaStr,img_name):
    """
    从数据库获取图片数据并解码
    """
    imadata = base64.b64decode(imaStr)#解码
    with open(img_name, 'wb') as f:
        f.write(imadata)
        
def img_str(img_path):
    """
    img_paath:图片路径
    1.获取当前时间
    2.获取当前图片大小
    3.根据图片大小进行得到压缩比
    4.获取压缩后的图片路径
    5.将该图进行字符转化并保存到数据库
    """
    time_stamp=get_time()   #1
    img_size=get_FileSize(img_path)   #2
    ratio=get_ratio(img_size)   #3
    new_img_path=img_compress(img_path,ratio)   #4

    with open(new_img_path, 'rb') as f:
        base64_data = base64.b64encode(f.read())
        s = base64_data.decode()
    imgstrLen=str(len(s))
    img_insertData(new_img_path,time_stamp,imgstrLen,s)   #5
    #保存后删除该文件
    os.remove(new_img_path)
    
if __name__=='__main__':
    #存储图片
    img_path="1.jpg"
    img_str(img_path)

    #从数据库提取图片
    #返回数据库已存在的全部图片名称信息,是一个列表[('2_jpg.jpg',), ('1_jpg.jpg',)] a[0][0]就获取到图片名称
    a=img_selectImgname()
    try:
        for i in a:
            #根据图片名称返回图片字符信息 [0][0]就获取到具体图片字符信息
            b=img_showBase64(i[0])[0][0]
            #将得到的信息转化为图片
            str_img(b,i[0])
        print('已完成,没问题哟!')
    except:
        print('出bug啦!')

 数据库(img_date_sql.py)

# -*- coding:utf-8 -*-
import sqlite3

def img_opendb():
    conn = sqlite3.connect("img_date.db")
    cur = conn.execute("""create table if not exists img_info(imgName varchar(126),addTime char(30),imgstrLen char(30),imgBase64 text)""")
    return cur,conn

#  往数据库中添加内容
def img_insertData(imgName,addTime,imgstrLen,imgBase64):
        hel = img_opendb()
        hel[1].execute("insert into img_info(imgName,addTime,imgstrLen,imgBase64) values ('%s','%s','%s','%s')"%(imgName,addTime,imgstrLen,imgBase64))
        hel[1].commit()
        hel[1].close()
        
#   删除数据库中的全部内容
def img_delall():
        hel = img_opendb()              # 返回游标conn
        hel[1].execute("delete from img_info")
        print("删库跑路Cxk我最帅")
        hel[1].commit()
        hel[1].close()
        
#查询图片字符信息
def img_showBase64(imgName):
        hel = img_opendb()
        cur = hel[1].cursor()
        cur.execute("select imgBase64 from img_info where imgName='%s'"%imgName)
        res = cur.fetchall()
        cur.close()
        return res
        
        
        
def img_selectImgname():
        hel = img_opendb()
        cur = hel[1].cursor()
        cur.execute("select imgName from img_info")
        res = cur.fetchall()
        cur.close()
        return res
        

后记

总体来说这很滑稽,因为用字符来存图片用在项目上实现的话我觉得不太可靠,不过用来存用户头像的话还是可行的,当然对于分辨率不高的图片在这方面还是挺有用处的,或者你想存点私密的图片,保存好后直接保存一个db文件就ok了。

好了,暂时侃到这里,代码还有很多可以改进的地方,数据库随便写的,加个GUI还可以批量处理图片,当然这些都不去弄了,有空再看看加密算法的应用,尝试用在这里看看效果怎么样,或者自己写个加密算法上去,ヽミ ´∀`ミノ<。

发布了41 篇原创文章 · 获赞 27 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Cxk___/article/details/105057290