打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
java图片处理

1 多张jpg图合成gif动画

 

  1. /**  
  2.      * 把多张jpg图片合成一张  
  3.      * @param pic String[] 多个jpg文件名 包含路径  
  4.      * @param newPic String 生成的gif文件名 包含路径  
  5.      */  
  6.     private synchronized void jpgToGif(String pic[], String newPic) {  
  7.         try {  
  8.             AnimatedGifEncoder e = new AnimatedGifEncoder();  //请见<a href="http://http://blog.csdn.net/ycb1689/article/details/8071733">本博客文章  
  9. </a>           e.setRepeat(0);  
  10.             e.start(newPic);  
  11.             BufferedImage src[] = new BufferedImage[pic.length];  
  12.             for (int i = 0; i < src.length; i++) {  
  13.                 e.setDelay(200); //设置播放的延迟时间  
  14.                 src[i] = ImageIO.read(new File(pic[i])); // 读入需要播放的jpg文件  
  15.                 e.addFrame(src[i]);  //添加到帧中  
  16.             }  
  17.             e.finish();  
  18.         } catch (Exception e) {  
  19.             System.out.println( "jpgToGif Failed:");  
  20.             e.printStackTrace();  
  21.         }  
  22.     }  

2 gif动画分解成多张jpg

  1. /**  
  2.     * 把gif图片按帧拆分成jpg图片           
  3.     * @param gifName String 小gif图片(路径+名称)  
  4.     * @param path String 生成小jpg图片的路径  
  5.     * @return String[] 返回生成小jpg图片的名称  
  6.     */  
  7.    private synchronized String[] splitGif(String gifName,String path) {  
  8.        try {  
  9.            GifDecoder decoder = new GifDecoder();  
  10.            decoder.read(gifName);  
  11.            int n = decoder.getFrameCount(); //得到frame的个数  
  12.            String[] subPic = new String[n];  
  13.            String tag = this.getTag();  
  14.            for (int i = 0; i < n; i++) {  
  15.                BufferedImage frame = decoder.getFrame(i); //得到帧  
  16.                //int delay = decoder.getDelay(i); //得到延迟时间  
  17.                //生成小的JPG文件  
  18.                subPic[i] = path + String.value(i)+ ".jpg";  
  19.                FileOutputStream out = new FileOutputStream(subPic[i]);  
  20.                ImageIO.write(frame, "jpeg", out);  
  21.                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);     
  22.               encoder.encode(frame); //存盘   
  23.               out.flush();   
  24.               out.close();  
  25.            }  
  26.            return subPic;  
  27.        } catch (Exception e) {  
  28.            System.out.println( "splitGif Failed!");  
  29.            e.printStackTrace();  
  30.            return null;  
  31.        }  


 

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


 

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


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

  1. /**  
  2.  * 将多个小图片合成一张大jpg图  (小的jpg图片按照行列顺序平铺)  
  3.  * @param smallJPG ArrayList 一组小的jpg图片  
  4.  * @param bigWidth int 大图宽度  
  5.  * @param smallWidth int  单个文字生成的小图的宽度和高度是一致的  
  6.  * @return   
  7.  */  
  8. private void createBigJPG(ArrayList smallJPG, int bigWidth,  
  9.                             int smallHeigh,Color bgColor ,String picName) {  
  10.     try {  
  11.         if (bigWidth < smallWidth) //如果大图片的高度比小图片的高度还小 直接返回  
  12.             return;  
  13.         int colCount = bigWidth / smallWidth; //每行放置的字数  
  14.         int leftMargin = (int) ((bigWidth - colCount * smallWidth) / 2f); //左边距  
  15.         int rowCount = smallJPG.size();  //小图行数   
  16.         int setWidth = bigWidth; //每列中间不留空隙,只留左右边距  
  17.         int setHeight = smallWidth * rowCount ;   
  18.         //按照大图片宽高绘制一个背景图片  
  19.         BufferedImage bufImage = new BufferedImage(setWidth, setHeight,  
  20.                 BufferedImage.TYPE_INT_RGB);  
  21.         Graphics2D g = bufImage.createGraphics();  
  22.         g.setColor(bgColor); //背景的颜色  
  23.         g.fillRect(0, 0, setWidth, setHeight);  
  24.         int y = 0; //纵坐标  
  25.         for (int i = 0; i < rowCount; i++) { //遍历每行  
  26.             ArrayList col = (ArrayList) (smallJPG.get(i));  
  27.             int x = leftMargin; //横坐标  可能会出现左边距  
  28.             for (int j = 0; j < col.size(); j++) {  
  29.                 String jpgname = (String) (col.get(j));  
  30.                 ImageIcon icon = new ImageIcon(jpgname);  
  31.                 Image img = icon.getImage();  
  32.                 int imgWidth = img.getHeight(null);  
  33.                 g.drawImage(img, x, y, null);  
  34.                 x += imgWidth;  
  35.             }  
  36.             y += (smallWidth);    
  37.         }  
  38.         g.dispose();  
  39.         FileOutputStream out = new FileOutputStream(picName);  //指定输出文件  
  40.         JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);  //设置文件格式  
  41.         JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufImage); //从图片缓冲中读取  
  42.         param.setQuality(50f, true);  
  43.         encoder.encode(bufImage, param); //存盘  
  44.         out.flush();  
  45.         out.close();  
  46.     } catch (Exception e) {  
  47.         System.out.println( "createBigJPG Failed!");  
  48.         e.printStackTrace();      
  49.     }  
  50. }  

注:

(1)AnimatedGifEncoder和GifDecoder,以及这两个类涉及到的相关类,在网上搜索一下就可以找到。

(2)在linux系统下,如果你想支持更多系统外的字体,使用下面两句话,可以不用为系统添加字体,直接把字体文件拷贝到相应位置即可,但是需要jdk1.5环境。
File file = new File(fontPath);  //字体文件
Font font = Font.createFont(Font.TRUETYPE_FONT, file); //根据字体文件所在位置,创建新的字体对象
如果是jdk1.5以下版本则需要为系统添加字体,因为createFont(int fontFormat, File fontFile)
这个方法,是从1.5才开始有的。

(3)g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
我在测试中发现,当设置的字体过大的时候,会出现很明星的锯齿,后来在网上找到了这个解决方法。

(4)有了以上几个方法,就可以做出更好看的闪信了。我也是因为需求才写下这些方法的,美工做了一些热门词汇的gif图片,在短信转彩信遇到这些词汇时,要使用提供的图片替换文字。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
如何在Word中添加字体
Jpgraph的安装与配置使用方法
教你如何更改字体文件在Fonts文件下显示的文件名
WINDOWS系统的字体安装
字体的下载与安装
IDEA使用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服