java将图片进行替换,裁剪,转HTML


前言

之前有一个项目中有一个功能是将一张图片作为基础,将其中的内容进行替换,然后在生成为新的图片,将其进行剪切,并生成到html中。现在有时间将它记录下来。


一、主要的步骤有哪些?

  • 制定上传照片的大小
  • 将照片进行裁剪
  • 把上传图片与模板图片进行替换
  • 将替换好的新图片进行裁剪
  • 生成静态html

二、主要代码

1.指定图片大小

代码如下(示例):

public static void resizeImageByList(List<DataRow> imagePathList) {
        FileOutputStream outputStream = null;
        try {
            String str = MyProps.class.getMethod("getFilepath") + "/" + DateTimeUtil.getNowTimeStr() + ".png";
            logger.debug(str);
            //读入文件
            for (DataRow dataRow:imagePathList) {
            File file = new File(dataRow.getString("iamgeSrc"));
            // 构造Image对象
            BufferedImage src = javax.imageio.ImageIO.read(file);
            // 放大边长
            BufferedImage tag = new BufferedImage(dataRow.getInt("width"), dataRow.getInt("height"), BufferedImage.TYPE_INT_RGB);
            //绘制放大后的图片
            tag.getGraphics().drawImage(src, 0, 0, dataRow.getInt("width"), dataRow.getInt("height"), null);
            outputStream = new FileOutputStream(dataRow.getString("imageDest"));
            ImageIO.write(tag, "png", outputStream);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

2.将照片进行裁剪

代码如下(示例):

public static BufferedImage cutHeadImages(String headUrl,String toPath) {
        BufferedImage avatarImage = null;
        try {
            avatarImage = ImageIO.read(new File(headUrl));
//            avatarImage = scaleByPercentage(avatarImage, avatarImage.getWidth(),  avatarImage.getWidth());
            int width = avatarImage.getWidth();
            // 透明底的图片
            BufferedImage formatAvatarImage = new BufferedImage(width, width, BufferedImage.TYPE_4BYTE_ABGR);
            Graphics2D graphics = formatAvatarImage.createGraphics();
            //把图片切成一个园
            graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            //留一个像素的空白区域,这个很重要,画圆的时候把这个覆盖
            int border = 1;
            //图片是一个圆型
            Ellipse2D.Double shape = new Ellipse2D.Double(border, border, width - border * 2, width - border * 2);
            //需要保留的区域
            graphics.setClip(shape);
            graphics.drawImage(avatarImage, border, border, width - border * 2, width - border * 2, null);
            graphics.dispose();
            //在圆图外面再画一个圆
            //新创建一个graphics,这样画的圆不会有锯齿
            graphics = formatAvatarImage.createGraphics();
            graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            int border1 = 3;
            //画笔是4.5个像素,BasicStroke的使用可以查看下面的参考文档
            //使画笔时基本会像外延伸一定像素,具体可以自己使用的时候测试
            Stroke s = new BasicStroke(5F, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
            graphics.setStroke(s);
            graphics.setColor(Color.WHITE);
            graphics.drawOval(border1, border1, width - border1 * 2, width - border1 * 2);
            graphics.dispose();
            OutputStream os = new FileOutputStream(toPath);//发布项目时,如:Tomcat 他会在服务器本地tomcat webapps文件下创建此文件名
            ImageIO.write(formatAvatarImage, "PNG", os);
            return formatAvatarImage;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

3.把上传图片与模板图片进行替换

代码如下(示例):

public static void mergeBothImageCenterByImageList(String negativeImagePath, List<DataRow> additionImagePathList, String imagePathDest ) {
        FileOutputStream outputStream = null;
        try {
            File file = new File(negativeImagePath);
            BufferedImage negativeBufferImge = ImageIO.read(file);
            logger.debug(file.getName());
            logger.debug(file.getPath());
            logger.debug(file.getAbsolutePath());
            logger.debug(file.getCanonicalPath());
            for (DataRow dataRow:additionImagePathList) {
                BufferedImage additionBufferImage = ImageIO.read(new File(dataRow.getString("imagePath")));
                /**
                 *additionImagePath 绘制在 negativeImagePath 上的 任意位置
                 */
                negativeBufferImge.getGraphics().drawImage(additionBufferImage, dataRow.getInt("x"), dataRow.getInt("y"), null);
            }
            outputStream = new FileOutputStream(imagePathDest);
            /**
             * 输出到文件
             */
            ImageIO.write(negativeBufferImge, "png", outputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

4.将替换好的新图片进行裁剪

代码如下(示例):

 public  List<DataRow> cutImage(String ing) throws IOException {
//        获取图片大小
        File file = new File(ing);
        BufferedImage image = ImageIO.read(file);
        int width = image.getWidth();
        int height = image.getHeight();
//        剪切次数
        int count=0;
//        判断时候够高度
        boolean test = true;

        if(height%200==0){
            count=height/200;
        }else{
            count=(height/200)+1;
            test=false;
        }

        List<DataRow> imageList=new ArrayList<>();
        FileOutputStream fos = null;
        for (int i=0;i<count;i++){
            if(i==count-1&&!test){
//                截切图片
                BufferedImage bufferedImage = OperateImage.cropImage(image, 0, 200*i, 750, height);
                String name =DateTimeUtil.getNowTimeStr()+ i + ".png";
                try {
                    fos = new FileOutputStream(myProps.getFilepath() + "/testimage/" +name);
                    ImageIO.write(bufferedImage,"png", fos);
                    fos.flush();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                DataRow imagedata= new DataRow();
                imagedata.put("url","http://"+myProps.getDomainurl()+ "/image/testimage/"+name);
                imageList.add(imagedata);
            }else{
//                截切图片
                String name =DateTimeUtil.getNowTimeStr()+ i + ".png";
                BufferedImage bufferedImage = OperateImage.cropImage(image, 0, 200*i, 750, (i+1)*200);
                try {
                    fos = new FileOutputStream(myProps.getFilepath() + "/testimage/"+name);
                    ImageIO.write(bufferedImage,"png", fos);
                    fos.flush();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                DataRow imagedata= new DataRow();
                imagedata.put("url","http://"+myProps.getDomainurl()+ "/image/testimage/"+name);
                imageList.add(imagedata);
            }
        }
        fos.close();
        return imageList;
    }

5.生成静态html

代码如下(示例):

 public String insActiveArrticle(List<DataRow> imageList) throws IOException {
        //创建模版加载器
        ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
        resolver.setPrefix("/templates/template/");  //模板文件的所在目录
        resolver.setSuffix(".html");       //模板文件后缀
        //创建模板引擎
        TemplateEngine templateEngine = new TemplateEngine();
        //将加载器放入模板引擎
        templateEngine.setTemplateResolver(resolver);
        //创建字符输出流并且自定义输出文件的位置和文件名
        String name= DateTimeUtil.getNowTimeStr() +".html";
//        String name=myProps.getFilepath()+"/article/测试1.html";
        FileWriter writer = new FileWriter(myProps.getFilepath()+"/article/"+name);
        //创建Context对象(存放Model)
        Context context = new Context();
        //放入数据
        context.setVariable("imageList",imageList);
        //创建静态文件,"text"是模板html名字
        templateEngine.process("test",context,writer);
        return name;
    }

效果图就不展示了。


总结

不是很难,希望对大家有所帮助。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Java提供的图像处理库,比如Java Advanced Imaging (JAI)或者Java ImageIO来编辑图片内容。以下是一个使用Java ImageIO库进行图片编辑的示例代码,包括裁剪、旋、缩放、添加文字和添加水印: ```java import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; public class ImageEditor { public static void main(String[] args) throws Exception { // 读取原始图片 BufferedImage originalImage = ImageIO.read(new File("original.jpg")); // 裁剪图片 int x = 100; int y = 100; int width = 300; int height = 200; BufferedImage croppedImage = originalImage.getSubimage(x, y, width, height); // 旋图片 double angle = Math.toRadians(45); AffineTransform transform = new AffineTransform(); transform.rotate(angle, originalImage.getWidth()/2, originalImage.getHeight()/2); BufferedImage rotatedImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D g = rotatedImage.createGraphics(); g.setTransform(transform); g.drawImage(originalImage, 0, 0, null); // 缩放图片 double scale = 0.5; int newWidth = (int)(originalImage.getWidth() * scale); int newHeight = (int)(originalImage.getHeight() * scale); BufferedImage scaledImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB); g = scaledImage.createGraphics(); g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); g.drawImage(originalImage, 0, 0, newWidth, newHeight, null); // 添加文字 g = originalImage.createGraphics(); Font font = new Font("Arial", Font.BOLD, 24); g.setFont(font); g.setColor(Color.RED); g.drawString("Hello World!", 50, 50); // 添加水印 BufferedImage watermarkImage = ImageIO.read(new File("watermark.png")); int watermarkX = originalImage.getWidth() - watermarkImage.getWidth() - 10; int watermarkY = originalImage.getHeight() - watermarkImage.getHeight() - 10; g.drawImage(watermarkImage, watermarkX, watermarkY, null); // 将编辑后的图片保存到文件 ImageIO.write(croppedImage, "jpg", new File("cropped.jpg")); ImageIO.write(rotatedImage, "jpg", new File("rotated.jpg")); ImageIO.write(scaledImage, "jpg", new File("scaled.jpg")); ImageIO.write(originalImage, "jpg", new File("text.jpg")); } } ``` 运行此代码后,将生成几个编辑后的图片文件。您可以根据需要进行修改和扩展,以执行其他图像编辑操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值