`

JPG/GIF合成和分解

 
阅读更多
1 多张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();
        }
    }

2 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;
        }

3 根据提供的文字生成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();
        }
    }

4 多张小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();  
        }
    }

注:

(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图片 ,在短信转彩信遇到这些词汇时,要使用提供的图片 替换文字
分享到:
评论

相关推荐

    多张jpg图合成gif动画.doc

    图像合成是指将多张jpg图像合成一张gif动画,而图像分解是指将一张gif动画分解成多张jpg图像。这两种技术都是图像处理技术的基本应用。 2、AnimatedGifEncoder类:在jpgToGif方法中,我们使用了AnimatedGifEncoder...

    GIF解码和编码操作库源码

    该库可以用于实现 GIF 图像的各种操作,例如将多张 JPG 图像合成一张 GIF 图像、将 GIF 图像分解成多张 JPG 图像等。 在使用该库时,需要先将 JPG 图像读入到 BufferedImage 对象中,然后使用 AnimatedGifEncoder ...

    matlab开发-分解合成特性

    这个压缩包包含了一系列相关的MATLAB文件和资源,旨在帮助我们理解并实践SAR图像的分解与合成特性。 首先,我们看到一个名为"libcong.jpg"的文件,这可能是一个示例图像或相关领域的参考图,用于展示合成孔径雷达的...

    java图片处理

    本文将主要探讨两个核心知识点:如何将多张JPG图片合成一个GIF动画以及如何将一个GIF动画分解成多张JPG图片。 1. **多张JPG图片合成GIF动画** 在Java中,我们可以使用第三方库如`gif4j`来实现这个功能。在提供的...

    VC/VS工具栏图标合成软件

    3. 图片来源可以有很多种格式(例如:*.ICO,*.BMP,*.JPG,*.GIF,*.PNG,*.TIF,...),同时也可以将程序中产生的图像存成多种格式; 4. 自动预览合成的图像,支持图像输出存盘; 5. 自动生成禁止(灰度)图像,支持图像输出...

    JAVA的图象操作工具Version1.0

    "JAVA的图象操作工具Version1.0"是一款基于Java语言开发的图像处理软件,它提供了一系列实用的功能,如合成GIF动图、分解GIF动图、添加水印、批量缩放以及图片切割。下面我们将详细探讨这些功能及其背后的Java图形...

    FlashMX动画教程第6章动画制作概述ppt课件.ppt

    同时,列举了一些常见的图形图像文件格式,如.bmp、.gif、.jpg、.swf等,并给出了它们的特点和用途。 在图形图像的导入方法部分,教程提供了导入和编辑位图的具体步骤,包括“描绘位图”、分解位图、位图填充、编辑...

    工具栏生成器ToolbarCreatorV1.0.rar

    3. 图片来源可以有很多种格式(例如:*.ICO,*.BMP,*.JPG,*.GIF,*.PNG,*.TIF,...),同时也可以将程序中产生的图像存成多种格式; 4. 自动预览合成的图像,支持图像输出存盘; 5. 自动生成禁止(灰度)图像,支持图像输出...

    第七讲 图形画面控件(二).doc

    首先,位图功能允许用户导入和编辑各种格式的图像,如bmp、gif、jpg和png等。在导入位图后,可以通过右键菜单实现复制、显示原始大小或透明显示。透明点位图功能可将指定颜色(默认为白色)变为透明,使背景颜色得以...

    Excel新增工具集

    4、一个工作簿中的各工作表分解为独立的工作簿:将当前工作簿中若干个指定工作表拆分为独立的工作簿,独立的工作簿名称为当前工作簿中工作表的名称。 如下是增加或减少工作表的行列内容的合并或拆分操作: 5、多个...

Global site tag (gtag.js) - Google Analytics