两行代码实现图片压缩

两行代码实现图片压缩

相信大家经常会碰到上传图片的情景,如果图片过大,上传又有限制。这个时候就需要对图片进行压缩处理,截图有可能模糊或者尺寸依然较大,在线网站压缩又可能有隐私顾虑。

作为一个伪技术人员,在多方尝试后发现,python只需两行代码即可完成图片压缩。

环境配置:对于mac用户来说,需要注意opencv和mac版本的冲突

# 最新版要求os 11,否则报ImportError: dlopen... 错误
# 本机为os 10.15 不考虑折腾mac版本,选择安装旧版本

# pip install opencv-python==4.2.0.34 # 指定4.2旧版本

本文图片来源于网上,读者可自行网络搜集。如果需要也可微信公众号关注HsuHeinrich,回复关键字【图片压缩】自动获取

import cv2 as cv
import numpy as np
from PIL import Image, ImageDraw, ImageFont
import matplotlib.pyplot as plt 
  • 两行代码实现图片压缩
# 当前目录读取一张图片(2.1M)
img = cv.imread('naruto.png')

# 压缩图片(152Kb)
cv.imwrite('naruto.jpg', img, [cv.IMWRITE_JPEG_QUALITY, 50])
True
  • 查看一下压缩情况(非必要)
# 查看细节丢失情况 肉眼基本看不出差异
fig = plt.figure(figsize = (80,60))

img1 = plt.imread('naruto.png') # 原始图片
plt.subplot(1, 2, 1)
plt.imshow(img1)
plt.xticks([])
plt.yticks([])

img2 = plt.imread('naruto.jpg') # 压缩后图片
plt.subplot(1, 2, 2)
plt.imshow(img2)
plt.xticks([])
plt.yticks([])

fig.tight_layout() # 调整整体空白
plt.subplots_adjust(wspace =0.02, hspace =0) # 调整子图间距
plt.show()

output_3_0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二值图片的压缩算法可以采用一种叫做RLE(Run-Length Encoding)的算法。该算法的基本思想是将连续的相同像素点序列记录下来,用一个计数器来表示连续的像素点个数,从而达到压缩的目的。下面是RLE压缩算法的MATLAB代码实现: ```matlab function compressed = rle_compress(binary_image) compressed = []; count = 0; current_pixel = binary_image(1); for i = 1:length(binary_image) if binary_image(i) == current_pixel count = count + 1; else compressed = [compressed; [current_pixel, count]]; current_pixel = binary_image(i); count = 1; end end compressed = [compressed; [current_pixel, count]]; end function decompressed = rle_decompress(compressed_image) decompressed = []; for i = 1:size(compressed_image, 1) decompressed = [decompressed, ones(1, compressed_image(i, 2)) * compressed_image(i, 1)]; end end ``` 其中,rle_compress函数接受一个二值图像的一维向量,返回一个元组矩阵,每行表示一个连续的像素点序列和该序列的长度。rle_decompress函数接受一个元组矩阵,返回一个解压后的二值图像的一维向量。 为了计算压缩后的空余空间,我们可以先用rle_compress函数对原图像进行压缩,然后计算压缩后的元组矩阵占用的空间和原图像占用的空间之差,即可得到压缩后的空余空间。下面是计算压缩后的空余空间的MATLAB代码实现: ```matlab function compression_ratio = calc_compression_ratio(binary_image) compressed = rle_compress(binary_image); bits_per_pixel = 8 * numel(class(binary_image)); compressed_size = sum(sizeof(compressed(:, 1)) * bits_per_pixel + sizeof(compressed(:, 2)) * 8); original_size = length(binary_image) * bits_per_pixel; compression_ratio = (original_size - compressed_size) / original_size; end function free_space = calc_free_space(binary_image) compressed = rle_compress(binary_image); bits_per_pixel = 8 * numel(class(binary_image)); compressed_size = sum(sizeof(compressed(:, 1)) * bits_per_pixel + sizeof(compressed(:, 2)) * 8); original_size = length(binary_image) * bits_per_pixel; free_space = original_size - compressed_size; end ``` 其中,calc_compression_ratio函数接受一个二值图像的一维向量,返回压缩比率。calc_free_space函数接受一个二值图像的一维向量,返回压缩后的空余空间。这两个函数都使用了rle_compress函数对图像进行压缩,并根据压缩后的元组矩阵和原图像的像素位数计算压缩后的空间占用和原图像的空间占用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值