This commit is contained in:
Looly
2023-03-13 11:41:20 +08:00
parent 0df74202c2
commit 1ad628f944
25 changed files with 59 additions and 54 deletions

View File

@@ -11,8 +11,8 @@ hutool版本 5.X.X请确保最新尝试是否还有问题
Console.log("报错了"); Console.log("报错了");
``` ```
2. 堆栈信息 1. 堆栈信息
3. 测试涉及到的文件(注意脱密) 2. 测试涉及到的文件(注意脱密)
比如报错的Excel文件有问题的图片等。 比如报错的Excel文件有问题的图片等。

View File

@@ -11,8 +11,8 @@ hutool版本 5.X.X请确保最新尝试是否还有问题
Console.log("报错了"); Console.log("报错了");
``` ```
2. 堆栈信息 1. 堆栈信息
3. 测试涉及到的文件(注意脱密) 2. 测试涉及到的文件(注意脱密)
比如报错的Excel文件有问题的图片等。 比如报错的Excel文件有问题的图片等。

View File

@@ -176,10 +176,10 @@ cd ${hutool}
Hutool's source code is divided into two branches: Hutool's source code is divided into two branches:
| branch | description | | branch | description |
|-----------|---------------------------------------------------------------| |-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| v6-master | The master branch, the branch used by the release version, is the same as the jar committed to the central repository and does not receive any pr or modifications. | | v6-master | The master branch, the branch used by the release version, is the same as the jar committed to the central repository and does not receive any pr or modifications. |
| v6-dev | Development branch, which defaults to the next SNAPSHOT version, accepts modifications or pr | | v6-dev | Development branch, which defaults to the next SNAPSHOT version, accepts modifications or pr |
### 🐞Provide feedback or suggestions on bugs ### 🐞Provide feedback or suggestions on bugs

View File

@@ -180,10 +180,10 @@ implementation 'cn.hutool:hutool-all:6.0.0.M1'
Hutool的源码分为两个分支功能如下 Hutool的源码分为两个分支功能如下
| 分支 | 作用 | | 分支 | 作用 |
|-----------|---------------------------------------------------------------| |-----------|--------------------------------------------|
| v6-master | 主分支release版本使用的分支与中央库提交的jar一致不接收任何pr或修改 | | v6-master | 主分支release版本使用的分支与中央库提交的jar一致不接收任何pr或修改 |
| v6-dev | 开发分支默认为下个版本的SNAPSHOT版本接受修改或pr | | v6-dev | 开发分支默认为下个版本的SNAPSHOT版本接受修改或pr |
### 🐞提供bug反馈或建议 ### 🐞提供bug反馈或建议

View File

@@ -3,7 +3,7 @@
## Supported Versions支持的版本 ## Supported Versions支持的版本
| Version | Supported | | Version | Supported |
|---------| ------------------ | |---------|--------------------|
| 6.x.x | :white_check_mark: | | 6.x.x | :white_check_mark: |
## Reporting a Vulnerability报告漏洞 ## Reporting a Vulnerability报告漏洞

View File

@@ -12,7 +12,7 @@ echo "当前路径:${pwd}"
if [ -n "$1" ];then if [ -n "$1" ];then
new_version="$1" new_version="$1"
old_version=`cat ${pwd}/bin/version.txt` old_version=$(cat "${pwd}"/bin/version.txt)
echo "$old_version 替换为新版本 $new_version" echo "$old_version 替换为新版本 $new_version"
else else
# 参数错误,退出 # 参数错误,退出
@@ -20,16 +20,16 @@ else
exit exit
fi fi
if [ ! -n "$old_version" ]; then if [ -z "$old_version" ]; then
echo "ERROR: 旧版本不存在请确认bin/version.txt中信息正确" echo "ERROR: 旧版本不存在请确认bin/version.txt中信息正确"
exit exit
fi fi
# 替换README.md中的版本 # 替换README.md中的版本
sed -i "s/${old_version}/${new_version}/g" $pwd/README.md sed -i "s/${old_version}/${new_version}/g" "$pwd"/README.md
sed -i "s/${old_version}/${new_version}/g" $pwd/README-EN.md sed -i "s/${old_version}/${new_version}/g" "$pwd"/README-EN.md
# 替换docs/js/version.js中的版本 # 替换docs/js/version.js中的版本
sed -i "s/${old_version}/${new_version}/g" $pwd/docs/js/version.js sed -i "s/${old_version}/${new_version}/g" "$pwd"/docs/js/version.js
# 保留新版本号 # 保留新版本号
echo "$new_version" > $pwd/bin/version.txt echo "$new_version" > "$pwd"/bin/version.txt

View File

@@ -28,7 +28,7 @@ public interface AnnotationMapping<T extends Annotation> extends Annotation {
T getAnnotation(); T getAnnotation();
/** /**
* 根据当前映射对象,通过动态代理生成一个类型与被包装注解对象一致合成注解,该注解相对原生注解: * 根据当前映射对象,通过动态代理生成一个类型与被包装注解对象一致合成注解,该注解相对原生注解:
* <ul> * <ul>
* <li>支持同注解内通过{@link Alias}构建的别名机制;</li> * <li>支持同注解内通过{@link Alias}构建的别名机制;</li>
* <li>支持子注解对元注解的同名同类型属性覆盖机制;</li> * <li>支持子注解对元注解的同名同类型属性覆盖机制;</li>

View File

@@ -73,7 +73,7 @@ public class BetweenFormatter implements Serializable {
final int level = this.level.ordinal(); final int level = this.level.ordinal();
int levelCount = 0; int levelCount = 0;
if (isLevelCountValid(levelCount) && 0 != day && level >= Level.DAY.ordinal()) { if (isLevelCountValid(levelCount) && 0 != day) {
sb.append(day).append(Level.DAY.name); sb.append(day).append(Level.DAY.name);
levelCount++; levelCount++;
} }

View File

@@ -15,6 +15,7 @@ import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@@ -246,7 +247,7 @@ public class FileReader extends FileWrapper {
*/ */
public BufferedInputStream getInputStream() throws IORuntimeException { public BufferedInputStream getInputStream() throws IORuntimeException {
try { try {
return new BufferedInputStream(new FileInputStream(this.file)); return new BufferedInputStream(Files.newInputStream(this.file.toPath()));
} catch (final IOException e) { } catch (final IOException e) {
throw new IORuntimeException(e); throw new IORuntimeException(e);
} }

View File

@@ -123,6 +123,7 @@ public class ResourceUtil {
* *
* @param resource 资源相对Classpath的路径 * @param resource 资源相对Classpath的路径
* @return 资源URL * @return 资源URL
* @throws IORuntimeException IO异常
*/ */
public static URL getResourceUrl(final String resource) throws IORuntimeException { public static URL getResourceUrl(final String resource) throws IORuntimeException {
return getResourceUrl(resource, null); return getResourceUrl(resource, null);

View File

@@ -24,7 +24,7 @@ import java.util.function.Predicate;
* </table> * </table>
* *
* <p>空区间</p> * <p>空区间</p>
* <p>根据数学定义,当区间中无任何实数时,认为该区间代表的集合为空集, * <p>根据数学定义,当区间中无任何实数时,认为该区间 代表的集合为空集,
* 用户可通过{@link #isEmpty}确认当前实例是否为空区间。<br> * 用户可通过{@link #isEmpty}确认当前实例是否为空区间。<br>
* 若实例上界<em>a</em>,下界为<em>b</em>,则当实例满足下述任意条件时,认为其为一个空区间: * 若实例上界<em>a</em>,下界为<em>b</em>,则当实例满足下述任意条件时,认为其为一个空区间:
* <ul> * <ul>

View File

@@ -254,6 +254,7 @@ public interface TerminableWrappedStream<T, S extends TerminableWrappedStream<T,
* @param predicate 断言 * @param predicate 断言
* @return 与给定断言匹配的第一个元素的下标,如果不存在则返回-1 * @return 与给定断言匹配的第一个元素的下标,如果不存在则返回-1
*/ */
@SuppressWarnings("ResultOfMethodCallIgnored")
default int findFirstIdx(final Predicate<? super T> predicate) { default int findFirstIdx(final Predicate<? super T> predicate) {
Objects.requireNonNull(predicate); Objects.requireNonNull(predicate);
if (isParallel()) { if (isParallel()) {
@@ -263,7 +264,7 @@ public interface TerminableWrappedStream<T, S extends TerminableWrappedStream<T,
unwrap().filter(e -> { unwrap().filter(e -> {
index.increment(); index.increment();
return predicate.test(e); return predicate.test(e);
}).findFirst(); }).findFirst();// 此处只做计数,不需要值
return index.get(); return index.get();
} }
} }

View File

@@ -428,7 +428,7 @@ public class AntPathMatcher {
} }
/** /**
* Test whether or not a string matches against a pattern. * Test whether a string matches against a pattern.
* *
* @param pattern the pattern to match against (never {@code null}) * @param pattern the pattern to match against (never {@code null})
* @param str the String which must be matched against the pattern (never {@code null}) * @param str the String which must be matched against the pattern (never {@code null})

View File

@@ -89,7 +89,7 @@ public class ArrayUtil extends PrimitiveArrayUtil {
* 数组是否为非空<br> * 数组是否为非空<br>
* 此方法会匹配单一对象,如果此对象为{@code null}则返回false<br> * 此方法会匹配单一对象,如果此对象为{@code null}则返回false<br>
* 如果此对象为非数组理解为此对象为数组的第一个元素则返回true<br> * 如果此对象为非数组理解为此对象为数组的第一个元素则返回true<br>
* 如果此对象为数组对象数组长度大于0情况下返回true否则返回false * 如果此对象为数组对象数组长度大于0情况下返回true否则返回false
* *
* @param array 数组 * @param array 数组
* @return 是否为非空 * @return 是否为非空

View File

@@ -280,6 +280,7 @@ public class StrUtilTest {
Assert.assertEquals("ghigh", pre); Assert.assertEquals("ghigh", pre);
} }
@SuppressWarnings("SimplifiableAssertion")
@Test @Test
public void subPreTest() { public void subPreTest() {
Assert.assertEquals(StrUtil.subPre(null, 3), null); Assert.assertEquals(StrUtil.subPre(null, 3), null);

View File

@@ -216,7 +216,7 @@ public class ArrayUtilTest {
final String[] a = {"1", "2", "3", "4"}; final String[] a = {"1", "2", "3", "4"};
final String[] b = {"a", "b", "c"}; final String[] b = {"a", "b", "c"};
// 在-1位置插入相当于在3位置插入 // 在-1位置插入相当于在3位置插入
String[] result = ArrayUtil.insert(a, -1, b); String[] result = ArrayUtil.insert(a, -1, b);
Assert.assertArrayEquals(new String[]{"1", "2", "3", "a", "b", "c", "4"}, result); Assert.assertArrayEquals(new String[]{"1", "2", "3", "a", "b", "c", "4"}, result);
@@ -232,7 +232,7 @@ public class ArrayUtilTest {
result = ArrayUtil.insert(a, 4, b); result = ArrayUtil.insert(a, 4, b);
Assert.assertArrayEquals(new String[]{"1", "2", "3", "4", "a", "b", "c"}, result); Assert.assertArrayEquals(new String[]{"1", "2", "3", "4", "a", "b", "c"}, result);
// 在第5个位置插入由于数组长度为4因此补null // 在第5个位置插入由于数组长度为4因此补null
result = ArrayUtil.insert(a, 5, b); result = ArrayUtil.insert(a, 5, b);
Assert.assertArrayEquals(new String[]{"1", "2", "3", "4", null, "a", "b", "c"}, result); Assert.assertArrayEquals(new String[]{"1", "2", "3", "4", null, "a", "b", "c"}, result);
} }
@@ -472,7 +472,7 @@ public class ArrayUtilTest {
final String[] a = {"1", "2", "3", "4"}; final String[] a = {"1", "2", "3", "4"};
final String[] b = {"a", "b", "c"}; final String[] b = {"a", "b", "c"};
// 在小于0的位置-1位置插入返回b+a新数组 // 在小于0的位置-1位置插入返回b+a新数组
String[] result = ArrayUtil.replace(a, -1, b); String[] result = ArrayUtil.replace(a, -1, b);
Assert.assertArrayEquals(new String[]{"a", "b", "c", "1", "2", "3", "4"}, result); Assert.assertArrayEquals(new String[]{"a", "b", "c", "1", "2", "3", "4"}, result);

View File

@@ -2,8 +2,8 @@ package cn.hutool.core.util;
import cn.hutool.core.compress.ZipReader; import cn.hutool.core.compress.ZipReader;
import cn.hutool.core.compress.ZipUtil; import cn.hutool.core.compress.ZipUtil;
import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.file.FileUtil;
import cn.hutool.core.lang.Console; import cn.hutool.core.lang.Console;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import org.junit.Assert; import org.junit.Assert;
@@ -11,11 +11,12 @@ import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import java.io.File; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.zip.ZipFile; import java.util.zip.ZipFile;
@@ -156,7 +157,7 @@ public class ZipUtilTest {
//https://github.com/dromara/hutool/issues/944 //https://github.com/dromara/hutool/issues/944
final String dir = "d:/test"; final String dir = "d:/test";
final String zip = "d:/test.zip"; final String zip = "d:/test.zip";
try (final OutputStream out = new FileOutputStream(zip)){ try (final OutputStream out = Files.newOutputStream(Paths.get(zip))){
//实际应用中, out 为 HttpServletResponse.getOutputStream //实际应用中, out 为 HttpServletResponse.getOutputStream
ZipUtil.zip(out, Charset.defaultCharset(), false, null, new File(dir)); ZipUtil.zip(out, Charset.defaultCharset(), false, null, new File(dir));
} catch (final IOException e) { } catch (final IOException e) {

View File

@@ -34,7 +34,7 @@ import java.security.spec.ECPublicKeySpec;
public class BCUtil { public class BCUtil {
/** /**
* 只获取私钥里的d32字节 * 只获取私钥里的d32字节
* *
* @param privateKey {@link PublicKey}必须为org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey * @param privateKey {@link PublicKey}必须为org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey
* @return 压缩得到的X * @return 压缩得到的X

View File

@@ -3,11 +3,11 @@ package cn.hutool.crypto.symmetric;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
/** /**
* https://gitee.com/dromara/hutool/issues/I4EMST * https://gitee.com/dromara/hutool/issues/I4EMST
@@ -29,8 +29,8 @@ public class Sm4StreamTest {
} }
public static void encrypt(final String source, final String target) { public static void encrypt(final String source, final String target) {
try (final InputStream input = new FileInputStream(source); try (final InputStream input = Files.newInputStream(Paths.get(source));
final OutputStream out = new FileOutputStream(target)) { final OutputStream out = Files.newOutputStream(Paths.get(target))) {
sm4.encrypt(input, out, IS_CLOSE); sm4.encrypt(input, out, IS_CLOSE);
System.out.println("============encrypt end"); System.out.println("============encrypt end");
} catch (final IOException e) { } catch (final IOException e) {
@@ -39,8 +39,8 @@ public class Sm4StreamTest {
} }
public static void decrypt(final String source, final String target) { public static void decrypt(final String source, final String target) {
try (final InputStream input = new FileInputStream(source); try (final InputStream input = Files.newInputStream(Paths.get(source));
final OutputStream out = new FileOutputStream(target)) { final OutputStream out = Files.newOutputStream(Paths.get(target))) {
sm4.decrypt(input, out, IS_CLOSE); sm4.decrypt(input, out, IS_CLOSE);
System.out.println("============decrypt end"); System.out.println("============decrypt end");
} catch (final IOException e) { } catch (final IOException e) {

View File

@@ -37,7 +37,7 @@ initialSize = 10
maxActive = 100 maxActive = 100
# (int) 最大空闲连接: 连接池中容许保持空闲状态的最大连接数量, 超过的空闲连接将被释放, 如果设置为负数表示不限制 如果启用将定期检查限制连接如果空闲时间超过minEvictableIdleTimeMillis 则释放连接 参考testWhileIdle # (int) 最大空闲连接: 连接池中容许保持空闲状态的最大连接数量, 超过的空闲连接将被释放, 如果设置为负数表示不限制 如果启用将定期检查限制连接如果空闲时间超过minEvictableIdleTimeMillis 则释放连接 参考testWhileIdle
maxIdle = 8 maxIdle = 8
# (int) 最小空闲连接: 连接池中容许保持空闲状态的最小连接数量, 低于这个数量将创建新连接, 如果设置为0 则不创建 如果连接验证失败将缩小这个值( 参考testWhileIdle # (int) 最小空闲连接: 连接池中容许保持空闲状态的最小连接数量, 低于这个数量将创建新连接, 如果设置为0 则不创建 如果连接验证失败将缩小这个值( 参考testWhileIdle
minIdle = 0 minIdle = 0
# (int) 最大等待时间: 当没有可用连接时, 连接池等待连接被归还的最大时间( 以毫秒计数) 超过时间则抛出异常, 如果设置为-1 表示无限等待 # (int) 最大等待时间: 当没有可用连接时, 连接池等待连接被归还的最大时间( 以毫秒计数) 超过时间则抛出异常, 如果设置为-1 表示无限等待
maxWait = 30000 maxWait = 30000
@@ -48,4 +48,4 @@ testOnBorrow = false
# (boolean) 指明是否在归还到池中前进行检验 注意: 设置为true 后如果要生效validationQuery 参数必须设置为非空字符串 # (boolean) 指明是否在归还到池中前进行检验 注意: 设置为true 后如果要生效validationQuery 参数必须设置为非空字符串
testOnReturn = false testOnReturn = false
# (boolean) 指明连接是否被空闲连接回收器( 如果有) 进行检验。 如果检测失败, 则连接将被从池中去除。注意: 设置为true 后如果要生效validationQuery 参数必须设置为非空字符串 # (boolean) 指明连接是否被空闲连接回收器( 如果有) 进行检验。 如果检测失败, 则连接将被从池中去除。注意: 设置为true 后如果要生效validationQuery 参数必须设置为非空字符串
testWhileIdle = false testWhileIdle = false

View File

@@ -32,10 +32,16 @@ public class JdkInterceptor implements InvocationHandler, Serializable {
this.aspect = aspect; this.aspect = aspect;
} }
/**
* 获取目标对象
*
* @return 目标对象
*/
public Object getTarget() { public Object getTarget() {
return this.target; return this.target;
} }
@SuppressWarnings("SuspiciousInvocationHandlerImplementation")
@Override @Override
public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
final Object target = this.target; final Object target = this.target;

View File

@@ -29,7 +29,7 @@ public class CpuTicks {
public CpuTicks(final CentralProcessor processor, final long waitingTime) { public CpuTicks(final CentralProcessor processor, final long waitingTime) {
// CPU信息 // CPU信息
final long[] prevTicks = processor.getSystemCpuLoadTicks(); final long[] prevTicks = processor.getSystemCpuLoadTicks();
// 这里必须设置延迟 // 这里必须设置延迟
Util.sleep(waitingTime); Util.sleep(waitingTime);
final long[] ticks = processor.getSystemCpuLoadTicks(); final long[] ticks = processor.getSystemCpuLoadTicks();

View File

@@ -4,12 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import java.util.Collection; import java.util.*;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
/** /**
* CSV中一行的表示 * CSV中一行的表示
@@ -146,7 +141,6 @@ public final class CsvRow implements List<String> {
@Override @Override
public <T> T[] toArray(final T[] a) { public <T> T[] toArray(final T[] a) {
//noinspection SuspiciousToArrayCall
return this.fields.toArray(a); return this.fields.toArray(a);
} }
@@ -162,7 +156,7 @@ public final class CsvRow implements List<String> {
@Override @Override
public boolean containsAll(final Collection<?> c) { public boolean containsAll(final Collection<?> c) {
return this.fields.containsAll(c); return new HashSet<>(this.fields).containsAll(c);
} }
@Override @Override

View File

@@ -320,7 +320,7 @@ public final class CsvWriter implements Closeable, Flushable, Serializable {
Assert.notNull(this.config.commentCharacter, "Comment is disable!"); Assert.notNull(this.config.commentCharacter, "Comment is disable!");
try { try {
if(isFirstLine){ if(isFirstLine){
// 首行不补换行符 // 首行不补换行符
isFirstLine = false; isFirstLine = false;
}else { }else {
writer.write(config.lineDelimiter); writer.write(config.lineDelimiter);

View File

@@ -40,7 +40,7 @@ public class BackgroundRemoval {
* 将 "纯色背景的图片" 还原成 "透明背景的图片" * 将 "纯色背景的图片" 还原成 "透明背景的图片"
* 将纯色背景的图片转成矢量图 * 将纯色背景的图片转成矢量图
* 取图片边缘的像素点和获取到的图片主题色作为要替换的背景色 * 取图片边缘的像素点和获取到的图片主题色作为要替换的背景色
* 再加入一定容差值,然后将所有像素点与该颜色进行比较 * 再加入一定容差值,然后将所有像素点与该颜色进行比较
* 发现相同则将颜色不透明度设置为0,使颜色完全透明. * 发现相同则将颜色不透明度设置为0,使颜色完全透明.
* *
* @param inputPath 要处理图片的路径 * @param inputPath 要处理图片的路径
@@ -58,7 +58,7 @@ public class BackgroundRemoval {
* 将 "纯色背景的图片" 还原成 "透明背景的图片" * 将 "纯色背景的图片" 还原成 "透明背景的图片"
* 将纯色背景的图片转成矢量图 * 将纯色背景的图片转成矢量图
* 取图片边缘的像素点和获取到的图片主题色作为要替换的背景色 * 取图片边缘的像素点和获取到的图片主题色作为要替换的背景色
* 再加入一定容差值,然后将所有像素点与该颜色进行比较 * 再加入一定容差值,然后将所有像素点与该颜色进行比较
* 发现相同则将颜色不透明度设置为0,使颜色完全透明. * 发现相同则将颜色不透明度设置为0,使颜色完全透明.
* *
* @param input 需要进行操作的图片 * @param input 需要进行操作的图片
@@ -76,7 +76,7 @@ public class BackgroundRemoval {
* 将 "纯色背景的图片" 还原成 "透明背景的图片" * 将 "纯色背景的图片" 还原成 "透明背景的图片"
* 将纯色背景的图片转成矢量图 * 将纯色背景的图片转成矢量图
* 取图片边缘的像素点和获取到的图片主题色作为要替换的背景色 * 取图片边缘的像素点和获取到的图片主题色作为要替换的背景色
* 再加入一定容差值,然后将所有像素点与该颜色进行比较 * 再加入一定容差值,然后将所有像素点与该颜色进行比较
* 发现相同则将颜色不透明度设置为0,使颜色完全透明. * 发现相同则将颜色不透明度设置为0,使颜色完全透明.
* *
* @param input 需要进行操作的图片 * @param input 需要进行操作的图片
@@ -106,7 +106,7 @@ public class BackgroundRemoval {
* 将 "纯色背景的图片" 还原成 "透明背景的图片" * 将 "纯色背景的图片" 还原成 "透明背景的图片"
* 将纯色背景的图片转成矢量图 * 将纯色背景的图片转成矢量图
* 取图片边缘的像素点和获取到的图片主题色作为要替换的背景色 * 取图片边缘的像素点和获取到的图片主题色作为要替换的背景色
* 再加入一定容差值,然后将所有像素点与该颜色进行比较 * 再加入一定容差值,然后将所有像素点与该颜色进行比较
* 发现相同则将颜色不透明度设置为0,使颜色完全透明. * 发现相同则将颜色不透明度设置为0,使颜色完全透明.
* *
* @param bufferedImage 需要进行处理的图片流 * @param bufferedImage 需要进行处理的图片流
@@ -152,7 +152,7 @@ public class BackgroundRemoval {
* 将 "纯色背景的图片" 还原成 "透明背景的图片" * 将 "纯色背景的图片" 还原成 "透明背景的图片"
* 将纯色背景的图片转成矢量图 * 将纯色背景的图片转成矢量图
* 取图片边缘的像素点和获取到的图片主题色作为要替换的背景色 * 取图片边缘的像素点和获取到的图片主题色作为要替换的背景色
* 再加入一定容差值,然后将所有像素点与该颜色进行比较 * 再加入一定容差值,然后将所有像素点与该颜色进行比较
* 发现相同则将颜色不透明度设置为0,使颜色完全透明. * 发现相同则将颜色不透明度设置为0,使颜色完全透明.
* *
* @param outputStream 需要进行处理的图片字节数组流 * @param outputStream 需要进行处理的图片字节数组流