Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
B
beijing-vehicleflow
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zhangzhenbang
beijing-vehicleflow
Commits
9832278f
Commit
9832278f
authored
Feb 23, 2020
by
zhangzhenbang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
初始化
parent
faf20d54
Pipeline
#141
canceled with stages
Changes
11
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
830 additions
and
0 deletions
+830
-0
pom.xml
pom.xml
+5
-0
RestConfig.java
...ava/com/yingxin/beijingvehicleflow/config/RestConfig.java
+98
-0
ReservationController.java
.../beijingvehicleflow/controller/ReservationController.java
+18
-0
FloatingPopulation.java
...yingxin/beijingvehicleflow/entity/FloatingPopulation.java
+24
-0
IdentityInformation.java
...ingxin/beijingvehicleflow/entity/IdentityInformation.java
+24
-0
Reservation.java
...va/com/yingxin/beijingvehicleflow/entity/Reservation.java
+27
-0
FloatingPopulationMapper.java
...n/beijingvehicleflow/mapper/FloatingPopulationMapper.java
+11
-0
IdentityInformationMapper.java
.../beijingvehicleflow/mapper/IdentityInformationMapper.java
+11
-0
ReservationMapper.java
.../yingxin/beijingvehicleflow/mapper/ReservationMapper.java
+11
-0
IdCardUtil.java
.../java/com/yingxin/beijingvehicleflow/util/IdCardUtil.java
+430
-0
PicUtils.java
...in/java/com/yingxin/beijingvehicleflow/util/PicUtils.java
+171
-0
No files found.
pom.xml
View file @
9832278f
...
...
@@ -107,6 +107,11 @@
<version>
1.2.12
</version>
</dependency>
<dependency>
<groupId>
org.projectlombok
</groupId>
<artifactId>
lombok
</artifactId>
</dependency>
</dependencies>
<build>
...
...
src/main/java/com/yingxin/beijingvehicleflow/config/RestConfig.java
0 → 100644
View file @
9832278f
package
com
.
yingxin
.
beijingvehicleflow
.
config
;
import
org.apache.http.conn.HttpClientConnectionManager
;
import
org.apache.http.impl.client.HttpClientBuilder
;
import
org.apache.http.impl.conn.PoolingHttpClientConnectionManager
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.web.client.RestTemplateBuilder
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.http.client.ClientHttpRequestFactory
;
import
org.springframework.http.client.HttpComponentsClientHttpRequestFactory
;
import
org.springframework.web.client.RestTemplate
;
/**
* 远程HTTP配置
*
* @author gaozhentao
* @version 1.0
* @date 2020/2/12
*/
@Configuration
public
class
RestConfig
{
@Value
(
"${restTemplate.connect-config.connectTimeout}"
)
private
int
connectTimeout
;
@Value
(
"${restTemplate.connect-config.readTimeout}"
)
private
int
readTimeout
;
@Value
(
"${restTemplate.connect-config.connectionRequestTimeout}"
)
private
int
connectionRequestTimeout
;
@Value
(
"${restTemplate.connect-pool.maxTotal}"
)
private
int
maxTotal
;
@Value
(
"${restTemplate.connect-pool.defaultMaxPerRoute}"
)
private
int
defaultMaxPerRoute
;
@Value
(
"${restTemplate.connect-pool.validateAfterInactivity}"
)
private
int
validateAfterInactivity
;
/**
* 让spring管理RestTemplate,参数相关配置
*
* @param builder
* @return
*/
@Bean
public
RestTemplate
restTemplate
(
RestTemplateBuilder
builder
)
{
RestTemplate
restTemplate
=
builder
.
build
();
restTemplate
.
setRequestFactory
(
clientHttpRequestFactory
());
return
restTemplate
;
}
/**
* 客户端请求链接策略
*
* @return
*/
@Bean
public
ClientHttpRequestFactory
clientHttpRequestFactory
()
{
HttpComponentsClientHttpRequestFactory
clientHttpRequestFactory
=
new
HttpComponentsClientHttpRequestFactory
();
clientHttpRequestFactory
.
setHttpClient
(
httpClientBuilder
().
build
());
clientHttpRequestFactory
.
setConnectTimeout
(
connectTimeout
);
clientHttpRequestFactory
.
setReadTimeout
(
readTimeout
);
clientHttpRequestFactory
.
setConnectionRequestTimeout
(
connectionRequestTimeout
);
return
clientHttpRequestFactory
;
}
/**
* 设置HTTP连接管理器,连接池相关配置管理
*
* @return 客户端链接管理器
*/
@Bean
public
HttpClientBuilder
httpClientBuilder
()
{
HttpClientBuilder
httpClientBuilder
=
HttpClientBuilder
.
create
();
httpClientBuilder
.
setConnectionManager
(
poolingConnectionManager
());
return
httpClientBuilder
;
}
/**
* 链接线程池管理,可以keep-alive不断开链接请求,这样速度会更快 MaxTotal 连接池最大连接数 DefaultMaxPerRoute
* 每个主机的并发 ValidateAfterInactivity
* 可用空闲连接过期时间,重用空闲连接时会先检查是否空闲时间超过这个时间,如果超过,释放socket重新建立
*
* @return
*/
@Bean
public
HttpClientConnectionManager
poolingConnectionManager
()
{
PoolingHttpClientConnectionManager
poolingConnectionManager
=
new
PoolingHttpClientConnectionManager
();
poolingConnectionManager
.
setMaxTotal
(
maxTotal
);
poolingConnectionManager
.
setDefaultMaxPerRoute
(
defaultMaxPerRoute
);
poolingConnectionManager
.
setValidateAfterInactivity
(
validateAfterInactivity
);
return
poolingConnectionManager
;
}
}
src/main/java/com/yingxin/beijingvehicleflow/controller/ReservationController.java
0 → 100644
View file @
9832278f
package
com
.
yingxin
.
beijingvehicleflow
.
controller
;
import
org.springframework.web.bind.annotation.CrossOrigin
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
/**
* description //TODO
*
* @author 226
* @version 1.0
* @date 2020/2/23
*/
@RestController
@CrossOrigin
@RequestMapping
(
"/api/v1"
)
public
class
ReservationController
{
}
src/main/java/com/yingxin/beijingvehicleflow/entity/FloatingPopulation.java
0 → 100644
View file @
9832278f
package
com
.
yingxin
.
beijingvehicleflow
.
entity
;
import
lombok.Data
;
/**
* 数据库floating_population表对应实体类
*
* @author 226
* @version 1.0
* @date 2020/2/23
*/
@Data
public
class
FloatingPopulation
{
private
int
id
;
private
String
checkCoordinate
;
private
String
checkTime
;
private
String
submitCoordinate
;
private
String
submitTime
;
private
String
authCoordinate
;
private
String
authTime
;
private
int
workerId
;
private
int
reservationId
;
}
src/main/java/com/yingxin/beijingvehicleflow/entity/IdentityInformation.java
0 → 100644
View file @
9832278f
package
com
.
yingxin
.
beijingvehicleflow
.
entity
;
import
lombok.Data
;
/**
* 数据库identity_information表对应实体类
*
* @author 226
* @version 1.0
* @date 2020/2/23
*/
@Data
public
class
IdentityInformation
{
private
int
id
;
private
String
name
;
private
String
idCardNumber
;
private
String
phoneNumber
;
private
String
faceImage
;
private
String
wechatPhone
;
private
String
wechat_openid
;
private
boolean
isWorker
;
}
src/main/java/com/yingxin/beijingvehicleflow/entity/Reservation.java
0 → 100644
View file @
9832278f
package
com
.
yingxin
.
beijingvehicleflow
.
entity
;
import
lombok.Data
;
/**
* 数据库reservation表对应实体类
*
* @author 226
* @version 1.0
* @date 2020/2/23
*/
@Data
public
class
Reservation
{
private
int
id
;
private
String
carNumber
;
private
String
outset
;
private
String
destination
;
private
String
communityContactName
;
private
String
communityContactPhone
;
private
String
submitCoordinate
;
private
String
submitTime
;
private
String
authCoordinate
;
private
String
authTime
;
private
String
verifyState
;
private
int
identityId
;
}
src/main/java/com/yingxin/beijingvehicleflow/mapper/FloatingPopulationMapper.java
0 → 100644
View file @
9832278f
package
com
.
yingxin
.
beijingvehicleflow
.
mapper
;
/**
* description //TODO
*
* @author 226
* @version 1.0
* @date 2020/2/23
*/
public
interface
FloatingPopulationMapper
{
}
src/main/java/com/yingxin/beijingvehicleflow/mapper/IdentityInformationMapper.java
0 → 100644
View file @
9832278f
package
com
.
yingxin
.
beijingvehicleflow
.
mapper
;
/**
* description //TODO
*
* @author 226
* @version 1.0
* @date 2020/2/23
*/
public
interface
IdentityInformationMapper
{
}
src/main/java/com/yingxin/beijingvehicleflow/mapper/ReservationMapper.java
0 → 100644
View file @
9832278f
package
com
.
yingxin
.
beijingvehicleflow
.
mapper
;
/**
* description //TODO
*
* @author 226
* @version 1.0
* @date 2020/2/23
*/
public
interface
ReservationMapper
{
}
src/main/java/com/yingxin/beijingvehicleflow/util/IdCardUtil.java
0 → 100644
View file @
9832278f
package
com
.
yingxin
.
beijingvehicleflow
.
util
;
import
java.text.ParseException
;
import
java.text.SimpleDateFormat
;
import
java.util.Calendar
;
import
java.util.Date
;
/**
* @auther 李晓阳
* @email lixy@yingxininfo.net
* @date 2020/2/16 17:34
*/
public
class
IdCardUtil
{
// public static void main(String[] args) {
// String idcard = "11023203023023320";
// //校验15位身份证号码合法性
// boolean b1 = IdCardUtil.validate15IDCard(idcard);
// //校验18位身份证号码合法性
// boolean b = IdCardUtil.validate18Idcard(idcard);
// //15位18位均可校验
// boolean validatedAllIdcard = IdCardUtil.isValidatedAllIdcard(idcard);
// if(validatedAllIdcard){
// System.out.println("合格的身份证号码");
// }else {
// System.out.println("非法的身份证号码");
// }
// }
/**
* <pre>
* 省、直辖市代码表:
* 11 : 北京 12 : 天津 13 : 河北 14 : 山西 15 : 内蒙古
* 21 : 辽宁 22 : 吉林 23 : 黑龙江 31 : 上海 32 : 江苏
* 33 : 浙江 34 : 安徽 35 : 福建 36 : 江西 37 : 山东
* 41 : 河南 42 : 湖北 43 : 湖南 44 : 广东 45 : 广西 46 : 海南
* 50 : 重庆 51 : 四川 52 : 贵州 53 : 云南 54 : 西藏
* 61 : 陕西 62 : 甘肃 63 : 青海 64 : 宁夏 65 : 新疆
* 71 : 台湾
* 81 : 香港 82 : 澳门
* 91 : 国外
* </pre>
*/
private
static
String
[]
cityCode
=
{
"11"
,
"12"
,
"13"
,
"14"
,
"15"
,
"21"
,
"22"
,
"23"
,
"31"
,
"32"
,
"33"
,
"34"
,
"35"
,
"36"
,
"37"
,
"41"
,
"42"
,
"43"
,
"44"
,
"45"
,
"46"
,
"50"
,
"51"
,
"52"
,
"53"
,
"54"
,
"61"
,
"62"
,
"63"
,
"64"
,
"65"
,
"71"
,
"81"
,
"82"
,
"91"
};
/**
* 每位加权因子
*/
private
static
int
power
[]
=
{
7
,
9
,
10
,
5
,
8
,
4
,
2
,
1
,
6
,
3
,
7
,
9
,
10
,
5
,
8
,
4
,
2
};
/**
* 验证所有的身份证的合法性
*
* @param idcard
* 身份证
* @return 合法返回true,否则返回false
*/
public
static
boolean
isValidatedAllIdcard
(
String
idcard
)
{
if
(
idcard
==
null
||
""
.
equals
(
idcard
))
{
return
false
;
}
int
s
=
15
;
if
(
idcard
.
length
()
==
s
)
{
return
validate15IDCard
(
idcard
);
}
int
s1
=
18
;
if
(
idcard
.
length
()==
s1
)
{
return
validate18Idcard
(
idcard
);
}
return
false
;
}
/**
* <p>
* 判断18位身份证的合法性
* </p>
* 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
* 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
* <p>
* 顺序码: 表示在同一地址码所标识的区域范围内,对同年、同月、同 日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配 给女性。
* </p>
* <p>
* 1.前1、2位数字表示:所在省份的代码; 2.第3、4位数字表示:所在城市的代码; 3.第5、6位数字表示:所在区县的代码;
* 4.第7~14位数字表示:出生年、月、日; 5.第15、16位数字表示:所在地的派出所的代码;
* 6.第17位数字表示性别:奇数表示男性,偶数表示女性;
* 7.第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。
* </p>
* <p>
* 第十八位数字(校验码)的计算方法为: 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4
* 2 1 6 3 7 9 10 5 8 4 2
* </p>
* <p>
* 2.将这17位数字和系数相乘的结果相加。
* </p>
* <p>
* 3.用加出来和除以11,看余数是多少
* </p>
* 4.余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3
* 2。
* <p>
* 5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。
* </p>
*
* @param idcard
* @return
*/
public
static
boolean
validate18Idcard
(
String
idcard
)
{
if
(
idcard
==
null
)
{
return
false
;
}
// 非18位为假
int
s
=
18
;
if
(
idcard
.
length
()
!=
s
)
{
System
.
out
.
println
(
"身份证位数不正确!"
);
return
false
;
}
// 获取前17位
String
idcard17
=
idcard
.
substring
(
0
,
17
);
// 前17位全部为数字
if
(!
isDigital
(
idcard17
))
{
return
false
;
}
String
provinceid
=
idcard
.
substring
(
0
,
2
);
// 校验省份
if
(!
checkProvinceid
(
provinceid
))
{
return
false
;
}
// 校验出生日期
String
birthday
=
idcard
.
substring
(
6
,
14
);
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyyyMMdd"
);
try
{
Date
birthDate
=
sdf
.
parse
(
birthday
);
String
tmpDate
=
sdf
.
format
(
birthDate
);
// 出生年月日不正确
if
(!
tmpDate
.
equals
(
birthday
))
{
return
false
;
}
}
catch
(
ParseException
e1
)
{
return
false
;
}
// 获取第18位
String
idcard18Code
=
idcard
.
substring
(
17
,
18
);
char
c
[]
=
idcard17
.
toCharArray
();
int
bit
[]
=
converCharToInt
(
c
);
int
sum17
=
0
;
sum17
=
getPowerSum
(
bit
);
// 将和值与11取模得到余数进行校验码判断
String
checkCode
=
getCheckCodeBySum
(
sum17
);
if
(
null
==
checkCode
)
{
return
false
;
}
// 将身份证的第18位与算出来的校码进行匹配,不相等就为假
if
(!
idcard18Code
.
equalsIgnoreCase
(
checkCode
))
{
return
false
;
}
//System.out.println("正确");
return
true
;
}
/**
* 校验15位身份证
*
* <pre>
* 只校验省份和出生年月日
* </pre>
*
* @param idcard
* @return
*/
public
static
boolean
validate15IDCard
(
String
idcard
)
{
if
(
idcard
==
null
)
{
return
false
;
}
// 非15位为假
int
s
=
15
;
if
(
idcard
.
length
()
!=
s
)
{
return
false
;
}
// 15全部为数字
if
(!
isDigital
(
idcard
))
{
return
false
;
}
String
provinceid
=
idcard
.
substring
(
0
,
2
);
// 校验省份
if
(!
checkProvinceid
(
provinceid
))
{
return
false
;
}
String
birthday
=
idcard
.
substring
(
6
,
12
);
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyMMdd"
);
try
{
Date
birthDate
=
sdf
.
parse
(
birthday
);
String
tmpDate
=
sdf
.
format
(
birthDate
);
// 身份证日期错误
if
(!
tmpDate
.
equals
(
birthday
))
{
return
false
;
}
}
catch
(
ParseException
e1
)
{
return
false
;
}
return
true
;
}
/**
* 将15位的身份证转成18位身份证
*
* @param idcard
* @return
*/
public
static
String
convertIdcarBy15bit
(
String
idcard
)
{
if
(
idcard
==
null
)
{
return
null
;
}
// 非15位身份证
int
s
=
15
;
if
(
idcard
.
length
()
!=
s
)
{
return
null
;
}
// 15全部为数字
if
(!
isDigital
(
idcard
))
{
return
null
;
}
String
provinceid
=
idcard
.
substring
(
0
,
2
);
// 校验省份
if
(!
checkProvinceid
(
provinceid
))
{
return
null
;
}
String
birthday
=
idcard
.
substring
(
6
,
12
);
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyMMdd"
);
Date
birthdate
=
null
;
try
{
birthdate
=
sdf
.
parse
(
birthday
);
String
tmpDate
=
sdf
.
format
(
birthdate
);
// 身份证日期错误
if
(!
tmpDate
.
equals
(
birthday
))
{
return
null
;
}
}
catch
(
ParseException
e1
)
{
return
null
;
}
Calendar
cday
=
Calendar
.
getInstance
();
cday
.
setTime
(
birthdate
);
String
year
=
String
.
valueOf
(
cday
.
get
(
Calendar
.
YEAR
));
String
idcard17
=
idcard
.
substring
(
0
,
6
)
+
year
+
idcard
.
substring
(
8
);
char
c
[]
=
idcard17
.
toCharArray
();
String
checkCode
=
""
;
// 将字符数组转为整型数组
int
bit
[]
=
converCharToInt
(
c
);
int
sum17
=
0
;
sum17
=
getPowerSum
(
bit
);
// 获取和值与11取模得到余数进行校验码
checkCode
=
getCheckCodeBySum
(
sum17
);
// 获取不到校验位
if
(
null
==
checkCode
)
{
return
null
;
}
// 将前17位与第18位校验码拼接
idcard17
+=
checkCode
;
return
idcard17
;
}
/**
* 校验省份
*
* @param provinceid
* @return 合法返回TRUE,否则返回FALSE
*/
private
static
boolean
checkProvinceid
(
String
provinceid
)
{
for
(
String
id
:
cityCode
)
{
if
(
id
.
equals
(
provinceid
))
{
return
true
;
}
}
return
false
;
}
/**
* 数字验证
*
* @param str
* @return
*/
private
static
boolean
isDigital
(
String
str
)
{
return
str
.
matches
(
"^[0-9]*$"
);
}
/**
* 将身份证的每位和对应位的加权因子相乘之后,再得到和值
*
* @param bit
* @return
*/
private
static
int
getPowerSum
(
int
[]
bit
)
{
int
sum
=
0
;
if
(
power
.
length
!=
bit
.
length
)
{
return
sum
;
}
for
(
int
i
=
0
;
i
<
bit
.
length
;
i
++)
{
for
(
int
j
=
0
;
j
<
power
.
length
;
j
++)
{
if
(
i
==
j
)
{
sum
=
sum
+
bit
[
i
]
*
power
[
j
];
}
}
}
return
sum
;
}
/**
* 将和值与11取模得到余数进行校验码判断
*
* @param
* @param sum17
* @return 校验位
*/
private
static
String
getCheckCodeBySum
(
int
sum17
)
{
String
checkCode
=
null
;
switch
(
sum17
%
11
)
{
case
10
:
checkCode
=
"2"
;
break
;
case
9
:
checkCode
=
"3"
;
break
;
case
8
:
checkCode
=
"4"
;
break
;
case
7
:
checkCode
=
"5"
;
break
;
case
6
:
checkCode
=
"6"
;
break
;
case
5
:
checkCode
=
"7"
;
break
;
case
4
:
checkCode
=
"8"
;
break
;
case
3
:
checkCode
=
"9"
;
break
;
case
2
:
checkCode
=
"x"
;
break
;
case
1
:
checkCode
=
"0"
;
break
;
case
0
:
checkCode
=
"1"
;
break
;
default
:
}
return
checkCode
;
}
/**
* 将字符数组转为整型数组
*
* @param c
* @return
* @throws NumberFormatException
*/
private
static
int
[]
converCharToInt
(
char
[]
c
)
throws
NumberFormatException
{
int
[]
a
=
new
int
[
c
.
length
];
int
k
=
0
;
for
(
char
temp
:
c
)
{
a
[
k
++]
=
Integer
.
parseInt
(
String
.
valueOf
(
temp
));
}
return
a
;
}
/*public static void main(String[] args) throws Exception {
String idcard15 = "130321860311519";
String idcard18 = "210102198617083732";//
String idcard="610**************";
//自己身份证测试
System.out.println(isValidatedAllIdcard(idcard));
// 15位身份证
//System.out.println(isValidatedAllIdcard(idcard15));
// 18位身份证
//System.out.println(isValidatedAllIdcard(idcard18));
// 15位身份证转18位身份证
//System.out.println(convertIdcarBy15bit(idcard15));
}*/
}
src/main/java/com/yingxin/beijingvehicleflow/util/PicUtils.java
0 → 100644
View file @
9832278f
package
com
.
yingxin
.
beijingvehicleflow
.
util
;
import
net.coobird.thumbnailator.Thumbnails
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
sun.misc.BASE64Decoder
;
import
sun.misc.BASE64Encoder
;
import
java.io.*
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
/**
* 压缩图片工具类
* @auther 李晓阳
* @email lixy@yingxininfo.net
* @date 2020/2/15 10:28
*/
public
class
PicUtils
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
PicUtils
.
class
);
/**
* compressImage
* @param image 图片的base64
* @param size 压缩的最大值
* 压缩图片
* @date 2020/2/15
* @return java.lang.String
*/
public
static
String
compressImage
(
String
image
,
long
size
){
try
{
byte
[]
imageByte
=
new
BASE64Decoder
().
decodeBuffer
(
image
);
byte
[]
pics
=
PicUtils
.
compressPicForScale
(
imageByte
,
size
,
"x"
);
String
authImage
=
new
BASE64Encoder
().
encode
(
pics
).
trim
();
String
str
=
"\\s*|\t|\r|\n"
;
Pattern
p
=
Pattern
.
compile
(
str
);
Matcher
m
=
p
.
matcher
(
authImage
);
authImage
=
m
.
replaceAll
(
""
);
authImage
.
replaceAll
(
"\r|\n"
,
""
);
authImage
.
replaceAll
(
"\\n"
,
""
);
return
authImage
;
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
return
image
;
}
}
/**
* 根据指定大小压缩图片
*
* @param imageBytes 源图片字节数组
* @param desFileSize 指定图片大小,单位kb
* @param imageId 影像编号
* @return 压缩质量后的图片字节数组
*/
public
static
byte
[]
compressPicForScale
(
byte
[]
imageBytes
,
long
desFileSize
,
String
imageId
)
{
if
(
imageBytes
==
null
||
imageBytes
.
length
<=
0
||
imageBytes
.
length
<
desFileSize
*
1024
)
{
return
imageBytes
;
}
long
srcSize
=
imageBytes
.
length
;
double
accuracy
=
getAccuracy
(
srcSize
/
1024
);
try
{
while
(
imageBytes
.
length
>
desFileSize
*
1024
)
{
ByteArrayInputStream
inputStream
=
new
ByteArrayInputStream
(
imageBytes
);
ByteArrayOutputStream
outputStream
=
new
ByteArrayOutputStream
(
imageBytes
.
length
);
Thumbnails
.
of
(
inputStream
)
.
scale
(
accuracy
)
.
outputQuality
(
accuracy
)
.
toOutputStream
(
outputStream
);
imageBytes
=
outputStream
.
toByteArray
();
}
logger
.
info
(
"【图片压缩】imageId={} | 图片原大小={}kb | 压缩后大小={}kb"
,
imageId
,
srcSize
/
1024
,
imageBytes
.
length
/
1024
);
}
catch
(
Exception
e
)
{
logger
.
error
(
"【图片压缩】msg=图片压缩失败!"
,
e
);
}
return
imageBytes
;
}
/**
* 自动调节精度(经验数值)
*
* @param size 源图片大小
* @return 图片压缩质量比
*/
private
static
double
getAccuracy
(
long
size
)
{
double
accuracy
;
if
(
size
<
900
)
{
accuracy
=
0.85
;
}
else
if
(
size
<
2047
)
{
accuracy
=
0.6
;
}
else
if
(
size
<
3275
)
{
accuracy
=
0.44
;
}
else
{
accuracy
=
0.4
;
}
return
accuracy
;
}
/**
* 图片转化成base64字符串
* @param imgPath
* @return
*/
public
static
String
GetImageStr
(
String
imgPath
)
{
// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
String
imgFile
=
imgPath
;
// 待处理的图片
InputStream
in
=
null
;
byte
[]
data
=
null
;
String
encode
=
null
;
// 返回Base64编码过的字节数组字符串
// 对字节数组Base64编码
BASE64Encoder
encoder
=
new
BASE64Encoder
();
try
{
// 读取图片字节数组
in
=
new
FileInputStream
(
imgFile
);
data
=
new
byte
[
in
.
available
()];
in
.
read
(
data
);
encode
=
encoder
.
encode
(
data
);
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
finally
{
try
{
in
.
close
();
}
catch
(
IOException
e
)
{
// TODO Auto-generated catch block
e
.
printStackTrace
();
}
}
return
encode
;
}
/**
* base64字符串转化成图片
*
* @param imgData
* 图片编码
* @param imgFilePath
* 存放到本地路径
* @return
* @throws IOException
*/
@SuppressWarnings
(
"finally"
)
public
static
boolean
GenerateImage
(
String
imgData
,
String
imgFilePath
)
throws
IOException
{
// 对字节数组字符串进行Base64解码并生成图片
if
(
imgData
==
null
){
// 图像数据为空
return
false
;
}
BASE64Decoder
decoder
=
new
BASE64Decoder
();
OutputStream
out
=
null
;
try
{
out
=
new
FileOutputStream
(
imgFilePath
);
// Base64解码
byte
[]
b
=
decoder
.
decodeBuffer
(
imgData
);
for
(
int
i
=
0
;
i
<
b
.
length
;
++
i
)
{
if
(
b
[
i
]
<
0
)
{
// 调整异常数据
b
[
i
]
+=
256
;
}
}
out
.
write
(
b
);
}
catch
(
FileNotFoundException
e
)
{
e
.
printStackTrace
();
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
finally
{
out
.
flush
();
out
.
close
();
return
true
;
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment