完整代码下载地址:Python实现照片、视频一键压缩及备份源代码
第一次运行前先编辑脚本,修改其中的主库位置、随库位置,保存。
此后要更新随库时,只要双击运行脚本即可。
运行结果示例:
主库位置:D:\Users\Haujet\Camera
随库位置:D:\Users\Haujet\Camera-small
正在统计文件中……
主库中共有 23 个文件
有 18 个图片,其中有 2 个需要压缩到随库副本
有 4 个视频,其中有 2 个需要压缩到随库副本
有 1 个其它文件
随库中目前共有 19 个文件
有 16 个图片,其中有 0 个冗余图片
有 2 个视频,其中有 0 个冗余视频
有 1 个其它文件
遍历文件耗时 0.00s,检测视频完整性耗时 0.00s
开始压缩图片到随库,总共有 2 个图片需要压缩
正在压缩第 1 张图片(共 2 张):
原文件路径 主库\folder2\IMG_20171108_170013.jpg
原始大小 5.59MB
宽高比 0.75,为正常比例图片
新文件路径 随库\folder2\IMG_20171108_170013.webp
压缩后大小 578.39KB
比原来减小 89.90%
正在压缩第 2 张图片(共 2 张):
原文件路径 主库\folder2\IMG_20171108_170356.jpg
原始大小 2.93MB
宽高比 1.33,为正常比例图片
新文件路径 随库\folder2\IMG_20171108_170356.webp
压缩后大小 210.87KB
比原来减小 92.97%
开始压缩视频到随库,总共有 2 个视频需要压缩
正在压缩第 1 个视频(共 2 个):
原视频路径 主库\folder2\新建文件夹 (2)\VID_20180821_204216.mp4
原始大小 32.49MB
视频时长 0.3min
视频编码 h264
视频比特率 13.33Mbps
视频分辨率 1280x720
视频帧率 30/1
新分辨率 -2:480
frame= 578 fps=174 q=-1.0 Lsize= 1923kB time=00:00:19.16 bitrate= 822.0kbits/s speed=5.78x
新比特率 0.78Mbps
压缩后大小 1.88MB
比原来减小 94.22%
正在压缩第 2 个视频(共 2 个):
原视频路径 主库\folder2\新建文件夹 (2)\VID_20180826_145240.mp4
原始大小 8.38MB
视频时长 0.1min
视频编码 h264
视频比特率 13.33Mbps
视频分辨率 720x1280
视频帧率 25/1
新分辨率 480:-2
frame= 120 fps=0.0 q=-1.0 Lsize= 505kB time=00:00:04.84 bitrate= 854.1kbits/s dup=1 drop=0 speed=6.42x
新比特率 0.69Mbps
压缩后大小 504.90KB
比原来减小 94.11%
视频压缩任务执行完毕
随库中没有需要删除的冗余媒体文件
全部任务执行完毕,回车结束
现代人都用手机拍不少照片、视频,往往一个照片 2MB、拍一段 1080p 的视频 1 分钟 150MB,非常占用空间。
但事实上,许多照片、视频用不着使用极高的画质、极高的分辨率来存储,长期占用宝贵的手机空间。
例如某些照片不太重要, 200KB 的大小、清晰度,就足以记录用户想要保存的画面信息了,但实际的照片非常高清,体积有 2MB,那这张照片就造成 10 倍的存储浪费了。(本来 1GB 的空间能存储 5000 张这样的图片,现在只能存 500 张)
许多人,手机上的照片、视频,就占用了上百 GB 空间,其中大部分的空间是被超需求的高清存储浪费了的。大部分照片占用着与其内容价值不对等的存储空间,用户也不敢肆意删除,被迫在购买新设备时候不断增加存储空间(512G、1T)
与电脑硬盘的低成本不同,移动端受物理限制,平均每增加 1GB 的价格都要贵很多。
我猜不少人因为手机存储焦虑,对手机拍照、拍视频非常克制。
如果一个用户,平均一天拍 10 张照片、1 分钟视频,一张照片 2M、1 分钟视频 120MB,一年就是 3650 张照片、365 段视频,7GB + 43GB。如果只在手机上保存这些相机直出的照片、视频,存储肯定吃不消,用户就要面临选择:删还是不删,删那些。
这种隐形的存储空间绑架,这对于厂商是有利的,这样可以迫使消费者花更多的钱,购买更大的云存储空间、更高存储规格的手机。但对消费者不利。
手机相机直出的 原图,也是 经过压缩 的,一般都使用 jpg 格式压缩,以 1200w 像素的原图为例,分辨率为 4000 x 3000,其:
所有手机默认用 标准质量 保存,即:jpg 以 87% 质量有损压缩。
手机厂商不会告诉你压缩的具体参数,因为没有意义,反倒是有些人会对压缩看作洪水猛兽、谈之色变。
讲这些,就是要说:
同时:
造成我们对压缩画质不堪直视的原因其实是:微博、空间等网络服务商,为了节约成本、加快浏览速度,将我们原本高清的图片,过分地压缩,压缩到了只有几十 KB,才导致画质相当地差。
最常见的无损照片格式是 bmp,无损存储照片,一张 1200w 像素的照片,要占用 34MB。
我们最常见到的照片格式是 jpg,它是一种有损压缩格式,推出年代较早(1992年发布),87% 质量压缩的 1200w 像素 照片占用 2MB 左右,支持元数据。它的缺点是,细节上会出现毛边问题。
jp2 即 jpeg2000,是 jpg 格式的升级版,但由于 版权费用贵 的问题,没有推广开来。
webp 是谷歌于 2010 年推出的格式,基于 vp8 视频编码发展而来,相比于 jpg,可以用一半的体积提供更好的画质,即 压缩比大大提高,没有 jpg 的毛边问题,支持 元数据,支持动图,开源、免专利费,在各大互联网公司得到了大力推广,对提高图片加载速度、节省带宽起到了重要作用,各大浏览器、图片浏览器已全面支持。它的缺点是编码时间比 jpg 要长、Photoshop 暂不支持直接编辑。
heif 是 MPEG 于 2015 年推出的格式,基于 h265 视频编码发展而来,据宣传压缩率比 jpg 高很多。但由于 h265 收专利费,heif 也 收专利费,推广很是吃力,兼容性差,现在只有安卓和 iOS 上加入了支持,苹果现在就以 heif 作为默认照片格式。
综上,由于
目前来看,选用 webp 作为压缩图片,优点最高。
总述:
工作流解释:
达成目的:
用到的批处理命令行工具:
总的原因是:数据自由。
有人认为将原图、原视频放在电脑,与放在网盘的区别不大,优势不足,这是没有想明白这个设想与网盘的区别。
设想一下,一个人一年拍50g的照片视频,128g手机里最多保存1年的东西。采用压缩方案,可以保存10年的照片视频,且有相似的本地体验。
使用网盘,有以下缺点:
当用户有珍贵的数据时,会认真对待这些数据的、最可靠的,只有用户自己。
将原图、原视频放在电脑端,则有以下优势:
总之,把原始文件放在本地,等于一切形式的数据自由。
以 1200w 像素手机为例,我进行了一些压缩测试:
在实际体验下,300w 像素的图片,观感上并不会有明显的下降。
如果一个用户,平均一天拍 20 张照片,拍 10 年,那就是 20 * 365 * 10 = 73000 张照片,再进行计算:
然后,再进行视频压缩测试:
如果一个用户,平均一天拍 2min 视频,拍 10 年,那就是 2 * 365 * 10 = 7300 分钟视频,再进行计算:
为综合画质、流畅度、体积,建议使用 480P 60fps 作为移动端存储的压缩视频参数,即便是每天拍 2min,10 年的视频也只有 66GB。
不要因为数字小看 480P,在微博上你能刷到的视频,观看时都是 480P,已经是属于够用的分辨率,再加上 60fps,观看体验不容小觑。
使用 H264 是因为现在的 H265 编码要比 H264 慢 2 - 3 倍,不太值得使用。如果以后 h265 更流行、设备算力更高,使用 h265 作为视频编码,视频存储的体积还能再下降一半。
显然,一个压缩后的 随库,能在移动设备上轻松存储用户数十年的照片、视频回忆,显著减轻移动设备的存储压力。
使用这种方案,能有效降低用户在拍视频、照片时因移动设备存储空间焦虑而带来的胆怯。
这是原图,谷歌相机抓拍,1200w 像素,分辨率 4000x3000,质量 95%,大小 1.82MB:

因压缩后整体观感无二致,因此不再对比。
此处,对以下三项进行细节放大比较:



可以看出,第二张的 jpg 压缩版本 出现了毛边效应,细节上非常影响观感,而第三张的 webp 压缩版本 不仅体积更小,还没有毛边效应,细节可喜,分辨率从 1200w 降到 300w,仍能非常好的保留有效画面信息,性价比相当高。
完整代码下载地址:Python实现照片、视频一键压缩及备份源代码
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。