Heim > Java > JavaErste Schritte > Hauptteil

Java implementiert das Hinzufügen von Bildwasserzeichen zu Bildern

王林
Freigeben: 2020-05-08 16:42:55
nach vorne
2711 Leute haben es durchsucht

Java implementiert das Hinzufügen von Bildwasserzeichen zu Bildern

Spezifischer Code:

 // 水印透明度
    private static float alpha = 0.5f;
    
       /**
     * 给图片添加水印图片、可设置水印图片旋转角度
     *
     * @param iconPath   水印图片路径
     * @param srcImgPath 源图片路径
     * @param location   水印图片位置
     * @param degree     水印图片旋转角度
     */
    public static void markImageByIcon(HttpServletRequest request, HttpServletResponse response,
                                       String iconPath, String srcImgPath, String location, Integer degree) {
        OutputStream os = null;
        try {

            Image srcImg = ImageIO.read(new File(srcImgPath));

            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
                    srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);

            // 得到画笔对象
            Graphics2D g = buffImg.createGraphics();

            // 设置对线段的锯齿状边缘处理
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);

            g.drawImage(
                    srcImg.getScaledInstance(srcImg.getWidth(null),
                            srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
                    null);

            // 设置水印旋转角度(默认对角线角度)
            if (null != degree) {
                g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);
            } else {
                //根据三角形相关定理,计算对角线角度
                double lengthOfDiagonal = Math.sqrt(buffImg.getWidth() * buffImg.getWidth() + buffImg.getHeight() * buffImg.getHeight());
                double v = (Math.pow(buffImg.getWidth(), 2) + Math.pow(lengthOfDiagonal, 2) - Math.pow(buffImg.getHeight(), 2)) / (2 * buffImg.getWidth() * lengthOfDiagonal);
                double acos = Math.acos(v);
                double myDegree = Math.toDegrees(acos);
                g.rotate(-Math.toRadians(myDegree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);
            }

            // 水印图片的路径 水印图片一般为gif或者png的,这样可设置透明度
            ImageIcon imgIcon = new ImageIcon(iconPath);
            Image img = imgIcon.getImage();
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
                    alpha));

            // 水印图片的位置
            int x = 0, y = 0;
            if (StringUtils.equals(location, "left-top")) {
                x = 30;
                y = 30;
            } else if (StringUtils.equals(location, "right-top")) {
                x = buffImg.getWidth() - img.getWidth(null) - 30;
                y = 30;
            } else if (StringUtils.equals(location, "left-bottom")) {
                x += 30;
                y = buffImg.getHeight() - img.getHeight(null) - 30;
            } else if (StringUtils.equals(location, "right-bottom")) {
                x = buffImg.getWidth() - img.getWidth(null) - 30;
                y = buffImg.getHeight() - img.getHeight(null) - 30;
            } else {
                x = (buffImg.getWidth() - img.getWidth(null)) / 2;
                y = (buffImg.getHeight() - img.getHeight(null)) / 2;
            }
            g.drawImage(img, x, y, null);
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
            g.dispose();

            // os = new FileOutputStream(targerPath);
            os = response.getOutputStream();
            ImageIO.write(buffImg, "JPG", os);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != os)
                    os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
Nach dem Login kopieren

(Video-Tutorial-Empfehlung: Java-Video)

smbfile kann auch so geschrieben werden:

// 展示时 添加水印
	public void showRemarkImage(String filePath, String iconPath, HttpServletRequest request, HttpServletResponse response) {
		InputStream is = null;
		OutputStream os = null;
		ByteArrayOutputStream out = new ByteArrayOutputStream();  
		try {
			SmbFile smbFile = new SmbFile(filePath);
			is = smbFile.getInputStream();
			os = response.getOutputStream();
			
			Image srcImg = ImageIO.read(is);
            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
                    srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
            // 得到画笔对象
            Graphics2D g = buffImg.createGraphics();
            // 设置对线段的锯齿状边缘处理
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);

            g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);
                     
            // 旋转角度处理(根据三角形相关定理,计算对角线角度)
//            double lengthOfDiagonal = Math.sqrt(buffImg.getWidth() * buffImg.getWidth() + buffImg.getHeight() * buffImg.getHeight());
//            double v = (Math.pow(buffImg.getWidth(), 2) + Math.pow(lengthOfDiagonal, 2) - Math.pow(buffImg.getHeight(), 2)) / (2 * buffImg.getWidth() * lengthOfDiagonal);
//            double acos = Math.acos(v);
//            double myDegree = Math.toDegrees(acos);
//            g.rotate(-Math.toRadians(myDegree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);            
          
            // 水印图片的路径 水印图片一般为gif或者png的,这样可设置透明度
            ImageIcon imgIcon = new ImageIcon(iconPath);
            Image img = imgIcon.getImage();
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
            // 水印图片居中
            int x = 0, y = 0;       
            x = (buffImg.getWidth() - img.getWidth(null)) / 2;
            y = (buffImg.getHeight() - img.getHeight(null)) / 2;          
            g.drawImage(img, x, y, null);
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
            g.dispose();
                       
	        ImageIO.write(buffImg, "png", out); 
	        byte[] b = out.toByteArray();
			response.addHeader("Content-Length", String.valueOf(b.length));	      	
			os.write(b, 0, b.length);
			os.flush();	      	    
         
		} catch (Exception e) {
			LogUtil.error("附件下载失败,时间:" + DateUtil.formatToDateTimeText(new Date()) + "原因:" + e.getMessage());
//			throw new ApplicationException("文件读取失败:" + e.getMessage(), e);
		} finally {
			IOUtils.closeQuietly(is);
			IOUtils.closeQuietly(os);
			IOUtils.closeQuietly(out);
		}
	}
Nach dem Login kopieren

Empfohlenes Tutorial: Java-Einstiegsprogramm

Das obige ist der detaillierte Inhalt vonJava implementiert das Hinzufügen von Bildwasserzeichen zu Bildern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage