ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

图片水印--小记2

2022-01-20 15:00:08  阅读:151  来源: 互联网

标签:width -- textWidth jpeg int 水印 imageType 小记


有些图片用前面的代码加水印的时候出现位置不对的问题,排查后发现是jpeg格式图片会出现问题

因为jpeg图片的特殊性 导致绘制的水印位置不对,所以要单独对jpeg图片进行处理

记录一下解决方法

1.图片格式识别

 //先获取文件类型
ImageInputStream iis = ImageIO.createImageInputStream(new File(srcPath));
Iterator<ImageReader> imageReaders = ImageIO.getImageReaders(iis);
String imageType = "";
while (imageReaders.hasNext()) {
     ImageReader reader = imageReaders.next();
     imageType = reader.getFormatName().toLowerCase();
        }

String[] imageList  = {"png", "jpeg","jpg","png","bmp"};

List<String> imageArray = Arrays.asList(imageList);
if (!imageArray.contains(imageType)){
   System.out.println(imageType + "文件类型不能转换");
}

2.位置偏移来自于旋转 分别处理

//  旋转文字
AffineTransform affineTransform = g.getTransform();
//不是jpeg格式可以用这个旋转
if (!"jpeg".equals(imageType)){
     affineTransform.rotate(Math.toRadians(-30), 0, 0);
}
Font rotatedFont = font.deriveFont(affineTransform);
//  计算文字宽高度
        FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);
        int textWidth = metrics.stringWidth(content);   //  文字宽度
        int textHeight = metrics.getHeight();   //  文字高度

        //  计算文字坐标
        int x = (width - textWidth) / 2;
        //如果超出图片宽度
        while ((textWidth+x)>width){
            //防止死循环
            if (textWidth>width){
               x = 0;break;
            }
            x = x / 2;
        }
        //水印x轴宽度
        int y_textHeigh = (int) (textWidth  *  Math.cos(Math.toRadians(60.0)));
        int y = (height + y_textHeigh) / 2;

//jpeg单独处理
        if ("jpeg".equals(imageType)){ // 旋转偏移纠正
            //水印旋转y轴高度
            int y_textWidth = (int) (textWidth  *  Math.cos(Math.toRadians(30.0)));
            //图片宽高比
            double wHRatio = width / (double)height ;
            //水印向左偏移量 0.8 是再向左偏移看起来比较好,不乘0.8水印也不会到图片外
            double xLeftMove = ((width - y_textWidth) /2.0)*0.8;
            //宽比高多可以单独处理
            if (wHRatio>1){
                //水印偏移
                g.translate(- ((0.3 * width) - xLeftMove), height * 0.1);
            }else {
                //0.4 和0.5这个数值,是用零点位置和不同图片比例算出来的
                double x_wRatio =  0.4 + (((1 - wHRatio) / 0.3) *0.1);
                double y_hRatio = 0.5 - x_wRatio;
                g.translate(- ((x_wRatio * width)- xLeftMove), height * (y_hRatio<0?0:y_hRatio));
            }
            //旋转30度
            g.rotate(-30*Math.PI/180);
        }
        //绘制水印
        g.drawString(content, x, y);

标签:width,--,textWidth,jpeg,int,水印,imageType,小记
来源: https://www.cnblogs.com/fengdebian/p/15826374.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有