1.多个图片叠加

public static void combineImage(List<String> urlList, int width,
            int height, String destPath, String imgFormat) throws IOException {
        BufferedImage combinedImage = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_ARGB);
        Graphics g = combinedImage.getGraphics();
        for (String urlStr : urlList) {
            URL url = new URL(urlStr);
            URLConnection conn = url.openConnection();
            conn.setReadTimeout(10 * 1000);
            InputStream in = conn.getInputStream();
            BufferedImage image = ImageIO.read(in);
            g.drawImage(image, 0, 0, width, height, null);
        }
        ImageIO.write(combinedImage, imgFormat, new File(destPath));
}

2.根据指定字符串生成图片

//根据str,font的样式以及输出文件目录
public static void createImage(String str,Font font,File outFile) throws Exception{
  //获取font的样式应用在str上的整个矩形
  Rectangle2D r=font.getStringBounds(str, new FontRenderContext(AffineTransform.getScaleInstance(1, 1),false,false));
  int unitHeight=(int)Math.floor(r.getHeight());//获取单个字符的高度
  //获取整个str用了font样式的宽度这里用四舍五入后+1保证宽度绝对能容纳这个字符串作为图片的宽度
  int width=(int)Math.round(r.getWidth())+1;
  int height=unitHeight+3;//把单个字符的高度+3保证高度绝对能容纳字符串作为图片的高度
  //创建图片
  BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
  Graphics g=image.getGraphics();
  g.setColor(Color.WHITE);
  g.fillRect(0, 0, width, height);//先用白色填充整张图片,也就是背景
  g.setColor(Color.black);//在换成黑色
  g.setFont(font);//设置画笔字体
  g.drawString(str, 0, font.getSize());//画出字符串
  g.dispose();
  ImageIO.write(image, "png", outFile);//输出png图片
}

3.多张小jpg图合成一张大JPG图,在这里对大图只作宽度限制,不做高度限制

/**
     * 将多个小图片合成一张大jpg图  (小的jpg图片按照行列顺序平铺)
     * @param smallJPG ArrayList 一组小的jpg图片
     * @param bigWidth int 大图宽度
     * @param smallWidth int  单个文字生成的小图的宽度和高度是一致的
     * @return 
     */
    private void createBigJPG(ArrayList smallJPG, int bigWidth,
                                int smallHeigh,Color bgColor ,String picName) {
        try {
            if (bigWidth < smallWidth) //如果大图片的高度比小图片的高度还小 直接返回
                return;
            int colCount = bigWidth / smallWidth; //每行放置的字数
            int leftMargin = (int) ((bigWidth - colCount * smallWidth) / 2f); //左边距
            int rowCount = smallJPG.size();  //小图行数 
            int setWidth = bigWidth; //每列中间不留空隙,只留左右边距
            int setHeight = smallWidth * rowCount ; 
            //按照大图片宽高绘制一个背景图片
            BufferedImage bufImage = new BufferedImage(setWidth, setHeight,
                    BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bufImage.createGraphics();
            g.setColor(bgColor); //背景的颜色
            g.fillRect(0, 0, setWidth, setHeight);
            int y = 0; //纵坐标
            for (int i = 0; i < rowCount; i++) { //遍历每行
                ArrayList col = (ArrayList) (smallJPG.get(i));
                int x = leftMargin; //横坐标  可能会出现左边距
                for (int j = 0; j < col.size(); j++) {
                    String jpgname = (String) (col.get(j));
                    ImageIcon icon = new ImageIcon(jpgname);
                    Image img = icon.getImage();
                    int imgWidth = img.getHeight(null);
                    g.drawImage(img, x, y, null);
                    x += imgWidth;
                }
                y += (smallWidth);  
            }
            g.dispose();
            FileOutputStream out = new FileOutputStream(picName);  //指定输出文件
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);  //设置文件格式
            JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufImage); //从图片缓冲中读取
            param.setQuality(50f, true);
            encoder.encode(bufImage, param); //存盘
            out.flush();
            out.close();
        } catch (Exception e) {
            System.out.println( "createBigJPG Failed!");
            e.printStackTrace();    
        }
    }

4.根据提供的文字生成jpg图片

/**
     * 根据提供的文字生成jpg图片
     * @param s String  文字
     * @param smallWidth int  每个字的宽度和高度是一样的
     * @param bgcolor Color  背景色
     * @param fontcolor Color  字色
     * @param fontPath String 字体文件
     * @param jpgname String jpg图片名
     * @return
     */
    private String createJpgByFont(String s, int smallWidth,Color bgcolor,Color fontcolor,String fontPath,String jpgname) {
        try {
            BufferedImage bimage = new BufferedImage(s.length()*smallWidth,
                                                         smallWidth,BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bimage.createGraphics();
            g.setColor(bgcolor); //背景色
            g.fillRect(0, 0, smallWidth, smallWidth); //画一个矩形
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); //去除锯齿(当设置的字体过大的时候,会出现锯齿)
            g.setColor(fontcolor); //字的颜色
            File file = new File(fontPath);  //字体文件
            Font font = Font.createFont(Font.TRUETYPE_FONT, file); //根据字体文件所在位置,创建新的字体对象(此语句在jdk1.5下面才支持)  
            g.setFont(font.deriveFont((float) smallWidth));   //font.deriveFont(float f)复制当前 Font 对象并应用新设置字体的大小
            g.drawString(s,0, smallWidth); //在指定坐标除添加文字
            g.dispose();
            FileOutputStream out = new FileOutputStream(jpgname); //指定输出文件
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bimage);
            param.setQuality(50f, true);
            encoder.encode(bimage, param); //存盘
            out.flush();
            out.close();
        } catch (Exception e) {
            System.out.println( "createJpgByFont Failed!");
            e.printStackTrace();
        }
    }

5.gif动画分解成多张jpg

/**  
    * 把gif图片按帧拆分成jpg图片           
    * @param gifName String 小gif图片(路径+名称)  
    * @param path String 生成小jpg图片的路径  
    * @return String[] 返回生成小jpg图片的名称  
    */  
   private synchronized String[] splitGif(String gifName,String path) {  
       try {  
           GifDecoder decoder = new GifDecoder();  
           decoder.read(gifName);  
           int n = decoder.getFrameCount(); //得到frame的个数  
           String[] subPic = new String[n];  
           String tag = this.getTag();  
           for (int i = 0; i < n; i++) {  
               BufferedImage frame = decoder.getFrame(i); //得到帧  
               //int delay = decoder.getDelay(i); //得到延迟时间  
               //生成小的JPG文件  
               subPic[i] = path + String.value(i)+ ".jpg";  
               FileOutputStream out = new FileOutputStream(subPic[i]);  
               ImageIO.write(frame, "jpeg", out);  
               JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);     
              encoder.encode(frame); //存盘   
              out.flush();   
              out.close();  
           }  
           return subPic;  
       } catch (Exception e) {  
           System.out.println( "splitGif Failed!");  
           e.printStackTrace();  
           return null;  
       }    }

6.多张jpg图合成gif动画

/**  
     * 把多张jpg图片合成一张  
     * @param pic String[] 多个jpg文件名 包含路径  
     * @param newPic String 生成的gif文件名 包含路径  
     */  
    private synchronized void jpgToGif(String pic[], String newPic) {  
        try {  
            AnimatedGifEncoder e = new AnimatedGifEncoder();                e.setRepeat(0);  
            e.start(newPic);  
            BufferedImage src[] = new BufferedImage[pic.length];  
            for (int i = 0; i < src.length; i++) {  
                e.setDelay(200); //设置播放的延迟时间  
                src[i] = ImageIO.read(new File(pic[i])); // 读入需要播放的jpg文件  
                e.addFrame(src[i]);  //添加到帧中  
            }  
            e.finish();  
        } catch (Exception e) {  
            System.out.println( "jpgToGif Failed:");  
            e.printStackTrace();  
        }  
    }

JAVA图片处理大全相关推荐

  1. [转载] Java面试题大全(2020版)

    参考链接: Java中的循环 发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~ 本套Java面试题大全,全的不能再全,哈哈~ 博主已将以 ...

  2. java(5)---Java基础知识大全

    Java基础知识大全 一.基础知识:  1.JVM.JRE和JDK的区别:  JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性.  java语言是跨平 ...

  3. Java面试题大全(Android版)

    疯狂Java面试题大全(Android版) Java核心技术部分 Java核心技术部分的面试题,可能覆盖Java基本语法.面向对象(包括类定义.方法.构造器.递归.继承.抽象类.接口.枚举以及fina ...

  4. 读取Java文件到byte数组的三种方式及Java文件操作大全(包括文件加密,String加密)

    读取Java文件到byte数组的三种方式 package zs;import java.io.BufferedInputStream; import java.io.ByteArrayOutputSt ...

  5. Java面试题大全(2020版)

    发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~ 本套Java面试题大全,全的不能再全,哈哈~ 博主已将以下这些面试题整理成了一个Jav ...

  6. Java范例开发大全源程序

    Java范例开发大全源程序下载链接: http://download.csdn.net/detail/miniapp/3735617 想要订购折扣杂志吗?那就猛点这里吧 目 录 第1篇 Java编程基 ...

  7. 转载java基础总结大全(使用)

    原文地址 Java基础总结大全(实用) 一.基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. jav ...

  8. 疯狂Java面试题大全(Android版)

    疯狂Java面试题大全(Android版) 本大全每个月会定期更新,索取网址:http://www.fkjava.org Java核心技术部分 Java核心技术部分的面试题,可能覆盖Java基本语法. ...

  9. java面试题大全必备神器

    Java面试题大全 一.JavaSE 部分 基础部分 Java中基本数据类型有哪些? byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间. short:16位, int:32 ...

最新文章

  1. jQuery UI vs Kendo UI jQuery Mobile vs Kendo UI Mobile
  2. static 函数和普通函数
  3. TCP/IP之TCP连接的建立与中止状态分析
  4. 实验详解——DNS反向解析、DNS主服务器和从服务器的配置
  5. html5着陆页模板,多用途着陆页HTML模板
  6. 第九节:ES6为对象做了哪些扩展?
  7. python3-Django3-网站模板
  8. php打印出网站源码/php数据压缩代码
  9. 谁给讲讲语音识别中的CTC方法的基本原理?
  10. win10c盘扩容_Win10磁盘分区工具-无损分区助手
  11. 由旋转矩阵反算旋转角度
  12. mfs java_mfs分布式文件系统部署过程
  13. [ 代码审计篇 ] 代码审计思路 详解
  14. 苹果手机支持鸿蒙,除了苹果,这四款华为也能三年不卡,还能升级鸿蒙
  15. 第八届蓝桥杯Java A组决赛第一题
  16. 从视频中提取帧图片FFmpeg / 根据文件名提取图片
  17. html5在线显示word文档,JS实现获取word文档内容并输出显示到html页面示例
  18. HTML5、CSS3进阶——渐变背景
  19. pytorch之深度神经网络概念全面整理
  20. Packet Data Convergence Protocol (PDCP)阅读笔记

热门文章

  1. 2022年中国企业500强研究报告
  2. 港科夜闻丨香港科大团队JACS:一锅法合成含氮阳离子的多功能聚电解质
  3. kibana Discover界面出No results found
  4. C语言中 -> 是什么意思?
  5. 【高级篇 / SDWAN】(7.0) ❀ 08. 访问指定网站最快的宽带优先上网 ❀ FortiGate 防火墙
  6. JavaScript--简单案例
  7. 最短路径flody算法
  8. speedoffice(Excel)如何插入子表?
  9. python脚本案例-python脚本范例
  10. RStudio 清除历史记录,变量,窗口