JAVA-RGB値で色の濃淡を判断し、デフォルトのアイコンを出力する方法
10217 ワード
参照先:
プログラミングの方法で生成された色が濃いか浅いかを判断し、深いものは白で文字を表示し、浅いものは黒で、長い間探していましたが、次の2つの案はオプションです.最初のスキームは、RGBの値を合計し、値をとることです.
このアルゴリズムは馬鹿で簡単だが,効果は望ましくなく,特にBが大きい場合,RGBの様々な色に対する目の感度が異なると推定される.その後、星兄がポイントを上げると、RGBモードをYUVモードに変換し、Yは明るさ(階調)であるため、Yの値を得るだけで十分明るいかどうかを判断することができます.
この効果はPhotoshopのような色消し機能で、白黒テレビもこのアルゴリズムで変換されているのではないでしょうか~:)
私の目的:ユーザーは登録する時、ユーザーにデフォルトの顔を生成して、濃い色の底、浅い色の字は出力を描きます!
プログラミングの方法で生成された色が濃いか浅いかを判断し、深いものは白で文字を表示し、浅いものは黒で、長い間探していましたが、次の2つの案はオプションです.最初のスキームは、RGBの値を合計し、値をとることです.
if ($R + $G + $B >= 450) {
// add shadow
}
このアルゴリズムは馬鹿で簡単だが,効果は望ましくなく,特にBが大きい場合,RGBの様々な色に対する目の感度が異なると推定される.その後、星兄がポイントを上げると、RGBモードをYUVモードに変換し、Yは明るさ(階調)であるため、Yの値を得るだけで十分明るいかどうかを判断することができます.
$grayLevel = $R * 0.299 + $G * 0.587 + $B * 0.114;
if ($grayLevel >= 192) {
// add shadow
}
この効果はPhotoshopのような色消し機能で、白黒テレビもこのアルゴリズムで変換されているのではないでしょうか~:)
私の目的:ユーザーは登録する時、ユーザーにデフォルトの顔を生成して、濃い色の底、浅い色の字は出力を描きます!
package yuan.ssm.common.util;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.*;
import static yuan.ssm.common.config.ConfigConstant.FONT_IMAGE_BASE_PATH;
/**
* ==================================================
*
* : .net12-1
*
* :
*
* :
*
* : 1.0
*
* : 16-4-14 11:36
*
* :
*
*
* :
*
* ==================================================
*/
public class FontImageUtil {
/**
*
*
* @param str
* @param imgName
* @throws Exception
*/
public static void createImage(String str, String imgName) throws Exception{
createImage(str,new Font(" ",Font.BOLD,40),new File(FONT_IMAGE_BASE_PATH+imgName));
}
/**
* str,
*
* @param str
* @param outFile
* @throws Exception
*/
public static void createImage(String str, File outFile) throws Exception{
createImage(str,new Font(" ",Font.BOLD,40),outFile);
}
/**
* str,font
* @param str
* @param font
* @param outFile
* @throws Exception
* createImage(" ",new Font(" ",Font.BOLD,18),new File("e:/a.png"));
*/
public static void createImage(String str, Font font, File outFile) throws Exception{
ArrayList<int[]> rgbs = getRGB();
// // font str
// Rectangle2D r=font.getStringBounds(str, new FontRenderContext(AffineTransform.getScaleInstance(1, 1),false,false));
// int unitHeight=(int)Math.floor(r.getHeight());//
// // str font +1
int width=120;
int height=120;
//
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
Graphics g=image.getGraphics();
g.setColor(new Color(rgbs.get(0)[0],rgbs.get(0)[1],rgbs.get(0)[2]));//
g.fillRect(0, 0, width, height);// ,
g.setColor(new Color(rgbs.get(1)[0],rgbs.get(1)[1],rgbs.get(1)[2]));//
g.setFont(font);//
g.drawString(str,60,60);//
g.dispose();
ImageIO.write(image, "png", outFile);// png
}
/**
* -
*
* $grayLevel = $R * 0.299 + $G * 0.587 + $B * 0.114;
* if ($grayLevel >= 192) {
* // add shadow
* }
*/
private static ArrayList<int[]> getRGB(){
//1. rgb
//2.
//3. rgb
//4. : , rgb
//5. , ;
//6. ,
ArrayList<int[]> colorList=new ArrayList<int[]>();
int[] rgb = getRanRGB();
while (true){
if(isShenRGB(rgb)){
colorList.add(rgb);
break;
}else {
rgb=getRanRGB();
}
}
int[] rgbQ=getRanRGB();
while (true){
if(isShenRGB(rgbQ)){
rgbQ=getRanRGB();
}else {
colorList.add(rgbQ);
break;
}
}
return colorList;
}
/**
*
* @return
*/
private static int[] getRanRGB(){
int [] colors=new int[3];
for(int i=0;iint)(Math.random()*256);
}
return colors;
}
/**
*
* @return
*/
private static boolean isShenRGB(int[] colors){
int grayLevel = (int) (colors[0] * 0.299 + colors[1] * 0.587 + colors[2] * 0.114);
if(grayLevel>=192){
return true;
}
return false;
}
}