add method

This commit is contained in:
Looly 2024-08-09 09:02:29 +08:00
parent fbe899dd2a
commit 6082abff00

View File

@ -12,14 +12,15 @@
package org.dromara.hutool.swing.img.color; package org.dromara.hutool.swing.img.color;
import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.core.convert.Convert; import org.dromara.hutool.core.convert.Convert;
import org.dromara.hutool.core.lang.Assert;
import org.dromara.hutool.core.lang.ansi.Ansi4BitColor; import org.dromara.hutool.core.lang.ansi.Ansi4BitColor;
import org.dromara.hutool.core.lang.ansi.Ansi8BitColor; import org.dromara.hutool.core.lang.ansi.Ansi8BitColor;
import org.dromara.hutool.core.lang.ansi.AnsiElement; import org.dromara.hutool.core.lang.ansi.AnsiElement;
import org.dromara.hutool.core.map.MapUtil; import org.dromara.hutool.core.map.MapUtil;
import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.core.text.split.SplitUtil; import org.dromara.hutool.core.text.split.SplitUtil;
import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.core.util.RandomUtil; import org.dromara.hutool.core.util.RandomUtil;
import java.awt.Color; import java.awt.Color;
@ -268,6 +269,10 @@ public class ColorUtil {
* @since 5.8.30 * @since 5.8.30
*/ */
public static Color randomColor(final Color compareColor, final int minDistance) { public static Color randomColor(final Color compareColor, final int minDistance) {
// 注意minDistance太大会增加循环次数保证至少1/3的概率生成成功
Assert.isTrue(minDistance < maxDistance(compareColor) / 3 * 2,
"minDistance is too large, there are too few remaining colors!");
Color color = randomColor(); Color color = randomColor();
if(null == compareColor || minDistance <= 0){ if(null == compareColor || minDistance <= 0){
while (computeColorDistance(compareColor, color) < minDistance) { while (computeColorDistance(compareColor, color) < minDistance) {
@ -295,6 +300,20 @@ public class ColorUtil {
+ Math.pow(color1.getBlue() - color2.getBlue(), 2)); + Math.pow(color1.getBlue() - color2.getBlue(), 2));
} }
/**
* 计算给定点与其他点之间的最大可能距离
*
* @param color 指定颜色
* @return 其余颜色与color的最大距离
* @since 6.0.0-M16
*/
public static int maxDistance(final Color color) {
final int maxX = RGB_COLOR_BOUND - 2 * color.getRed();
final int maxY = RGB_COLOR_BOUND - 2 * color.getGreen();
final int maxZ = RGB_COLOR_BOUND - 2 * color.getBlue();
return (int)Math.sqrt(maxX * maxX + maxY * maxY + maxZ * maxZ);
}
/** /**
* AWT的{@link Color}颜色转换为ANSI颜色由于取最接近颜色故可能有色差 * AWT的{@link Color}颜色转换为ANSI颜色由于取最接近颜色故可能有色差
* *