大家好,我是郭立员~
前言和他们聊天的时候谈到一个问题,就是如何不改变图片尺寸的情况下,压缩图片的体积,使其文件变小。
一、图片体积变小的原理。
以一个10*10的图片为例,这张图片有100个像素点,如果每个像素点的颜色值都不同,那么就有100种颜色。
如果把相邻两个像素点,颜色值改成一样,图片颜色值就减少一半,图片的文件大小也会大幅减小。
也就是说,在图片尺寸不变的前提,图片中不同颜色的数量越少,图片文件越小,极端情况就是只有1种颜色,那么就是一张纯色图片。
二、通过修改颜色值来改变图片文件大小。
修改前
修改后
从感官上来说,两张图片差别不是很大,但是两个图片文件大小缺差了将近一半,修改前图片大小:467KB,修改后图片大小:260KB。
那我修改了图片中哪些颜色值?
这里我随意截取了4个像素,修改前4个像素颜色值是不同的,修改后,把像素2变成像素1的颜色,像素4变成像素3的颜色。
总结一下就是每隔2个像素,把像素颜色值改变为其前一个像素颜色值。
三、代码
- [hide]Import "shanhai.lua"
- Dim Original_path = "/sdcard/pictures/1.png"
- Dim New_path = "/sdcard/pictures/2.png"
- SnapShot Original_path, 31, 409, 689, 787
- Dim Original_size = ShanHai.ReadFileSize(Original_path)
- TracePrint "原图大小:",int(Original_size /1024),"KB"
- Dim PixelData =Image.GetPicData(Original_path)
- Dim newPixelData =Image.GetPicData(Original_path)
- TracePrint Len(PixelData),Len(PixelData[1])
- For i = 1 To Len(PixelData)
- For j = 1 To Len(PixelData[1])
- If j>2 Then
- newPixelData[i][j] = PixelData[i][j - ( j mod 2)]
- End If
- Next
- Next
- image.SavePixelData newPixelData, New_path
- Dim New_size = ShanHai.ReadFileSize(New_path)
- TracePrint "原图大小:",int(New_size /1024),"KB"[/hide]
复制代码这里是相邻2个像素颜色值一样,还可以相邻3个、5个、这种颜色值相同的越多,文件大小越小。
当然除了按列去修改颜色值,还可以按行,原理一样,这里就不赘述了,不过要注意一点,如果不能同时修改行和列,要先修改完行、再修改列。
四、应用场景
比如做一些海外app的脚本,需要对接国内打码平台,由于网络原因,如果图片过大会比较卡顿,耗时比较长,所以在保证图片可识别性的前提下,适当缩小图片文件大小,可以提高图片的传输速度。