图片加水印后,解决ImageIo.write图片质量变模糊

您所在的位置:网站首页 手机裁剪之后照片不清楚 图片加水印后,解决ImageIo.write图片质量变模糊

图片加水印后,解决ImageIo.write图片质量变模糊

2024-07-11 23:40| 来源: 网络整理| 查看: 265

项目中使用到的是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方式,这下保存下来的图片肉眼上不仔细看,根本看不出来模糊了,哈哈。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3