fragment在activity中的静态和动态用法_使用Matlab修改压缩Gif动态图片制作微信表情...

399364c2d3d86e027dc3750adb5c3543.png

脚本之家

你与百万开发者在一起

399364c2d3d86e027dc3750adb5c3543.png

bda2cf2e200c744def1822662c48585c.gif

e1197a300e8db6c932eefd5f8583197f.png

作者:theOwlAndPussyCat/焦旭光

引言

电脑里存了很多有意思的Gif动态图片,闲暇想把这些动图全导入微信表情,可是这些动图很多大小超过了微信表情大小1MB的限制,要制作成表情只能压缩图像文件大小。网上有很多小的图像处理软件和图像处理网站,尝试了很多,效果都并不是很好。于是决定自己动手来处理图像文件,让文件满足自己的要求。

动态Gif图像由很多静态图像组成,压缩方法无外乎有以下几种:

1、对每张图片进行裁剪,去掉无关紧要的背景。
2、每帧图像进行适当缩放。
3、每张图片降低色彩空间。
4、去除相似的静态图像,减少静态图像的数量。本想用PS来手动一帧一帧修改,无奈图片太多,实在太麻烦。最后想到了使用做图像处理最强大通用的工具Matlab来修改压缩图片。
先分享几张我压缩好制成微信表情的图片^ω^

8bd2150bc33b87cbe137a1aadc43970e.gif

08826f5272626b57d43c0f591b6a6562.gif

b9f9f6c5d42c3fa0c8df168da348480f.gif

以下定义一些变量:

  gifname 需要处理的图像名称,完整路径;
  cutname 处理之后的图像名称,完整路径;
  cutregion 裁剪留下的方块区域;
  scale 缩放比例;
  cindex 颜色空间,可取2,4,8,16,32,64,128,256;
  initframe 新图像第一帧对应源图像的帧数;
  stepframe 新图像相邻两帧对应源图像帧序数之差;
  stopframe 程序处理到源图像该帧数时停止;
  delaytime 新图像两帧之间延迟时间

以下列出需要用到的重要函数:

  Imfinfo() 该函数用于获取图片信息,包括图片的大小、格式、尺寸、颜色信息、修改时间等等。具体到Gif动图,它会获取到一个图片信息的结构体矩阵,可求出矩阵元素个数,即图片信息结构体的数量来获取Gif中存储的静态图片的数量。
  具体用法:info=imfinfo(gifname);
  Imread() 该函数用于读取图片文件中的数据。
  具体用法:[indeximage,indexcolor]=imread(gifname,'frames',1);
  imcrop() 该函数用于图像的裁剪。
  具体用法:cutframe=imcrop(indeximage,indexcolor,cutregion);% cutregion=[1 1 100 100];
  imresize() 该函数用于图像的缩放。
  具体用法:[resframe,resindexcolor]=imresize(cutframe,indexcolor,scale,'bilinear');
  ind2rgb() 索引颜色空间转换为rgb颜色空间
  rgb2ind() rgb颜色空间转换为索引颜色空间

程序完整源代码如下:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function[sourframes,destframes,usedframes]=gifcut(argin1,argin2,argin3,argin4)

%输入参数[源文件名,目标文件名],裁剪区域[左上右下],缩放比例,[颜色索引,起始帧,

间隔帧,终止帧,延迟时间(最小0.01s)]

%输出参数[源文件帧数,目标文件帧数,从源文件截取帧的编号]

%此函数用于gif动态图裁剪,缩小,色彩降低,截取

%终止帧设为0时,读取到最后一帧;不输入延迟时间,默认延迟时间为原视频两帧间延迟,

延迟时间设为0时,输出gif两帧间延迟时间为原视频两帧间延迟*间隔帧数,延迟时间不

为0,输出gif两帧间延迟时间就是设置的延迟时间

%代码编写:theOwlAndPussyCat/焦旭光/2019.08.27

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

sourframes=0;

destframes=0;

usedframes=0;

cutregion=[0000];

scale=1.0;

cindex=256;

initframe=1;

stepframe=1;

stopframe=1;

if length(argin1)<1

error('There are not enough arguments')

return

else

gifname=argin1(1);

info=imfinfo(gifname);

sourframes=length(info)

delaytime=0.01*info(1).DelayTime;

cindex=power(2,info(1).BitDepth);

stopframe=sourframes;

if length(argin1)<2

error('There are not enough arguments.')

return

end

cutname=argin1(2);

cutregion=argin2;

scale=argin3;

if length(argin4)>0

cindex=argin4(1);

end

if length(argin4)>1

initframe=argin4(2);

end

if length(argin4)>2

stepframe=argin4(3);

end

if length(argin4)>3

if argin4(4)==0

stopframe=stopframe;

else

stopframe=argin4(4);

end

end

if length(argin4)>4

if argin4(5)==0

delaytime=0.01*delaytime*stepframe;

else

delaytime=argin4(5);

end

end

end

tempframe=1;

for i=1:stopframe

if i==initframe;

[indeximage,indexcolor]=imread(gifname,'frames',i);

cutframe=imcrop(indeximage,indexcolor,cutregion);

if scale~=1.0

[resframe,resindexcolor]=imresize(cutframe,indexcolor,scale,'bilinear');

else

resframe=cutframe;

resindexcolor=indexcolor;

end

rgbframe=ind2rgb(resframe,resindexcolor);

[recframe,recindexcolor]=rgb2ind(rgbframe,cindex);

imwrite(recframe,recindexcolor,cutname,'gif','Loopcount',inf,'DelayTime',delaytime);

tempframe=i;

usedframes=tempframe;

else if i==tempframe+stepframe && i>initframe

[indeximage,indexcolor]=imread(gifname,'frames',i);

cutframe=imcrop(indeximage,indexcolor,cutregion);

if scale~=1.0

[resframe,resindexcolor]=imresize(cutframe,indexcolor,scale,'bilinear');

else

resframe=cutframe;

resindexcolor=indexcolor;

end

rgbframe=ind2rgb(resframe,resindexcolor);

[recframe,recindexcolor]=rgb2ind(rgbframe,cindex);

imwrite(recframe,recindexcolor,cutname,'gif','WriteMode','append','DelayTime',delaytime);

tempframe=i;

usedframes=[usedframes,tempframe];

end

end

destframes=length(usedframes);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

该matlab自定义函数使用方法:

  将该函数保存为gifcut.m,文件夹下有testdog.gif文件,该文件大小为7.9MB,打开matlab调用此函数:
  gifcut(["文件夹路径 estdog.gif","文件夹路径smalldog.gif"],[1,1,650,434],0.5,[8,2,2]);
  用时176.077501 秒。生成文件smalldog.gif 大小为554KB。
  gifcut(["文件夹路径 estdog.gif","文件夹路径smalldog2.gif"],[1,1,650,434],0.5,[8,2,3,0,0.2]);
  用时118.895854 秒。掉帧略多。生成文件small_dog2.gif 大小为374KB。范例文件如下:

aff4c7edce2053e9ceb1df2785d927df.gif

1577fb8d2e6c043dcf48d0bb46c36f40.gif

248111490e7d2875bb8fe886377edfdb.gif

最后是赞赏码,小国企程序员穷哭求打赏 T^T __ORZ

e518a73ca189f4aec117d0e73a74b8d4.png

参考文献:

Matlab R2018b帮助文档

源码下载:

后台回复关键字“微信表情源码”即可获取下载地址

本文作者:焦旭光

声明:本文为 脚本之家专栏作者 投稿,未经允许请勿转载。

b72735910c4dc1a34c378d5755bb42fe.png7dcea9a4c1a5b5b47eec739066afa9a8.gif

● 47397537ed5787e1b0afd5708942c901.gif 2019 编程语言排行榜:Java、Python 龙争虎斗!PHP 屹立不倒!

● 47397537ed5787e1b0afd5708942c901.gif 脚本之家粉丝福利,请查看!

● 47397537ed5787e1b0afd5708942c901.gif 经典算法题 :两个大数相乘(华为面试)

● 微软劝你别再使用 IE 浏览器

● 最具潜力的编程语言GO有新书啦!

acb167b8745b7369e08545b2cc12a66c.gif

小贴士

返回 上一级 搜索“Java 女程序员 大数据 留言送书 运维 算法 Chrome 黑客 Python JavaScript 人工智能 女朋友 MySQL 书籍 等关键词获取相关文章推荐。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql命令_MySQL常用操作命令

MySQL常用操作命令PHP独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。欢迎大家阅读&#xff01;更多相关信息请关注相关栏目&#xff01;1、启动MySQL服务器实际上上篇已讲到如何启动MySQL。两种方法&#xff1a;一是用winmysqlad…

The 2018 ACM-ICPC上海大都会赛 J Beautiful Numbers (数位DP)

题意&#xff1a;求小于等于N且能被自己所有位上数之和整除的数的个数。 分析&#xff1a;裸的数位dp。用一个三位数组dp[i][j][k]记录&#xff1a;第i位&#xff0c;之前数位之和为j&#xff0c;对某个mod余数为k的状态下满足条件的个数。这里mod的值就是小于等于N的数中&…

mysql定时增量备份_Mysql日常自动备份和增量备份脚本

序你是否在寻找一个MySQL备份脚本?适合对象本文是在Linux下,mysql 4.1.14版本下测试的,经过适当修改可能适合mysql 4.0,5.0及其其他版本.本文适合于没有启动复制功能的mysql,如果启动了复制,可能不需要采取这种备份策略或者需要修改相关参数.每个人的备份策略都可能不同,所以请…

frontcon函数用不了_C++复制构造函数与析构函数

想用机器人赋能未来&#xff0c;少不了扎实的编程的基本功&#xff0c;让我们跟着清华大学的C语言程序设计课程一起过一遍C的语法知识吧&#xff01;当定义基本类型的变量时&#xff0c;经常会用已有的变量去初始化新定义的变量&#xff0c;当定义对象的时候也有类似的需求&…

在京东上买的手机然后申请退货的经历

在京东上买的手机&#xff0c;是支持7天无理由退货的类型的。试用了一下感觉不是太喜欢&#xff0c;就选择退货了。 具体情况如下&#xff1a;先在网上填申请&#xff0c;然后等电话通知什么时候把手机给负责人&#xff0c;给过负责人之后&#xff0c;负责人先检查外观等是否符…

mysql tungsten_使用tungsten将mysql的数据同步到hadoop

背景线上有很多的数据库在运行&#xff0c;后台需要一个分析用户行为的数据仓库。目前比较流行的是mysql和hadoop平台。现在的问题是&#xff0c;如何将线上的mysql数据实时的同步到hadoop中&#xff0c;以供分析。这篇文章就是利用tungsten-replicator来实现。环境由于tungste…

软件项目立项书_2019年度上海市软件和集成电路产业发展专项资金项目立项

上海艾瑞德生物科技有限公司荣获2019年上海市软件和集成电路产业发展专项资金(集成电路和电子信息制造领域)项目立项&#xff01;上海艾瑞德生物科技有限公司的【医用体外诊断动态光场图像采集电子模块的研发及产业化】喜获2019年上海市软件和集成电路产业发展专项资金(集成电路…

line-height:1.5和line-height:150%的区别

1. 给你个数&#xff0c;孩子自己算吧 line-height:1.5 父元素设置line-height:1.5会直接继承给子元素&#xff0c;子元素根据自己的font-size再去计算子元素自己的line-height。 2.老子说多大就是多大 line-height:150% 父元素设置line-height:150%是计算好了line-height值&…

mysql提供了表示日期和时间的数据类型_MySQL数据类型 - 日期和时间类型(1)

1.日期和时间数据类型语法用于表示时间值的日期和时间数据类型是DATE, TIME, DATETIME, TIMESTAMP和 YEAR。对于TIME, DATETIME和 TIMESTAMP值&#xff0c;MySQL支持小数秒&#xff0c;精度可达微秒(6位数)。要定义包含小数秒部分的列&#xff0c;请使用语法type_name(fsp)&…

软件质量保证计划_CMMI V2.0 精讲之“过程质量保证”

过程质量保证(PROCESS QUALITY ASSURANCE, PQA)目的&#xff1a;验证并改进已执行的过程和所产生的工作产品的质量。价值&#xff1a;增强过程使用和改进的一致性&#xff0c;以最大限度地提高业务效益和客户满意度。实践概述第1级PQA 1.1识别并解决过程和工作产品问题。第2级P…

mysql gzip_在mysql中存储GZIP:ed文本?

Is it a common thing for bigger applications and databases to GZIP text data before inserting it to the database?Ill guess that any full-text search on the actual text field will not be working before unzipping it again?解决方案Ive not seen this done muc…

07.30《jQuery》——1.1DOM对和jQuery对象的转化

1.dom对象--->jQuery对象 $(DOM对象):是把DOM对象转化成JQuery对象 演示代码 //1.dom对象---->jQuery对象 var div1 document.getElementById("div1"); var $div1 $(div1); alert($div1.html());// $div1.width() jQuery对象实质就是map、关联数组 Dom对象是…

mysql数据库持续_MySql数据库--持续记录ing

1 基本&#xff0c;引擎&#xff0c;数据类型&#xff0c;运算1.1 基本操作启动&#xff1a;net start mysql停止&#xff1a;net stop mysql连接: mysql –uroot -h127.0.0.1 -proot断开连接&#xff1a;quit; 或 exit;查询支持的存储引擎&#xff1a;show engines; 或 show v…

html 分页_JQuery堪称完美的分页函数

演示效果&#xff1a;html部分&#xff08;引入jquery.js&#xff09;<!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>jQuery简单的分页插件</title> </head><link rel"stylesheet" href"…

mysql 8.0.12解压版安装教程_mysql 8.0.12 解压版安装教程

本文为大家分享了mysql 8.0.12 解压版安装教程&#xff0c;供大家参考&#xff0c;具体内容如下1、首先在官网上下载mysql8.0.12的压缩包&#xff1a;下载地址2、下载成功后解压到任意目录&#xff0c;比如我的是E:\download\mysql-8.0.12-winx64&#xff1b;3、配置环境变量&a…

python 修改图片尺寸_python 批量修改图片大小

一个文件夹下面有好多图片格式是jpg大小是1920*1080&#xff0c;把它们处理成1280*720并按原先图片的名保存在另一路径下 这里首先要找到给定路径下所有的图片文件&#xff0c;然后在修改图片文件的大小&#xff0c;这里用到PIL和glob两个库&#xff1a; # -*- coding: utf-8 -…

简洁又快速地处理集合——Java8 Stream(下)

上一篇文章我讲解 Stream 流的基本原理&#xff0c;以及它与集合的区别关系&#xff0c;讲了那么多抽象的&#xff0c;本篇文章我们开始实战&#xff0c;讲解流的各个方法以及各种操作 没有看过上篇文章的可以先点击进去学习一下 简洁又快速地处理集合——Java8 Stream&#xf…

java if,if...else...的应用

import java.util.Scanner; public class Dome1{public static void main (String []args ){Scanner input new Scanner (System.in );int day 0;System.out.print("请输入1~7整数:");day input.nextInt();if(day1){System.out.print("星期一");}else if…

mac mysql安装失败_Mac mysql安装失败解决方法

在mac终端通过命令安装mysql&#xff0c;提示错误&#xff0c;解决方法如下&#xff1a;(1)安装命令&#xff1a;brew install mysql(2)提示错误&#xff1a;Error:Could not create /usr/local/CellarCheck you have permission to write to /usr/local解决方法&#xff1a;su…

python入口函数的作用_python之函数中参数的作用域

学编程究竟学的是什么呢&#xff1f;在写文章的这几天也一直在思考这个问题——恐怕这也是接下来的几年一直会去思考的问题。这个问题的答案也会指导我的方法论&#xff0c;所以索性整顿一下。 现阶段我的回答是&#xff0c;发现需求&#xff0c;然后解决。 最大的需求无非是完…