在一张大图上添加小图及文字
import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageDecoder; import com.sun.image.codec.jpeg.JPEGImageEncoder; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import java.text.ParseException; public class ImgUtil { public static void main(String[] args) throws ParseException { String bigImg = "C:\\Users\\langz\\Desktop\\ffff\\big.jpg"; String smallImg = "C:\\Users\\langz\\Desktop\\ffff\\small.jpg"; String content = "好久不见,你还好吗"; String outPath = "C:\\Users\\langz\\Desktop\\ffff\\" + System.currentTimeMillis() + ".jpg"; try { bigImgAddSmallImgAndText(bigImg, smallImg, 500, 500, null, 200, 200, outPath); } catch (IOException e) { e.printStackTrace(); } } /*** * 在一张大图张添加小图和文字 * @param bigImgPath 大图的路径 * @param smallImgPath 小图的路径 * @param sx 小图在大图上x抽位置 * @param sy 小图在大图上y抽位置 * @param content 文字内容 * @param cx 文字在大图上y抽位置 * @param cy 文字在大图上y抽位置 * @param outPathWithFileName 结果输出路径 */ public static void bigImgAddSmallImgAndText(String bigImgPath , String smallImgPath, int sx, int sy , String content, int cx, int cy , String outPathWithFileName) throws IOException { //主图片的路径 InputStream is = new FileInputStream(bigImgPath); //通过JPEG图象流创建JPEG数据流解码器 JPEGImageDecoder jpegDecoder = JPEGCodec.createJPEGDecoder(is); //解码当前JPEG数据流,返回BufferedImage对象 BufferedImage buffImg = jpegDecoder.decodeAsBufferedImage(); //得到画笔对象 Graphics g = buffImg.getGraphics(); //小图片的路径 ImageIcon imgIcon = new ImageIcon(smallImgPath); //得到Image对象。 Image img = imgIcon.getImage(); //将小图片绘到大图片上,5,300 .表示你的小图片在大图片上的位置。 g.drawImage(img, sx, sy, null); //设置颜色。 g.setColor(Color.WHITE); //最后一个参数用来设置字体的大小 if (content != null) { Font f = new Font("宋体", Font.PLAIN, 25); Color mycolor = Color.red;//new Color(0, 0, 255); g.setColor(mycolor); g.setFont(f); g.drawString(content, cx, cy); //表示这段文字在图片上的位置(cx,cy) .第一个是你设置的内容。 } g.dispose(); OutputStream os = new FileOutputStream(outPathWithFileName); //创键编码器,用于编码内存中的图象数据。 JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(os); en.encode(buffImg); is.close(); os.close(); } }
实现给图片添加水印
某些应用场景下需要对图片加上水印防止盗用,例如微博用户图片。Java中实现添加水印需要用到BufferedImage、Graphics2D 和ImageIO类。
1. 添加文字水印
import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import javax.imageio.ImageIO; /** * 添加文字水印 * * @author Ricky Fung */ public class TextMarkProcessor { /** * @param args */ public static void main(String[] args) { new TextMarkProcessor().testTextMark(); } public void testTextMark() { File srcImgFile = new File("D:/test/desktop.png"); String logoText = "[ 天使的翅膀 ]"; File outputRotateImageFile = new File("D:/test/desktop_text_mark.jpg"); createWaterMarkByText(srcImgFile, logoText, outputRotateImageFile, 0); } public void createWaterMarkByText(File srcImgFile, String logoText, File outputImageFile, double degree) { OutputStream os = null; try { Image srcImg = ImageIO.read(srcImgFile); BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB); Graphics2D graphics = buffImg.createGraphics(); graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); graphics.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null); if (degree>0) { graphics.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2); } graphics.setColor(Color.RED); graphics.setFont(new Font("宋体", Font.BOLD, 36)); float alpha = 0.8f; graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); graphics.drawString(logoText, buffImg.getWidth()/3, buffImg.getHeight()/2); graphics.dispose(); os = new FileOutputStream(outputImageFile); // 生成图片 ImageIO.write(buffImg, "JPG", os); } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != os) os.close(); } catch (Exception e) { e.printStackTrace(); } } } }
2. 添加图片水印
import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import javax.imageio.ImageIO; import javax.swing.ImageIcon; /** * 添加图片水印 * * @author Ricky Fung */ public class PictureMarkProcessor { /** * @param args */ public static void main(String[] args) { new PictureMarkProcessor().testPictureMark(); } public void testPictureMark() { File srcImageFile = new File("D:/test/desktop.png"); File logoImageFile = new File("D:/test/tools.png"); File outputRoateImageFile = new File("D:/test/desktop_pic_mark.jpg"); createWaterMarkByIcon(srcImageFile, logoImageFile, outputRoateImageFile, 0); } public void createWaterMarkByIcon(File srcImageFile, File logoImageFile, File outputImageFile, double degree) { OutputStream os = null; try { Image srcImg = ImageIO.read(srcImageFile); BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB); Graphics2D graphics = buffImg.createGraphics(); graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); graphics.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null); ImageIcon logoImgIcon = new ImageIcon(ImageIO.read(logoImageFile)); Image logoImg = logoImgIcon.getImage(); //旋转 if (degree>0) { graphics.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getWidth() / 2); } float alpha = 0.8f; // 透明度 graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); //水印 的位置 graphics.drawImage(logoImg, buffImg.getWidth()/3, buffImg.getHeight()/2, null); graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); graphics.dispose(); os = new FileOutputStream(outputImageFile); // 生成图片 ImageIO.write(buffImg, "JPG", os); } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != os) os.close(); } catch (Exception e) { e.printStackTrace(); } } } }
实现效果如下:
原图:
加文字水印:
加图片水印:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。