精华内容
下载资源
问答
  • 图书api 查询图书内容

    千次阅读 2018-11-19 14:45:58
    图书api可查询图书内容包括书名、书名简介、图书内容简介、图书封面、阅读人数、网购地址、发布时间等等。 接口名称:图书api 接口平台:开放接口 接口地址:http://apis.juhe.cn/goodbook/query 支持格式:json/...

    于万千之中选择你所爱–好书推荐,值得你信赖。图书api可查询图书内容,包括书名、书名简介、图书内容简介、图书封面、阅读人数、网购地址、发布时间等等。

    接口名称:图书api

    接口平台:开放接口

    接口地址:http://apis.juhe.cn/goodbook/query

    支持格式:json/xml

    请求方式:get

    请求示例:http://apis.juhe.cn/goodbook/query?key=你申请的key&catalog_id=246&rn=10&rn=10

    图书api调用代码JSON返回示例:

    {
    "resultcode":"200",
    "reason":"Success",
    "result":{
    "data":[
      {
         "title":"向诸葛亮借智慧",
         "catalog":"历史 心理学 管理 ",
         "tags":"一本好书 三国历史 社会学好书推荐 管理书籍推荐 诸葛亮 ",
         "sub1":"《向诸葛亮借智慧》",
         "sub2":"《向诸葛亮借智慧》是中央电视台《百家讲坛》主讲人赵玉平老师编著的一 本管理学类图书。作品从管理学和心理学的角度出发,运用人力资源管理和组织行为学的知识,解读了三国睿智军师诸葛亮的一生。本书对三顾茅庐、舌战群儒、赤壁大战、空城计、斩马谡、六出祁山、七擒孟获等与诸葛亮相关的大事件进行了精辟的分析。 诸葛亮(公元181年7月23日—234年8月28日),三国时期蜀国丞相,字孔明,号卧龙,琅琊阳都人,是三国时期杰出的政治家、军事家、发明家和文学家。诸葛亮上知天文、下知地理,雄才大略、才华横溢。为匡扶蜀汉政权,他呕心沥血,鞠躬尽瘁,死而后已。唐朝诗人杜甫有诗赞道:“三顾频烦天下计,两朝开济老臣心。出师未捷身先死,长使英雄泪满襟。”,可见诸葛亮受到后世人们极大的尊崇,是后世忠臣的楷模、智慧的化身。 《向诸葛亮借智慧》一书是管理学教授赵玉平“麻辣说三国”系列中的一部文学作品。赵玉平老师同易中天教授一起被权威机构评选为“2009中国十大国学专家”,是运用管理学、国学、心理学综合解析《水浒传》、三国历史人物的中国第一人,开辟了运用管理学和心理学解读传统经典的新领域。 隆中对策、舌战群儒、草船借箭、七擒孟获……一个个璀璨如明珠的经典故事,成就了诸葛亮无人企及的智慧传奇。但是,孔明先生的智慧究竟从何而来呢?在千百年后的今天,他的卓越智慧又能给今天的我们带来哪些启迪和帮助呢?《向诸葛亮借智慧》一书从一个崭新的角度观察诸葛亮这个重要的历史人物和相关的历史事件,讲故事的同时也分析规律,并结合当今现实生活,古为今用,总结出能够运用于求职、求人、用人、管人等现实生活中的规律和技巧。 鲁迅说:“关公之义近乎伪,诸葛之智近乎妖。” 《向诸葛亮借智慧》,哪怕只借到了一点点,也足够让我们的生活过得更轻松、更顺心了。 《向诸葛亮借智慧》",
        "img":"http://apis.juhe.cn/goodbook/img/379cdafe13f92d62e99388182a6d08ec.jpg",
         "reading":"8091人阅读",
         "online":"京东商城:http://book.jd.com/10483893.html 当当网:http://product.dangdang.com/product.aspx?product_id=21020821 苏宁易购:http://www.suning.com/emall/prd_10052_22001_-7_1006212_.html ",
         "bytime":"2013年4月28日"
       }
     ],
    "totalNum":"9",
    "pn":0,
    "rn":"1"
     }
    }
    

    图书api调用代码XML返回示例:

    <?xml version="1.0" encoding="utf-8" ?> 
    - <root>
      <resultcode>200</resultcode> 
      <reason>Success</reason> 
    - <result>
      - <data>
       - <item>
           <title>向诸葛亮借智慧</title> 
           <catalog>历史 心理学 管理</catalog> 
           <tags>一本好书 三国历史 社会学好书推荐 管理书籍推荐 诸葛亮</tags> 
           <sub1>《向诸葛亮借智慧》</sub1> 
           <sub2>《向诸葛亮借智慧》是中央电视台《百家讲坛》主讲人赵玉平老师编著的一本管理学类图书。作品从管理学和心理学的角度出发,运用人力资源管理和组织行为学的知识,解读了三国睿智军师诸葛亮的一生。本书对三顾茅庐、舌战群儒、赤壁大战、空城计、斩马谡、六出祁山、七擒孟获等与诸葛亮相关的大事件进行了精辟的分析。诸葛亮(公元181年7月23日—234年8月28日),三国时期蜀国丞相,字孔明,号卧龙,琅琊阳都人,是三国时期杰出的政治家、军事家、发明家和文学家。诸葛亮上知天文、下知地理,雄才大略、才华横溢。为匡扶蜀汉政权,他呕心沥血,鞠躬尽瘁,死而后已。唐朝诗人杜甫有诗赞道:“三顾频烦天下计,两朝开济老臣心。出师未捷身先死,长使英雄泪满襟。”,可见诸葛亮受到后世人们极大的尊崇,是后世忠臣的楷模、智慧的化身。《向诸葛亮借智慧》一书是管理学教授赵玉平“麻辣说三国”系列中的一部文学作品。赵玉平老师同易中天教授一起被权威机构评选为“2009中国十大国学专家”,是运用管理学、国学、心理学综合解析《水浒传》、三国历史人物的中国第一人,开辟了运用管理学和心理学解读传统经典的新领域。隆中对策、舌战群儒、草船借箭、七擒孟获……一个个璀璨如明珠的经典故事,成就了诸葛亮无人企及的智慧传奇。但是,孔明先生的智慧究竟从何而来呢?在千百年后的今天,他的卓越智慧又能给今天的我们带来哪些启迪和帮助呢?《向诸葛亮借智慧》一书从一个崭新的角度观察诸葛亮这个重要的历史人物和相关的历史事件,讲故事的同时也分析规律,并结合当今现实生活,古为今用,总结出能够运用于求职、求人、用人、管人等现实生活中的规律和技巧。鲁迅说:“关公之义近乎伪,诸葛之智近乎妖。” 《向诸葛亮借智慧》,哪怕只借到了一点点,也足够让我们的生活过得更轻松、更顺心了。《向诸葛亮借智慧》</sub2> 
           <img>http://apis.juhe.cn/goodbook/img/379cdafe13f92d62e99388182a6d08ec.jpg</img> 
           <reading>8091人阅读</reading> 
           <online>京东商城:http://book.jd.com/10483893.html 当当网:http://product.dangdang.com/product.aspx?product_id=21020821 苏宁易购:http://www.suning.com/emall/prd_10052_22001_-7_1006212_.html</online> 
           <bytime>2013年4月28日</bytime> 
       </item>
      </data>
      <totalNum>9</totalNum> 
      <pn>0</pn> 
      <rn>1</rn> 
      </result>
    

    作者:appjiekou
    来源:CSDN
    原文:https://blog.csdn.net/appjiekou/article/details/49995823
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 数据库及数据库中表等数据库对象的建立实验(包括关系、完整性、权限控制、视图、索引等内容)实验1 SQL Server的安装安装过程展示实验2 设计数据库、创建数据库和数据表实验5 视图实验6 完整性约束实验7 权限管理...

    数据库及数据库中表等数据库对象的建立实验(包括关系图、完整性、权限控制、视图、索引等内容)

    本文最初由security9968发布于security9968的csdn博客,禁止任何形式的剽窃行为
    转载原创文章请注明,转载自:security的博客

    实验1 SQL Server的安装

    • 实验目的
    1. 掌握SQL Server安装的硬件要求和系统要求。
    2. 熟悉SQL Server的安装步骤。
    3. 掌握SQL Server的卸载方法。
    4. 了解SQL Server的主要组件。
    5. 掌握登录和断开数据库服务器的方法。
    • 实验内容
    1. 检查计算机的软、硬件配置(CPU、内存、硬盘和操作系统)是否达到SQL Server的安装要求。
    2. 安装SQL Server
    1. 双击安装软件中的“Setup”程序图标,进入SQL Server安装中心。
    2. 输入有效的产品密钥、接受许可条款,并且安装“程序支持文件”。
    3. 根据需要选择安装组件。
    4. 进行服务器配置,配置服务的账户、启动类型、排序规则等。
    5. 进行数据库引擎配置,配置数据库管理员sa指定的密码。
    6. 进行安装配置规则的设置,确保状态列为“已通过”。
    7. 进入正式安装界面,等待安装进度完毕。
    • 查看“SQL Server Management Studio”“配置工具”和“导入和导出数据”等组件,并掌握其使用方法。
    • 使用运行安装软件的方法或者通过控制面板卸载SQL Server
    • 登录和断开数据库服务器。
    1. 分别使用Windows身份验证方式和SQL Server身份验证方式打开“SQL Server Management Studio”。
    2. 查看“对象资源管理器”是服务器中所有数据库对象的树视图。
    3. 断开与数据库服务器的连接。

    安装过程展示

    选择安装路径正在下载安装包正在安装
    SQL SERVER完成安装,下面安装SSMS(SQL SERVER管理软件)
    安装SSMS中

    实验2 设计数据库、创建数据库和数据表

    • 实验目的
    1. 掌握在SQL Server中使用对象资源管理器和SQL命令创建数据库与修改数据库的方法。
    2. 掌握在SQL Server中使用对象资源管理器或者SQL命令创建数据表和修改数据表的方法(以SQL命令为重点)。
    • 实验内容

    给定如表3.6、表3.7和表3.8所示的学生信息。
    表3.6 学生表
    学号 姓名 性别 专业班级 出生日期 联系电话
    0433 张艳 女 生物04 1986-9-13
    0496 李越 男 电子04 1984-2-23 1381290××××
    0529 赵欣 男 会计05 1984-1-27 1350222××××
    0531 张志国 男 生物05 1986-9-10 1331256××××
    0538 于兰兰 女 生物05 1984-2-20 1331200××××
    0591 王丽丽 女 电子05 1984-3-20 1332080××××
    0592 王海强 男 电子05 1986-11-1
    表3.7 课程表
    课程号 课程名 学分数 学时数 任课教师
    K001 计算机图形学 2.5 40 胡晶晶
    K002 计算机应用基础 3 48 任泉
    K006 数据结构 4 64 马跃先
    M001 政治经济学 4 64 孔繁新
    S001 高等数学 3 48 赵晓尘
    表3.8 学生作业表
    课程号 学号 作业1成绩 作业2成绩 作业3成绩
    K001 0433 60 75 75
    K001 0529 70 70 60
    K001 0531 70 80 80
    K001 0591 80 90 90
    K002 0496 80 80 90
    K002 0529 70 70 85
    K002 0531 80 80 80
    K002 0538 65 75 85
    K002 0592 75 85 85
    K006 0531 80 80 90
    K006 0591 80 80 80
    M001 0496 70 70 80
    M001 0591 65 75 75
    S001 0531 80 80 80
    S001 0538 60 80

    1. 在SQL Server中使用对象资源管理器和SQL命令创建学生作业管理数据库,数据库的名称自定。
    1. 使用对象资源管理器创建数据库,请给出重要步骤的截图。
    2. 删除第(1)步创建的数据库,再次使用SQL命令创建数据库,请给出SQL代码。
    3. 创建数据库之后,如果有需要,可以修改数据库。
    1. 对表3.6,表3.7和表3.8,分别以下表的方式给出各字段的属性定义和说明。

    字段名 数据类型 长度或者精度 默认值 完整性约束 …… …… …… …… …… …… …… ……

    1. 使用SQL命令在学生作业管理数据库中建立学生表、课程表和学生作业表,在实验报告中给出SQL代码。
    2. 在各个表中输入表3.6、表3.7和表3.8中的相应内容。

    SQL语句代码

    --使用SQL语句创建学生作业管理数据库
    Create database 学生作业管理数据库;
    
    
    --使用SQL语句创建表
    use 学生作业管理数据库;
    Create table 学生表(
    	学号 int primary key not null,
    	姓名 nvarchar(20) not null,
    	性别 nchar(1) default '男' not null,
    	专业班级 nvarchar(20) not null,
    	出生日期 nvarchar(20) not null,
    	联系电话 nvarchar(20) not null,
    );
    --修改学生表联系电话可以为空
    alter table 学生表
    alter column 联系电话 nvarchar(20);
    alter table 学生表
    alter column 出生日期 nvarchar(20);
    Create table 课程表(
    	课程号 nvarchar(20) primary key,
    	课程名 nvarchar(20)not null,
    	学分数 int not null,
    	学时数 int not null,
    	任课教师 nvarchar(20) not null,
    );
    alter table 课程表
    alter column 学分数 float;
    create table 学生作业表(
    	课程号 nvarchar(20)  foreign key references 课程表(课程号),
    	学号 int  foreign key references 学生表(学号),
    	作业1成绩 int check (作业1成绩>=0 and 作业1成绩<=100),
    	作业2成绩 int check (作业2成绩>=0 and 作业2成绩<=100) not null,
    	作业3成绩 int check (作业3成绩>=0 and 作业3成绩<=100) not null,
    );
    alter table 学生作业表
    alter column 作业2成绩 int ;
    --插入学生表的数据
    insert into 学生表 (学号,姓名,性别,专业班级,出生日期) 
    	values(0433,'张艳','女','生物04',1986-9-13);
    --上边写错出生日期,进行改正
    update 学生表 set 出生日期='1986-9-13' where 学号=0433;
    --继续插入数据
    insert into 学生表 (学号,姓名,性别,专业班级,出生日期,联系电话) 
    	values(0496,'李越','男','电子04','1984-2-23','1381290××××');
    insert into 学生表 (学号,姓名,性别,专业班级,出生日期,联系电话) 
    	values(0529,'赵欣','男','会计05','1984-1-27','1350222××××');
    insert into 学生表 (学号,姓名,性别,专业班级,出生日期,联系电话) 
    	values(0531	,'张志国','男','生物05','1986-9-10','1331256××××');
    insert into 学生表 (学号,姓名,性别,专业班级,出生日期,联系电话) 
    	values(0538,'于兰兰','女','生物05','1984-2-20',	'1331200××××');
    insert into 学生表 (学号,姓名,性别,专业班级,出生日期,联系电话) 
    	values(0591	,'王丽丽',	'女',	'电子05',	'1984-3-20	','1332080××××');
    insert into 学生表 (学号,姓名,性别,专业班级,出生日期) 
    	values(0592,'王海强','男','电子05','1986-11-1');
    
    
    --查询学生表,查看数据
    select * from 学生表;
    
    --为课程表插入数据
    insert into 课程表(课程号,课程名,学分数,学时数,任课教师) 
    	values ('K001',	'计算机图形学',	2.5,	40,	'胡晶晶');
    insert into 课程表(课程号,课程名,学分数,学时数,任课教师) 
    	values ('K002'	,'计算机应用基础',	3	,48,	'任泉');
    insert into 课程表(课程号,课程名,学分数,学时数,任课教师) 
    	values ('K006',	'数据结构',	4,	64,	'马跃先');
    insert into 课程表(课程号,课程名,学分数,学时数,任课教师) 
    	values ('M001',	'政治经济学',	4	,64	,'孔繁新');
    insert into 课程表(课程号,课程名,学分数,学时数,任课教师) 
    	values ('S001',	'高等数学',	3,	48	,'赵晓尘');
    --查询课程表
    select * from 课程表;
    
    --为学生作业表插入数据
    insert into 学生作业表(课程号,学号,作业1成绩,作业2成绩,作业3成绩)
    	values('K001',0433,	60,	75	,75);
    insert into 学生作业表(课程号,学号,作业1成绩,作业2成绩,作业3成绩)
    	values('K001',	0529	,70,	70,	60);
    insert into 学生作业表(课程号,学号,作业1成绩,作业2成绩,作业3成绩)
    	values('K001',	0531,	70,	80	,80),('K001',	0591,	80,	90,	90);
    select * from 学生作业表;
    --多行插入
    insert into 学生作业表(课程号,学号,作业1成绩,作业2成绩,作业3成绩)
    	values('K002',0496,80,80,90),
    		('K002',0529,70,70,85),
    		('K002',0531,80,80,80),
    		('K002',0538,65,75,85),
    		('K002',0592,75,85,85),
    		('K006',0531,80,80,90),
    		('K006',0591,80,80,80),
    		('M001',0496,70,70,80),
    		('M001',0591,65,75,75),
    		('S001',0531,80,80,80);
    insert into 学生作业表(课程号,学号,作业1成绩,作业3成绩)
    	values('S001',0538,60,80);
    --查询学生作业表
    select * from 学生作业表;
    
    
    
    
    
    --实验2第4问
    select * from 课程表;
    select * from 学生表;
    select * from 学生作业表;
    
    

    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    实验5 视图

    • 实验目的
    1. 掌握创建视图的方法。
    2. 掌握修改视图的方法。
    3. 掌握查询视图的方法。
    4. 掌握更新视图的方法。
    5. 掌握删除视图的方法
    • 实验内容
      根据第一部分实验中创建的学生作业管理数据库以及其中的学生表、课程表和学生作业表,进行以下操作。
    1. 创建一个电子05的学生视图(包括学号、姓名、性别、专业班级、出生日期)。
    2. 创建一个生物05的学生作业情况视图(包括学号、姓名、课程名、作业1成绩、作业2成绩、作业3成绩)。
    3. 创建一个学生作业平均成绩视图(包括学号、作业1平均成绩、作业2平均成绩、作业3平均成绩)。
    4. 修改第2题中生物05的学生作业情况视图,将作业2成绩和作业3成绩去掉。
    5. 向电子05的学生视图中添加一条记录,其中学号为0596,姓名为赵亦,性别为男,专业班级为电子05,出生日期为1986-6-8(除了电子05的学生视图发生变化之外,看看学生表中发生了什么变化?)。
    6. 将电子05的学生视图中赵亦的性别改为“女”(除了电子05的学生视图发生变化之外,看看学生表中发生了什么变化?)。
    7. 删除电子05的学生视图中赵亦的记录。
    8. 删除电子05的学生视图(给出SQL语句即可)。

    SQL语句代码

    --1.创建一个电子05的学生视图(包括学号、姓名、性别、专业班级、出生日期)。
    create view 电子05学生视图
    as
    select 学号,姓名,性别,专业班级,出生日期 from 学生表 where 专业班级='电子05';
    
    --2.创建一个生物05的学生作业情况视图(包括学号、姓名、课程名、作业1成绩、作业2成绩、作业3成绩)。
    
    create view 生物05的学生作业情况
    as
    select  学生作业表.学号,姓名,课程名,作业1成绩,作业2成绩,作业3成绩 from 学生作业表,学生表,课程表
    where 学生作业表.学号=学生表.学号 and 课程表.课程号=学生作业表.课程号 and 学生表.专业班级='生物05';
    
    
    --3.创建一个学生作业平均成绩视图(包括学号、作业1平均成绩、作业2平均成绩、作业3平均成绩)。
    create view 学生作业平均成绩
    as
    select 学号,avg(作业1成绩) as 作业1平均成绩,avg(作业2成绩) as 作业2平均成绩,avg(作业3成绩) as 作业3平均成绩 from 学生作业表
    group by 学号;
    
    --4.修改第2题中生物05的学生作业情况视图,将作业2成绩和作业3成绩去掉。
    create view 生物05的学生作业情况修改 as
    select 学号,姓名,课程名,作业1成绩
    from 生物05的学生作业情况;
    
    --5.向电子05的学生视图中添加一条记录,其中学号为0596,姓名为赵亦,性别为男,专业班级为电子05,出生日期为1986-6-8
    -- (除了电子05的学生视图发生变化之外,看看学生表中发生了什么变化?)。
    
    insert into 电子05学生视图(学号,姓名,性别,专业班级,出生日期) values 
    (0596,'赵亦','男','电子05','1986-6-8');
    
    --查询看一下视图内容
    select * from 电子05学生视图;
    select * from 学生表;
    
    --6.将电子05的学生视图中赵亦的性别改为“女”
    --(除了电子05的学生视图发生变化之外,看看学生表中发生了什么变化?)。
    update 电子05学生视图 set 性别='女' where 姓名='赵亦';
    
    --7.删除电子05的学生视图中赵亦的记录。
    delete from 电子05学生视图
    where 学号=596;
    --8.删除电子05的学生视图(给出SQL语句即可)。
    drop view 电子05学生视图;
    
    

    在这里插入图片描述

    实验6 完整性约束

    针对实验一(学生课程数据库)或实验二(学生课程作业数据库)完成各种完整性约束的定义补充

    SQL语句代码

    --实验6
    /*针对实验一(学生课程数据库)或实验二(学生课程作业数据库)完成各种完整性约束的定义补充
    */
    
    --首先查询一波看有什么字段
    select * from 学生表;
    select * from 课程表;
    select * from 学生作业表;
    --关于学生表
    /*这是添加主键的SQL语句,如果已经有主键则添加不成功
    alter table 学生表
    add constraint py_key1 primary key(姓名);
    */
    /*--这是删除主键约束的SQL语句,如果no active则删除不成功
    alter table 学生表
    drop constraint PK__学生表__1CC396D29329FDB5;
    */
    
    
    --计划将课程表的学时数定义为float 类型
    alter table 课程表
    alter column 学时数  float ;
    
    --将学生作业表中3个作业成绩都定义为float类型,值在0到100 可以为null
    /*
    alter table 学生作业表
    alter column 作业1成绩 float; 
    */
    --出错原因:因为他有一个视图,所以改不成
    /*消息 5074,级别 16,状态 1,第 25 行
    对象'CK__学生作业表__作业1成绩__33D4B598' 依赖于 列'作业1成绩'。
    消息 4922,级别 16,状态 9,第 25 行
    由于一个或多个对象访问此 列,ALTER TABLE ALTER COLUMN 作业1成绩 失败。*/
    

    在这里插入图片描述

    实验7 权限管理

    创建用户、角色,用GRANT语句授权,用REVOKE语句撤销授权,观察对数据库操作时权限控制的情况

    SQL语句代码

    use 学生作业管理数据库;
    --首先把两个表创起来
    create table P155_6_学生
    (
    	学号 int constraint py_key_155_6_学生 primary key,
    	姓名 nvarchar(20),
    	年龄 int constraint check_155 check(年龄>0 and 年龄<120),
    	性别 nchar default '男',
    	家庭住址 nvarchar(20),
    	班级号 nvarchar(20) 
    );
    CREATE TABLE P155_6_班级
    (
    	班级号 int constraint py_key_155_6_班级 primary key,
    	班级名 nvarchar(20),
    	班主任 nvarchar(20),
    	班长 nvarchar(20)
    );
    --创建用户U1、u2
    create login U1 with password='123', default_database=学生作业管理数据库; 
    create user U1  for login U1  with default_schema=dbo;
    
    
    
    --开始授权
    grant select
    on  P155_6_学生
    To U1
    with grant OPTION;
    
    --解除查询授权
    revoke select on P155_6_学生 from U1 cascade;
    
     --删除数据库用户: 
    drop user U1
    --删除 SQL Server登陆帐户:
    drop login U1;
    
    --正式开始
    --先创个U1、U2
    create login U1 with password='123', default_database=学生作业管理数据库; 
    create user U1  for login U1  with default_schema=dbo;
    
    create login U2 with password='123', default_database=学生作业管理数据库; 
    create user	U2  for login U2  with default_schema=dbo;
    
    --开始授权
    --1.授予U1两表所有权限,并可将权限授予他人
    --该语句是错误的,但是还没有找到原因	grant all on  P155_6_班级,P155_6_学生 to U1 ;with grant option;
    exec sp_addrolemember 'db_owner', 'U1';
    --grant all privileges on table P155_6_班级,P155_6_学生 to U1 with grant option;
    
    
    --2.授予U2对学生表具有查看权限,对家庭住址有更新权限
    grant select,update(家庭住址) on  P155_6_学生 to U2;
    
    --3.将对班级表查看权限授予所有用户
    grant select on P155_6_学生 to public;
    
    --4.将对学生表的查询、更新权限授予角色R1
    create login R1 with password='123', default_database=学生作业管理数据库; 
    create user R1 for login R1  with default_schema=dbo;
    grant  select,update on P155_6_学生 to R1;
    
    --5.将角色R1授予用户U1,并且U1可以继续授予其他角色
    --错误,目前还找不到原因	GRANT  R1 TO U1 with admin option;
    
    
    --第7题
    create table P155_7_职工(
    	职工号 int constraint pk_1 primary key,
    	姓名 nvarchar(20),
    	年龄 int constraint ck_1 check(年龄 between 0 and 100),
    	职务 nvarchar(20),
    	工资 float check(工资>0),
    	部门号 int constraint fk_1 foreign key(部门号) references P155_7_部门(部门号)
    );
    create table P155_7_部门(
    	部门号 int constraint pk_2 primary key,
    	名称 nvarchar(20),
    	经理名 nvarchar(20),
    	地址 nvarchar(20),
    	电话号 nvarchar(20)
    );
    
    --1.用户王明对两个表有select权限
    create login 王明 with password='123', default_database=学生作业管理数据库; 
    create user 王明 for login 王明  with default_schema=dbo;
    GRANT select on  P155_7_部门 to 王明;
    GRANT select on  P155_7_职工 to 王明;
    
    --2.用户李勇对两个表有insert和delete权限
    create login 李勇 with password='123',default_database=学生作业管理数据库;
    create user 李勇 for login 李勇 with default_schema=dbo;
    GRANT insert,delete on P155_7_部门 to 李勇;
    GRANT insert,delete on P155_7_职工 to 李勇;
    
    --3.每个职工只对自己的记录有select权限
    	
    
    --4.用户刘星对职工表有select权限,对工资字段有更新权限
    create login 刘星 with password='123',default_database=学生作业管理数据库;
    create user 刘星 for login 刘星 with default_schema=dbo;
    GRANT select,update(工资) on P155_7_职工 to 刘星;
    
    --5.用户张新具有修改这两个表的权限
    create login 张新 with password='123',default_database=学生作业管理数据库;
    create user 张新 for login 张新 with default_schema=dbo;
    GRANT alter on P155_7_部门 to 张新;
    GRANT alter on P155_7_职工 to 张新;
    
    --6.用户周平具有这两个表的所有权限,并可以授权其他用户
    create login 周平 with password='123',default_database=学生作业管理数据库;
    create user 周平 for login 周平 with default_schema=dbo;
    --ALL 权限已不再推荐使用,并且只保留用于兼容性目的。它并不表示对实体定义了 ALL 权限。
    --GRANT all privileges  on P155_7_部门 to 周平 with grant option;
    --GRANT all on P155_7_职工 to 周平 with grant option;
    
    --7.用户杨兰具有从每个部门职工中select最高工资,最低工资,平均工资的权限,他不能查看每个人的工资
    create login 杨兰 with password='123',default_database=学生作业管理数据库;
    create user 杨兰 for login 杨兰 with default_schema=dbo;
    create view P155
    as 
    select 名称,max(工资) as '最高工资',min(工资) as '最低工资',avg(工资) as '平均工资' from P155_7_职工 join
    (select 部门号,名称 from P155_7_部门) as 新命名表 on P155_7_职工.部门号=新命名表.部门号
    group by 名称;
    
    GRANT select on P155 to 杨兰;
    
    

    在这里插入图片描述

    附 创建market表,后续将会使用

    创建market表,其中包含客户表,商品表,订单表

    1. 查找所以上海客户的信息
    2. 查找所有商品的名称、库存量、价格、及折扣25%后的价格,并使用别名“Discount”标识折扣价,结果按价格由低到高排序
    3. 查找商品名中含“Computer”的商品的编号、名称、及价格
    4. 查找库存量大于100小于500的商品的名称、库存量和单价
    5. 查找2007年7月1日至2007年12月31日期间,订货金额大于30000的所有订单的客户姓名、商品名称、单价、单货数量、订货金额

    SQL语句代码

    create database market;
    use market;
    create table Customers(		--客户表
    	CustomerID int constraint pk_1 primary key,   --客户编号为主键
    	Cname nvarchar(20) not null,		--客户姓名
    	City nvarchar(20)		--所在城市
    );
    
    create table Goods(	--商品表
    	GoodID	int constraint pk_2 primary key,	--商品编号为主键 
    	Gname	nvarchar(20) not null,		--商品名称
    	Price	float not null,			--单价
    	Provider	nvarchar(20) not	null,--供应商
    	Stocks	int check(Stocks>=0),			--库存量
    	Status	nvarchar(20)	--商品状态
    );
    
    create table Orders(	--订单表
    	OrderID	 int constraint  pk_3 primary key,	--订单号
    	GoodID	int constraint fk_1 foreign key references Goods(GoodID),	--商品编号
    	CustomerID	int constraint fk_2 foreign key references Customers(CustomerID),--客户编号
    	Quantity	int check(Quantity>0),--订货数量
    	OrderSum	float ,--订货金额
    	Date	nvarchar(20)	--日期
    );
    
    
    --查找所以上海客户的信息
    select * from Customers where City='上海';
    
    --查找所有商品的名称、库存量、价格、及折扣25%后的价格,并使用别名“Discount”标识折扣价,结果按价格由低到高排序
    select Gname,Stocks,Price,Price*0.75 Discount from Goods order by Price asc;
    
    --查找商品名中含“Computer”的商品的编号、名称、及价格
    select GoodID,Gname,Price from Goods where Gname like '%Computer%';
    
    --查找库存量大于100小于500的商品的名称、库存量和单价
    select	Gname,Stocks,Price from Goods where Stocks between 100 and 500;
    
    --查找2007年7月1日至2007年12月31日期间,订货金额大于30000的所有订单的客户姓名、商品名称、单价、单货数量、订货金额
    select Cname,Gname,Price,Quantity,OrderSum 
    	from Customers,Goods,Orders 
    where Customers.CustomerID=Orders.CustomerID and Goods.GoodID=Orders.OrderID and 
    	date between '2007-7-1' and '2007-12-31' and OrderSum>30000;
    
    

    在这里插入图片描述在这里插入图片描述

    本文最初由security9968发布于security9968的csdn博客,禁止任何形式的剽窃行为
    转载原创文章请注明,转载自:security的博客

    展开全文
  • 民用地图经纬度纠偏-高德地图纠偏 发表于:2012年06月20日 13:510 Autonavi,高德地图(google地图、mapabc地图、腾讯的soso地图等,在地图下方有?autonavi.?mapabc 版权信息的)   高德为...

    民用地图经纬度纠偏-高德系地图纠偏

    发表于:2012年06月20日  13:51 0

    Autonavi,高德系地图(google地图、mapabc地图、腾讯的soso地图等,在地图下方有?autonavi.?mapabc 版权信息的)

     

    高德为互联网/移动互联网用户和网站提供互联网地图(Mapabc.com)服务、地图API服务及基础地图服务。目前,MapABC地图网站已经成为中 国知名的地图网站及地图API的窗口。高德同时还为谷歌、腾讯、新浪、阿里巴巴、微软必应、京东商城等著名互联网网站提供基础地图服务支撑。而通过高德提供的地图API服务,已经有包括人人、搜房、赶集、拉手等3万多家互联网网站/移动互联网应用开发者构建起了自己的地图服务解决方案。

     

    上面一段是高德网站原文复制,但绝不是为了打广告。。。。。只是提示有哪些地图是使用了高德的基础地图服务。

     

    根据中国的相关法规,在国内发行的民用地图产品不允许使用真实坐标,必须加入一定偏移(出于国家安全考虑)。由于是相对偏移,并不会影响用户的使用。这种偏移是通过测绘部门的国家保密插件来实现的。

    国家保密插件,也叫做加密插件或者加偏或者SM模组,其实就是对真实坐标系统进行人为地加偏处理,按照几行代码的算法,将真实的坐标加密成虚假的坐标,而这个加偏并不是线性的加偏,所以各地的偏移情况有所不同。

    所有电子地图所有导航设备,都需要加入国家保密插件。第一步,地图公司测绘地图,测绘完成后,送到国家测绘局,将真实坐标的电子地图,加密成“保密坐标“,这样的地图才是可以出版和发布的,然后才可以让GPS公司处理。第二步,所有GPS公司,只要需要汽车导航的,需要用到导航电子地图的,统统需要在软件中加入国家保密算法,将Com口读出来的真实的坐标信号,加密转换成国家要求的保密的坐标,这样,GPS导航仪和导航电子地图就可以完全匹配,GPS也就可以正常工作。

    目前中国的几家互联网地图公司(百度地图、搜狗地图、谷歌地图、Mapbar等)也模仿国家加密的做法,在国家加密的基础上又加入了自己的加密量,目的是防止竞争对手抓取、分析自家的数据。

    地图的偏移算法通常有几种:一种是线性偏移,这种偏移算法容易被破解,使用不多;另一种非线性,在不同的区域,偏移的值和方向各有不通(如偏移字典)。因此破解地图偏移最常见的一种做法是:同名点计算。即知道不同地图上相同点的坐标,再计算这些点坐标之间的差值。这种方法就依赖于同名点数量和分布程度。

     

    上面都是废话,下面给出一网上有一强人破解了地图偏移的方法:

    Google 中国地图偏移接口

    接口地址:http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=39.111195,117.148067(注:.cn和.com都可以,我用国内服务器就会选择.cn用美国服务器就会选择.com)

    返回内容中的有效部分 (39.111195, 117.148067, 18, [9, -2, 18, -4, 37, -8, 74, -16, 149, -33, 298, -67, 596, -135, 1193, -270]),Spn参数暂时未知实际意义,但是需要上发spn参数,任意两个小数用逗号分开Vp参数纬经度值,用逗号分隔,z参数为地图缩放级别,无实际意义

    取回的部分中有效数字为[9, -2, 18, -4, 37, -8, 74, -16, 149, -33, 298, -67, 596, -134, 1192, -268]这个数组总共有8组数字,每两个为一组,分为别从11级到18级的地图和卫星图的偏移像素数量,我们前一组数字精确的等于后一组数字除二,我们为了得到最精确的偏移,故选择第18级的偏移量,1193为x方向上精度的偏移像素,-270为y方向上维度偏移像素

    经纬度的偏移转换,我们需要将经纬度39.111195,117.148067转化为18级像素值25620917 和 55392414,然后分别加上偏移量-270,1193,然后再转化为经纬度39.11231854918217 和117.15446412563324,即位偏移后的经纬度

    (精度指的是当时偏移数据的间隔,而不是每条数据的精度,0.01版本可以达到18级5个像素以内的纠偏精度)

    以上方法经过本人测试,得到的经纬度和GPS仪器的位置完全吻合。不进行纠偏操作,误差范围大概有300-500米。

    低精度版本: (0.1 精度) 适合个人开发(可以免费提供)

    高精度版本: (0.01 精度) 适合商业应用(5米之内,有贴子说精度在1米,有点夸张了,再说GPS技术也有误差(10米))。

    还有说是有纠偏算法的,既然在每个经纬度点的偏移量都不同,而且偏移量的变化也没什么规律,对于这种偏移算法的,我只能心底感慨一下了。

     

    0.01精度的有近1000W条数据。截图为证:

    民用地图经纬度纠偏-高德系地图纠偏

     

    民用地图经纬度纠偏-高德系地图纠偏

    列abcd依次为:LNG*100 LAT* 100 OFFSET_X OFFSET_Y

     

    大家可能疑问,为什么要*100,为什么不直接把偏移经纬度算出来,而是存上偏移像素。我只好告诉大家,112.00是double类型(8字节)。而11200我可以只存int型(4字节)。同理偏移像素都是.0000级别的double了。按照存储算字节数,我想这种存法应该可以节省数据库大小,没准查询速度还快一些。。。。。存储成字符的,实在不推荐。所以说,有时候做的多未必好,呵呵


    转自:http://qing.weibo.com/tj/5f84cd6e33001ntr.html

    展开全文
  • JPEG系列三 JPEG图像压缩

    万次阅读 多人点赞 2017-01-08 16:12:38
    傅里叶是法国著名的数学和物理学,1807年,39岁的傅里叶在他的一篇论文里提出了一个想法,他认为 任何周期性的函数,都可以分解为为一系列的三角函数的组合 ,这个想法一开始并没有得到当时科学界的承认,比如...


    转载自
    http://www.ibm.com/developerworks/cn/linux/l-cn-jpeg/


    JPEG压缩算法之前已有很多前辈详细讲解过,我就不在这里画蛇添足了(主要是我懒。。),转载两篇JPEG压缩算法介绍,拼为一篇。侵删。


    JPEG图像压缩算法

            图片压缩有多重要,可能很多人可能并没有一个直观上的认识,举个例子,一张800X800大小的普通图片,如果未经压缩,大概在1.7MB左右,这个体积如果存放文本文件的话足够保存一部92万字的鸿篇巨著《红楼梦》,现如今互联网上绝大部分图片都使用了JPEG压缩技术,也就是大家使用的jpg文件,通常JPEG文件相对于原始图像,能够得到1/8的压缩比,如此高的压缩率是如何做到的呢?
            JPEG能够获得如此高的压缩比是因为使用了有损压缩技术,所谓有损压缩,就是把原始数据中不重要的部分去掉,以便可以用更小的体积保存,这个原理其实很常见,比如485194.200000000001这个数,如果我们用485194.2来保存,就是一种“有损”的保存方法,因为小数点后面的那个“0.000000000001”属于不重要的部分,所以可以被忽略掉。JPEG整个压缩过程基本上也是遵循这个步骤:
            1. 把数据分为“重要部分”和“不重要部分”
            2. 滤掉不重要的部分
            3. 保存

    步骤一:图像分割


            JPEG算法的第一步,图像被分割成大小为8X8的小块,这些小块在整个压缩过程中都是单独被处理的。后面我们会以一张非常经典的图为例,这张图片名字叫做Lenna,据说是世界上第一张JPG图片,这张图片自从诞生之日开始,就和图像处理结下渊源,陪伴了无数理工宅男度过了的一个个不眠之夜,可谓功勋卓著,感兴趣的朋友可以在 这里了解到这张图片的故事。

    步骤二:颜色空间转换RGB->YCbCr


            所谓“ 颜色空间”,是指表达颜色的数学模型,比如我们常见的“RGB”模型,就是把颜色分解成红绿蓝三种分量,这样一张图片就可以分解成三张灰度图,数学表达上,每一个8X8的图案,可以表达成三个8X8的矩阵,其中的数值的范围一般在[0,255]之间。

    R >
    G >
    B >

            不同的颜色模型各有不同的应用场景,例如RGB模型适合于像显示器这样的自发光图案,而在印刷行业,使用油墨打印,图案的颜色是通过在反射光线时产生的,通常使用CMYK模型,而在JPEG压缩算法中,需要把图案转换成为YCbCr模型,这里的Y表示亮度(Luminance),Cb和Cr分别表示绿色和红色的“色差值”。
            “色差”这个概念起源于电视行业,最早的电视都是黑白的,那时候传输电视信号只需要传输亮度信号,也就是Y信号即可,彩色电视出现之后,人们在Y信号之外增加了两条色差信号以传输颜色信息,这么做的目的是为了兼容黑白电视机,因为黑白电视只需要处理信号中的Y信号即可。
            根据三基色原理,人们发现红绿蓝三种颜色所贡献的亮度是不同的,绿色的“亮度”最大,蓝色最暗,设红色所贡献的亮度的份额为KR,蓝色贡献的份额为KB,那么亮度为

    (1.1)

            根据经验,KR=0.299,KB=0.114,那么

    (1.2)

            蓝色和红色的色差的定义如下

    (1.3)
    (1.4)

            最终可以得到RGB转换为YCbCr的数学公式为

    (1.5)

            YCbCr模型广泛应用在图片和视频的压缩传输中,比如你可以留意一下电视或者DVD后面的接口,就可以发现色差接口。

            这是有道理的,还记得我们在文章开始时提到的有损压缩的基本原理吗?有损压缩首先要做的事情就是“把重要的信息和不重要的信息分开”,YCbCr恰好能做到这一点。对于人眼来说,图像中明暗的变化更容易被感知到,这是由于人眼的构造引起的。视网膜上有两种感光细胞,能够感知亮度变化的视杆细胞,以及能够感知颜色的视锥细胞,由于视杆细胞在数量上远大于视锥细胞,所以我们更容易感知到明暗细节。比如说下面这张图

    Y

    Y

    Cb

    Cb

    Cr

    Cr

            可以明显看到,亮度图的细节更加丰富。JPEG把图像转换为YCbCr之后,就可以针对数据得重要程度的不同做不同的处理。这就是为什么JPEG使用这种颜色空间的原因。


    步骤三:离散余弦变换



            这次我们来介绍JPEG算法中的核心内容,离散余弦变换( Discrete cosine transform ),简称DCT。
            离散余弦变换属于 傅里叶变换 的另外一种形式,没错,就是大名鼎鼎的傅里叶变换。傅里叶是法国著名的数学家和物理学家,1807年,39岁的傅里叶在他的一篇论文里提出了一个想法,他认为 任何周期性的函数,都可以分解为为一系列的三角函数的组合 ,这个想法一开始并没有得到当时科学界的承认,比如当时著名的数学家拉格朗日提出质疑,三角函数无论如何组合,都无法表达带有“尖角”的函数,一直到1822年拉格朗日死后,傅里叶的想法才正式在他的著作《热的解析理论》一书中正式发表。
            金子总会闪光,傅里叶变换如今广泛应用于数学、物理、信号处理等等领域,变换除了它在数学上的意义外,还有其哲学上的伟大意义,那就是,世上任何复杂的事物,都可以分解为简单的事物的组合,而这个过程只需要借助数学工具就可以了。但是当年拉格朗日的质疑是正确的,三角函数的确无法表达出尖角形状的函数,不过只要三角函数足够多,可以无限逼近最终结果。比如下面这张动图,就动态描述了一个矩形方波,是如何做傅里叶分析的。

            当我们要处理的不再是函数,而是一堆离散的数据时,并且这些数据是对称的话,那么傅里叶变化出来的函数只含有余弦项,这种变换称为离散余弦变换。举个例子,有一组一维数据[x0,x1,x2,…,xn-1],那么可以通过DCT变换得到n个变换级数Fi

    (2.1)

            此时原始数据Xi可以通过离散余弦变换变化的逆变换(IDCT)表达出来

    (2.2)

            也就是说,经过DCT变换,可以把一个数组分解成数个数组的和,如果我们数组视为一个一维矩阵,那么可以把结果看做是一系列矩阵的和

    (2.3)


            举个例子,我们有一个长度为8的数字,内容为50,55,67,80,-10,-5,20,30,经过DCT转换,得到8个级数为287.0,106.3,14.2,-110.8,9.2,65.7,-8.2,-43.9,根据公式2.3把这个数组转换为8个新的数组的和,如果我们使用图像来表达的话,就可以发现DCT转换的有趣之处了


    [50,55,67,80,-10,-5,20,30]
       
      数组0
        [35.9,35.9,35.9,35.9,35.9,35.9,35.9,35.9]
      数组1
        [26.0,22.1,14.8,5.2,-5.2,-14.8,-22.1,-26.1]
      数组2
        [3.3,1.4,-1.4,-3.3,-3.3,-1.4,1.4,3.3]
      数组3
        [-23.0,5.4,27.2,15.4,-15.4,-27.2,-5.4,23.0]
      数组4
        [1.6,-1.6,-1.6,1.6,1.6,-1.6,-1.6,1.6]
      数组5
        [9.1,-16.1,3.2,13.6,-13.6,-3.2,16.1,-9.1]
      数组6
        [-0.8,1.9,-1.9,0.8,0.8,-1.9,1.9,-0.8]
      数组7
        [-2.1,6.1,-9.1,10.8,-10.8,9.1,-6.1,2.1]

            奥妙之处在于,经过DCT,数据中隐藏的规律被发掘了出来,杂乱的数据被转换成几个工整变化的数据。DCT转换后的数组中第一个是一个直线数据,因此又被称为“直流数据”,简称DC,后面的数据被称为“交流数据”,简称AC,这个称呼起源于信号分析中的术语。
            在JPEG压缩过程中,经过颜色空间的转换,每一个8X8的图像块,在数据上表现为3个8X8的矩阵,紧接着我们对这三个矩阵做一个二维的DCT转换,二维的DCT转换公式为

    (2.1)

            DCT的威力究竟有多大,我们可以做一个实际的测试,比如一个所有数值都一样的矩阵,经过DCT转换后,将所有级数组合成一个新的矩阵

     

            可以看到,经过DCT转换,矩阵的“能量”被全部集中在左上角上的直流分量F(0,0)上,其他位置都变成了0。
            在实际的JPEG压缩过程中,由于图像本身的连贯性,一个8X8的图像中的数值一般不会出现大的跳跃,经过DCT转换会有类似的效果,左上角的直流分量保存了一个大的数值,其他分量都接近于0,我们以Lenna左上角第一块图像的Y分量为例,经过变换的矩阵为

     

            可以看到,数据经过DCT变化后,被明显分成了直流分量和交流分量两部分,为后面的进一步压缩起到了充分的铺垫作用,可以说是整个JPEG中最重要的一步,后面我们会介绍数据量化。


    步骤四:数据量化


            经过上一节介绍的离散余弦变换,图像数据虽然已经面目全非,但仍然是处于“可逆”的状态,也就是说我们还没有进入“有损”的那一步。这次我们来玩真的,看一下数据中的细节是如何被滤去的。先来考察一下要对付的问题是什么,经过颜色空间转换和离散余弦变换,每一个8X8的图像块都变成了三个8X8的浮点数矩阵,分别表示Y,Cr,Cb数据,比如以其中某个亮度数据矩阵举例,它的数据如下

            我们的问题是,在可以损失一部分精度的情况下,如何用更少的空间存储这些浮点数?答案是使用量子化( Quantization ),简称量化。“量子”这个概念来自于物理学,意思是说连续的能量可以看做是一个个单元体的组合,看起来高端大气,其实很简单,比如游戏中在处理角色面朝方向时,一般并不是使用0到2π这样的浮点数,而是把方向分成16个区间,用0到16这样的整数来表示,这样只用4个bit就足够了。JPEG提供的量子化算法如下:

    (3.1)

            其中G是我们需要处理的图像矩阵,Q称作量化系数矩阵(Quantization matrices),JPEG算法提供了两张标准的量化系数矩阵,分别用于处理亮度数据Y和色差数据Cr以及Cb。

    标准亮度量化表

    标准亮度量化表

    标准色差量化表

    标准色差量化表


            其中round函数是取整函数,但考虑到了四舍五入,也就是说

    (3.2)

            比如上面数据,以左上角的-415.38为例,对应的量子化系数是16,那么round(-415.38/16)=round(-25.96125)=-26。最终得到的量子化后的结果为

            可以看到,一大部分数据变成了0,这非常有利于后面的压缩存储。这两张神奇的量化表也是有讲究的,还记得我们在第一节中所讲的有损压缩的基本原理吗,有损压缩就是把数据中重要的数据和不重要的数据分开,然后分别处理。DCT系数矩阵中的不同位置的值代表了图像数据中不同频率的分量,这两张表中的数据时人们根据人眼对不不同频率的敏感程度的差别所积累下的经验制定的,一般来说人眼对于低频的分量必高频分量更加敏感,所以两张量化系数矩阵左上角的数值明显小于右下角区域。在实际的压缩过程中,还可以根据需要在这些系数的基础上再乘以一个系数,以使更多或更少的数据变成0,我们平时使用的图像处理软件在省城jpg文件时,在控制压缩质量的时候,就是控制的这个系数。
            在进入下一节之前,矩阵的量化还有最后一步要做,就是把量化后的二维矩阵转变成一个一维数组,以方便后面的霍夫曼压缩,但在做这个顺序转换时,需要按照一个特定的取值顺序。

            这么做的目的只有一个,就是尽可能把0放在一起,由于0大部分集中在右下角,所以才去这种由左上角到右下角的顺序,经过这种顺序变换,最终矩阵变成一个整数数组

    -26,-3,0,-3,-2,-6,2,-4,1,-3,0,1,5,,1,2,-1,1,-1,2,0,0,0,0,0,-1,-1,0,0,0,0,…,0,0

            后面的工作就是对这个数组进行再一次的哈夫曼压缩,已得到最终的压缩数据。


    步骤五:哈弗曼编码


            JPEG压缩的最后一步是对数据进行哈弗曼编码( Huffman coding ),哈弗曼几乎是所有压缩算法的基础,它的基本原理是根据数据中元素的使用频率,调整元素的编码长度,以得到更高的压缩比。
            举个例子,比如下面这段数据

    “AABCBABBCDBBDDBAABDBBDABBBBDDEDBD”

            这段数据里面包含了33个字符,每种字符出现的次数统计如下

    字符 A B C D E
    次数 6 15 2 9 1

            如果我们用我们常见的定长编码,每个字符都是3个bit。

    字符 A B C D E
    编码 001 010 011 100 101

            那么这段文字共需要3*33 = 99个bit来保存,但如果我们根据字符出现的概率,使用如下的编码

    字符 A B C D E
    编码 110 0 1110 10 1111

            那么这段文字共需要3*6 + 1*15 + 4*2 + 2*9 + 4*1 = 63个bit来保存,压缩比为63%,哈弗曼编码一般都是使用二叉树来生成的,这样得到的编码符合前缀规则,也就是较短的编码不能够是较长编码的前缀,比如上面这个编码,就是由下面的这颗二叉树生成的。

            我们回到JPEG压缩上,回顾上一节的内容,经过数据量化,我们现在要处理的数据是一串一维数组,举例如下:

    ①原始数据
    35,7,0,0,0,-6,-2,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,…,0

            在实际的压缩过程中,数据中的0出现的概率非常高,所以首先要做的事情,是对其中的0进行处理,把数据中的非零的数据,以及数据前面0的个数作为一个处理单元。

    ①原始数据
    35,7,0,0,0,-6,-2,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,…,0
    ②RLE编码 35 7 0,0,0,-6 -2 0,0,-9 0,0,…,0,8 0,0,…,0

            如果其中某个单元的0的个数超过16,则需要分成每16个一组,如果最后一个单元全都是0,则使用特殊字符“EOB”表示,EOB意思就是“后面的数据全都是0”,

    ①原始数据
    35,7,0,0,0,-6,-2,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,…,0
    ②RLE编码 35 7 0,0,0,-6 -2 0,0,-9 0,0,…,0,8 0,0,…,0
    35 7 0,0,0,-6 -2 0,0,-9 0,0,…,0 0,0,8 0,0,…,0
    (0,35) (0,7) (3,-6) (0,-2) (2,-9) (15,0) (2,8) EOB

           * RLE - Run-Length Encoding,即行程编码,对于连续重复出现的字符有很好的压缩率。编码后为(字符出现次数,字符)。

           * JPEG 中实际使用的是(字符出现次数 - 1,字符)


            其中(15,0)表示16个0,接下来我们要处理的是括号里右面的数字,这个数字的取值范围在-2047~2047之间,JPEG提供了一张标准的码表用于对这些数字编码:

    Value Size Bits
    0 0
    -1 1 1 0 1
    -3,-2 2,3 2 00,01 10,11
    -7,-6,-5,-4 4,5,6,7 3 000,001,010,011 100,101,110,111
    -15,…,-8 8,…,15 4 0000,…,0111 1000,…,1111
    -31,…,-16 16,…,31 5 0 0000,…,0 1111 1 0000,…,1 1111
    -63,…,-32 32,…,63 6 00 0000,… …,11 1111
    -127,…,-64 64,…,127 7 000 0000,… …,111 1111
    -255,…,-128 128,…,255 8 0000 0000,… …,1111 1111
    -511,…,-256 256,…,511 9 0 0000 0000,… …,1 1111 1111
    -1023,…,-512 512,…,1023 10 00 0000 0000,… …,11 1111 1111
    -2047,…,-1024 1024,…,2047 11 000 0000 0000,… …,111 1111 1111

            举例来说,第一个单元中的“35”这个数字,在表中的位置是长度为6的那组,所对应的bit码是“100011”,而“-6”的编码是”001″,由于这种编码附带长度信息,所以我们的数据变成了如下的格式。

    ①原始数据
    35,7,0,0,0,-6,-2,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,…,0
    ②RLE编码 35 7 0,0,0,-6 -2 0,0,-9 0,0,…,0,8 0,0,…,0
    35 7 0,0,0,-6 -2 0,0,-9 0,0,…,0 0,0,8 0,0,…,0
    (0,35) (0,7) (3,-6) (0,-2) (2,-9) (15,0) (2,8) EOB
    ③BIT编码 (0,6, 100011) (0,3, 111) (3,3, 001) (0,2, 01) (2,4, 0110) (15,-) (2,4, 1000) EOB

            括号中前两个数字分都在0~15之间,所以这两个数可以合并成一个byte,高四位是前面0的个数,后四位是后面数字的位数。

    ①原始数据
    35,7,0,0,0,-6,-2,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,…,0
    ②RLE编码 35 7 0,0,0,-6 -2 0,0,-9 0,0,…,0,8 0,0,…,0
    35 7 0,0,0,-6 -2 0,0,-9 0,0,…,0 0,0,8 0,0,…,0
    (0,35) (0,7) (3,-6) (0,-2) (2,-9) (15,0) (2,8) EOB
    ③BIT编码 (0,6, 100011) (0,3, 111) (3,3, 001) (0,2, 01) (2,4, 0110) (15,-) (2,4, 1000) EOB
    (0x6,100011) (0x3,111) (0x33,001) (0x2,01) (0x24,0110) (0xF0,-) (0x24,1000) EOB

            对于括号前面的数字的编码,就要使用到我们提到的哈弗曼编码了,比如下面这张表,就是一张针对数据中的第一个单元,也就是直流(DC)部分的哈弗曼表,由于直流部分没有前置的0,所以取值范围在0~15之间。

    Length Value Bits
    3 bits 04
    05
    03
    02
    06
    01
    00 (EOB)
    000
    001
    010
    011
    100
    101
    110
    4 bits 07 1110
    5 bits 08 1111 0
    6 bits 09 1111 10
    7 bits 0A 1111 110
    8 bits 0B 1111 1110

            举例来说,示例中的DC部分的数据是0x06,对应的二进制编码是“100”,而对于后面的交流部分,取值范围在0~255之间,所以对应的哈弗曼表会更大一些

    Length Value Bits
    2 bits 01
    02
    00
    01
    3 bits 03 100
    4 bits 00 (EOB)
    04
    11
    1010
    1011
    1100
    5 bits 05
    12
    21
    1101 0
    1101 1
    1110 0
    6 bits 31
    41
    1110 10
    1110 11
    12 bits 24
    33
    62
    72
    1111 1111 0100
    1111 1111 0101
    1111 1111 0110
    1111 1111 0111
    15 bits 82 1111 1111 1000 000
    16 bits 09

    FA
    1111 1111 1000 0010

    1111 1111 1111 1110

            这样经过哈弗曼编码,并且序列化后,最终数据成为如下形式

    ①原始数据
    35,7,0,0,0,-6,-2,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,…,0
    ②RLE编码 35 7 0,0,0,-6 -2 0,0,-9 0,0,…,0,8 0,0,…,0
    35 7 0,0,0,-6 -2 0,0,-9 0,0,…,0 0,0,8 0,0,…,0
    (0,35) (0,7) (3,-6) (0,-2) (2,-9) (15,0) (2,8) EOB
    ③BIT编码 (0,6, 100011) (0,3, 111) (3,3, 001) (0,2, 01) (2,4, 0110) (15,-) (2,4, 1000) EOB
    (0x6,100011) (0x3,111) (0x33,001) (0x2,01) (0x24,0110) 0xF0 (0x24,1000) EOB
    ④哈弗曼编码 100 100011 100 111 1111 1111 0101 001 01 01 1111 1111 0100 0110 1111 1111 001 1111 1111 0100 1000 1010
    ⑤序列化
    100100011100111111111110101001010111111111010001101111111100111111111010010001010
    91 CF FE A5 7F D1 BF CF FA 45

            最终我们使用了10个字节的空间保存了原本长度为64的数组,至此JPEG的主要压缩算法结束,这些数据就是保存在jpg文件中的最终数据。


    一个JPEG图片实例分析


    我们可以打开 JPEG 文件查看里面的内容,即可看到上面的各个标记段:


    在头部有 FFD8 ,表示图像的开始;结束部分有 FFD9 ,表示图像的结束。

    在中间有两个量化表 DQT 对应的标记 FFDB ;

    还有图像大小信息对应的 FFC0

    再后面有四个 Haffman 表对应的 FFC4 ;


    一般一个 JPEG 文件里会有 2 类 Haffman 表:一个用于 DC 一个用于 AC ,也即实际有 4个表,亮度的 DC,AC 两个,色度的 DC,AC 两个。

    然后是图像数据段标记 FFDA;


    我们再来看看各个标记的细部,具体分析一下各个部分的含义。

    1、图片的识别信息

    上面的内容,在标记 FFE0 后,即为长度16。

    然后是5字节的 JFIF 标识符号,说明这是一个 JPEG 压缩的文件。

    然后是主/次版本号码。下一个为 XY 像素的单位,这里为1,表示单位为点数/英寸。

    然后是 XY 方向的像素密度,这里是 96DPI,最后是缩略图有关信息,这里为0。


    2、量化表的实例

    上面这个内容,FFDB 标记后的长度值为67,接下来的是 QT 信息,占一个字节;

    这里是0,表示这个 QT 表编号为0,并且精度是8bit。然后后面就是64个8x8的 QT 表的各个 item 了。

    也即第一个 DQT 量化表的内容表示为十进制是:

    这个表即为 JPEG 亮度量化表。


    第二个量化表的内容为:

    这个表的内容即为 JPEG 色度量化表。

    当你打开不同的 JPEG 文件,你会看到这两个表可能也是会有区别的。这个主要是使用了不同的量化方式的结果。


    3、图像信息段

    上面这个内容,FFC0 标记后即是长度,为17;

    然后是一个字节的数据精度,通常是为8,代表样本位数。

    接下来是图片的高度,占两字节,这里即为8,然后是图片的宽度,也为8,这也就是我们定义的8x8的内容。

    然后是 component 的个数,这里是3,表示 YUV。接下来是三组数据,每组数据里,第一个是 component ID,第二个是采样系数,这里 Y 的采样系数为22,说明垂直是2,水平是2。

    再后面就是量化表的编号了。


    4、Haffman 表的实例

    上面这个内容,FFC4 标记后的内容为数据长度,再接着的1字节为 Huffman Table 的信息,低4位是 HT ID 号,第5位是 HT 表类型标记,再高三位是为0。

    第一个 DHT 表,00,类型为 DC table,HT ID 号为 0;

    第二个 DHT 表,10,类型为 AC table,HT ID 号也为 0;

    第三个 DHT 表,01,类型为 DC table,HT ID 号为 1;

    第四个 DHT 表,11,类型为 AC table,HT ID 号为 1;

    即前两个表为Y亮度分量的 DC/AC 表,后两个为 UV 色度分量的 DC/AC 表。


    以第一个表为例,因为长度只有 31,那么 00 后面的 16 字节,即绿色部分:

    组号为 1 的组中,代码有 0 个;

    组号为 2 的,代码有 1 个;

    组号为 3 的代码有 5 个;

    组号为 4/5/6/7/8/9 的代码各 1 个。

    总共 12 个。

    再看后续的数据:

    00 01 02 03 04 05 06 07 08 09 0A 0B

    即对应:

    其他未出现的组号,对应的数据未使用到。也就是说前面提到过的范式 Huffman 编码里,目前只使用部分数据即可,原因是这个 8x8 的图像数据很小。

    第二个 DHT 表就更复杂些了,长度有 181。


    5、图像数据段

    这里 SOS 段,长度为 12,后面所含有的 component 数量为 3 个,也即 Y UV。然后后面是各 component 的编号,及对应所使用的 Huffman 表的 ID 是多少。

    在这个段的后面就是所有压缩后的数据。直到结束的问题,即 FFD9,EOI(End Of Image)。



    转载自:

    http://thecodeway.com/blog/

    http://www.ibm.com/developerworks/cn/linux/l-cn-jpeg/






    展开全文
  • 深入理解Android系列书籍的规划路线

    万次阅读 热门讨论 2012-06-09 21:23:34
    深入理解Android系列书籍的规划路线一 Roadmap“深入理解Android“书籍从卷I推出以后就受到广大读者的喜爱。在和读者交流的过程中,笔者被问及最多的一个问题就是,卷II什么时候推出?内容会是什么?实际上,笔者...
  • 之前的分类总结点此,其中所有的知识点都包含在这个里面更多内容请选择以下入口 关于代码(干货集中营)共享知识点汇总系列——Android 关于代码(干货集中营)共享知识点汇总系列——IOS 关于代码(干货集中营...
  • 为证,哈哈。 上一篇文章【Android开发—智能家居系列】(一):智能家居原理 的文末总结中写到: 手机APP控制智能温控器就两步:一是通过手机,让WIFI模块接入网络,而是通过网络,使用手机对模块发送...
  • 机器学习系列(7)_机器学习路线(附资料)

    万次阅读 多人点赞 2016-02-28 11:54:10
    这里的抽象成数学问题,指的我们明确我们可以获得什么样的数据,目标是一个分类还是回归或者是聚类的问题,如果都不是的话,如果划归为其中的某类问题。 3.4.2 获取数据 数据决定了机器学习结果的上限...
  • 机器学习系列(7)_机器学习路线(附资料)

    万次阅读 多人点赞 2016-02-28 11:55:21
    也习惯逛淘宝点了找相似之后货比三;亦或喜闻乐见微软的年龄识别网站结果刷爆朋友圈。恩,这些功能的核心算法就是机器学习领域的内容。 机器学习研究的是计算机怎样模拟人类的学习行为,以获取新的知识或技能,并...
  • 依次有:物体坐标,世界坐标,相机坐标,投影坐标以及屏幕坐标.我要讨论的就是这些坐标间的转换。 这些坐标不是凭空而来,他们都是为了完成计算机3D图形学最最最基本的目标而出现.计算机3D
  • 坐标和投影 知识的内容介绍

    千次阅读 2016-04-05 13:40:22
    首先想到的便是坐标和投影,我想这个东西困扰着80%以上的测绘、遥感和GIS领域的从业人员吧,群里经常有人问,我自己曾经也很迷糊,什么大地坐标啊、地心坐标啊、高斯投影啊、UTM投影啊,搞得头都大了,可是这...
  • Android LBS地图开发基础知识之地球地理GPS坐标经纬度偏移偏差  通常,我们所说的地球地理经纬度是WGS-84坐标(World Geodetic System-1984 Coordinate System)的经纬度。WGS-84坐标是在1984年制定的全球...
  • STM32入门系列-学习STM32要掌握的内容

    千次阅读 多人点赞 2019-05-30 17:11:54
    STM32芯片架构 STM32F103系列芯片的系统架构如下: STM32芯片基于ARM公司的Cortex-M3内核,...而外设包括GPIO、USART、I2C、SPI等。 STM32芯片系统结构 STM32F103 系列芯片(不包含互联网型)的系统结构如下: 从...
  • 本专栏是以杨秀璋老师爬虫著作《Python网络数据爬取及分析「从入门到精通」》为主线、个人学习理解为主要内容,以学习笔记形式编写的。 本专栏不光是自己的一个学习分享,也希望能给您普及一些关于爬虫的相关知识...
  • BAT机器学习面试1000题系列

    万次阅读 多人点赞 2017-12-14 15:19:15
    1、本文的内容全部来源于七月在线发布的BAT机器学习面试1000题系列; 2、文章中带斜体的文字代表是本人自己增加的内容,如有错误还请批评指正; 3、原文中有部分链接已经失效,故而本人重新加上了新的链接,如有...
  • 在做经管主网页的同时也在进行着中文主网页的构建,果然是只有自己去实践了,才能遇到各种各样的问 题,然后再去寻找解决这些问题的方法,最后进行修改和不断的调试,最后达到自己想要的效果。中文主网页构建...
  • 机器学习系列_机器学习路线(附资料)

    千次阅读 多人点赞 2018-06-26 16:00:37
    并不是每个项目都包含完整的一个流程。 这里的部分只是一个指导性的说明,只有大家自己多实践,多积累项目经验,才会有自己更深刻的认识。 3.5 关于积累项目经验 初学机器学习可能有一个误区,就是一上来就陷入到对...
  • 本文主要包括如下内容: 程序员职位要求 CS 专业课程列表 怎样寻找资源学习? 程序员高薪排行榜 程序员职位要求 看课程之前,我们先来看看 BAT 的招聘岗位 JD: 新零售技术事业群-java开发-淘技术部 ...
  • 淘宝躺平频道是手机淘宝内主推家居类商品的内容场景化导购平台(以下简称躺平)。频道中的内容主要以场景搭配为主,内容内挂载了多个商品锚点,点击商品锚点可以跳转到商品详情页。躺平强调算法大数据搭...
  • BAT机器学习面试1000题系列(第1~305题)

    万次阅读 多人点赞 2017-09-28 11:37:49
    此外,这里有个视频也是关于SVM的推导:《纯白板手推SVM》 2 请简要介绍下tensorflow的计算,深度学习 DL框架 中 @寒小阳&AntZ:Tensorflow是一个通过计算的形式来表述计算的编程系统,计算也叫数据流,可以...
  • 注:这篇功能是转载超能网的网络记事本和网友赵为民的群晖DSM Surveillance Station体验,我将这些功能收集到一起,便于大家查找. ...Note Station能够让用户充分享受写作、观看、编辑并分型内容的便签。
  • ▐ 多样性指标 除了效率指标外,我们观察发现对于推荐的多样性指标也有所提升,风格和场景为频道内场景化内容的两个属性,风格包括北欧,中式,现代等,场景包括客厅,卧室,书房等: 短期行为的引入对于多样性的...
  • 文章内容我复制过来如下: 先解压线刷包(解包出现R11_A.01_170529.zip再解包,出现R11_A.01_170529(无后缀),加后缀.zip,解包就看到ofp文件即可) 然后打开线刷工具:会弹出对话框,按项目代号选择自己的...
  • 2021DIY电脑配置入门篇(包含各cpu显卡天梯对比)

    千次阅读 多人点赞 2021-06-19 09:45:55
    显卡现在有两在做:NVIDIA(N卡)和AMD(A卡) NVIDIA:RTX3090系列是最新款 RTX和GTX的区别是RTX支持光线追踪,产品定位代表了产品实力,比如RTX2070就高于RTX2060。而后缀则代表了不同版本的意思,比如Super...
  • 从世界坐标到相机坐标

    千次阅读 2018-01-07 14:40:18
    依次有:物体坐标,世界坐标,相机坐标,投影坐标以及屏幕坐标.我要讨论的就是这些坐标间的转换。 这些坐标不是凭空而来,他们都是为了完成计算机3D图形学最最最基本的目标而出现.计算机3D图形学最...
  • Arcgis 投影坐标转换为地理坐标

    千次阅读 2020-03-11 21:38:17
    Arcgis 投影坐标转换为地理坐标 问题说明 今天,一个妹子问我怎么把投影坐标转换为地理坐标。 说实话,这个问题我不会,而且当时没在电脑旁,匆匆用手机查了一下,找到一个转换坐标注记法。当然这个办法是不对的...
  • 极坐标 维基百科,自由的百科全书 跳转到: 导航, 搜索 在极点为O、极轴为L的极作标里,点 的径向坐标为3、角坐标为60°,点 的径向坐标为4、角坐标为210°。 在数学中,极坐标...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 97,093
精华内容 38,837
关键字:

家系图包括什么内容