Java 文字转图片输出,Java 输出透明背景图片,Java文字转图片防爬虫
最近部分页面数据被爬虫疯狂的使用,主要就是采用动态代理IP爬取数据,主要是不控制频率,这个最恶心。因为对方是采用动态代理的方式,所以没什么特别好的防止方式。
具体防止抓取数据方案大全,下篇博客我会做一些讲解。本篇也是防爬虫的一个方案。就是部分核心文字采用图片输出。加大数据抓取方的成本。
图片输出需求
上图红色圈起来的数据为图片输出了备案号,就是要达到这个效果,如果数据抓取方要继续使用,必须做图片解析,成本和难度都加到了。也就是我们达到的效果了。
Java代码实现
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.file.Paths;
public class ImageDemo {
public static void main(String[] args) throws Exception {
System.out.println(System.currentTimeMillis());
//输出目录
String rootPath = "/Users/sojson/Downloads/";
//这里文字的size,建议设置大一点,其实就是像素会高一点,然后缩放后,效果会好点,最好是你实际输出的倍数,然后缩放的时候,直接按倍数缩放即可。
Font font = new Font("微软雅黑", Font.PLAIN, 130);
createImage("https://www.sojson.com", font, Paths.get(rootPath, "sojson-image.png").toFile());
}
private static int[] getWidthAndHeight(String text, Font font) {
Rectangle2D r = font.getStringBounds(text, new FontRenderContext(
AffineTransform.getScaleInstance(1, 1), false, false));
int unitHeight = (int) Math.floor(r.getHeight());//
// 获取整个str用了font样式的宽度这里用四舍五入后+1保证宽度绝对能容纳这个字符串作为图片的宽度
int width = (int) Math.round(r.getWidth()) + 1;
// 把单个字符的高度+3保证高度绝对能容纳字符串作为图片的高度
int height = unitHeight + 3;
return new int[]{width, height};
}
// 根据str,font的样式以及输出文件目录
public static void createImage(String text, Font font, File outFile)
throws Exception {
// 获取font的样式应用在输出内容上整个的宽高
int[] arr = getWidthAndHeight(text, font);
int width = arr[0];
int height = arr[1];
// 创建图片
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_BGR);//创建图片画布
//透明背景 the begin
Graphics2D g = image.createGraphics();
image = g.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
g=image.createGraphics();
//透明背景 the end
/**
如果你需要白色背景或者其他颜色背景可以直接这么设置,其实就是满屏输出的颜色
我这里上面设置了透明颜色,这里就不用了
*/
//g.setColor(Color.WHITE);
//画出矩形区域,以便于在矩形区域内写入文字
g.fillRect(0, 0, width, height);
/**
* 文字颜色,这里支持RGB。new Color("red", "green", "blue", "alpha");
* alpha 我没用好,有用好的同学可以在下面留言,我开始想用这个直接输出透明背景色,
* 然后输出文字,达到透明背景效果,最后选择了,createCompatibleImage Transparency.TRANSLUCENT来创建。
* android 用户有直接的背景色设置,Color.TRANSPARENT 可以看下源码参数。对alpha的设置
*/
g.setColor(Color.gray);
// 设置画笔字体
g.setFont(font);
// 画出一行字符串
g.drawString(text, 0, font.getSize());
// 画出第二行字符串,注意y轴坐标需要变动
g.drawString(text, 0, 2 * font.getSize());
//执行处理
g.dispose();
// 输出png图片,formatName 对应图片的格式
ImageIO.write(image, "png", outFile);
}
}输出图片效果:
当然我这里是做了放缩,要不然效果没那么好。
注意点:
其实代码里注释说的已经比较清楚了。主要设置透明色这里。
//透明背景 the begin
Graphics2D g = image.createGraphics();
image = g.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
g=image.createGraphics();
//透明背景 the endAndroid 参考的颜色值
android.graphics.Color 包含颜色值
Color.BLACK 黑色
Color.BLUE 蓝色
Color.CYAN 青绿色
Color.DKGRAY 灰黑色
Color.GRAY 灰色
Color.GREEN 绿色
Color.LTGRAY 浅灰色
Color.MAGENTA 红紫色
Color.RED 红色
Color.TRANSPARENT 透明
Color.WHITE 白色
Color.YELLOW 黄色版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/321.html
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。
