项目中使用到的是Graphics2D画图工具对图片处理,用ImageIO.write输出图片流的,但是发现如果是人像的话,图片质量前后相差太大,最后用ImageWriter方式会好很多。 修改前代码
/**
* 给图片添加文字水印
*
* @param pressText 水印文字
* @param srcImageFile 源图像地址
* @param destImageFile 目标图像地址
* @param fontName 字体名称
* @param fontStyle 字体样式
* @param color 字体颜色
* @param fontSize 字体大小
* @param x 修正值
* @param y 修正值
* @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
*/
public final static void pressText2(String pressText, String srcImageFile, String destImageFile, String fontName, int fontStyle, Color color, int fontSize, int x, int y, float alpha, int wz) {
try {
Image src = toBufferedImage(srcImageFile);
int width = src.getWidth(null);
int height = src.getHeight(null);
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.drawImage(src, 0, 0, width, height, null);
g.setColor(color);
g.setFont(new Font(fontName, fontStyle, fontSize));
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
Map map = getPoint(width, (getLength(pressText) * fontSize), height, fontSize, wz, x, y);
// 在指定坐标绘制水印文字
g.drawString(pressText, map.get("_x"), map.get("_y") + fontSize);
g.dispose();
ImageIO.write((BufferedImage) image, "JPG", new File(destImageFile));
} catch (Exception e) {
e.printStackTrace();
}
}
Graphics2D 这里已经是优化后的写法,图片不会失真,经过ImageIO.write后保存下来的图片还是有点模糊 优化后的代码
/**
* 给图片添加文字水印
*
* @param pressText 水印文字
* @param srcImageFile 源图像地址
* @param destImageFile 目标图像地址
* @param fontName 字体名称
* @param fontStyle 字体样式
* @param color 字体颜色
* @param fontSize 字体大小
* @param x 修正值
* @param y 修正值
* @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
*/
public final static void pressText2(String pressText, String srcImageFile, String destImageFile, String fontName, int fontStyle, Color color, int fontSize, int x, int y, float alpha, int wz) {
try {
Image src = toBufferedImage(srcImageFile);
int width = src.getWidth(null);
int height = src.getHeight(null);
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.drawImage(src, 0, 0, width, height, null);
g.setColor(color);
g.setFont(new Font(fontName, fontStyle, fontSize));
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
Map map = getPoint(width, (getLength(pressText) * fontSize), height, fontSize, wz, x, y);
// 在指定坐标绘制水印文字
g.drawString(pressText, map.get("_x"), map.get("_y") + fontSize);
g.dispose();
Iterator iter = ImageIO.getImageWritersByFormatName("jpg");
if (iter.hasNext()) {
ImageWriter writer = iter.next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(1.0f); //最高质量
File file=new File(destImageFile);
FileImageOutputStream out = new FileImageOutputStream(file);
writer.setOutput(out);
// writer.write(bi);
writer.write(null, new IIOImage((BufferedImage) image, null, null), param);
out.close();
writer.dispose();
}
//ImageIO.write((BufferedImage) image, "JPG", new File(destImageFile));
} catch (Exception e) {
e.printStackTrace();
}
}
替换掉ImageIO.write方式,这下保存下来的图片肉眼上不仔细看,根本看不出来模糊了,哈哈。
|