`

JPG/GIF合成和分解

    博客分类:
  • java
阅读更多
关键字: java
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图片 ,在短信转彩信遇到这些词汇时,要使用提供的图片 替换文字

分享到:
评论
1 楼 Jj1105190650 2013-04-09  
gif分解成jpg后,图片的色相不对了,偏红,求解

相关推荐

    gif_合成分解工具,gif_合成分解工具

    在IT领域,GIF(Graphics Interchange Format)是一种常见的图像文件格式,用于在...综上所述,GIF_合成分解工具是数字媒体创作中不可或缺的一部分,它帮助我们轻松地管理和编辑GIF动态图像,满足多样化的创作需求。

    显示JPG/BMP/GIF图片的C++类和带滚动条的窗口类

    "显示JPG/BMP/GIF图片的C++类和带滚动条的窗口类"是一个这样的实现,它提供了对常见图像格式的支持,并且在窗口中添加了滚动条以便查看大图像。下面我们将深入探讨这个主题,主要关注CPicture类和CPictureView类的...

    非常简单的JPG/PNG/GIF转ICO工具

    标题中的“非常简单的JPG/PNG/GIF转ICO工具”是指一个软件或应用程序,它的主要功能是将常见的图像格式如JPEG(JPG)、Portable Network Graphics(PNG)和Graphics Interchange Format(GIF)转换为ICO格式。...

    Webp格式转换工具(PNG/JPG/GIF/Webp互转)

    本工具专注于Webp与其他常见图像格式(PNG、JPG、GIF)之间的相互转换,帮助用户在各种应用场景中灵活运用不同格式的优势。 1. **Webp格式的优势** - **压缩效率高**:Webp采用了先进的有损和无损压缩算法,相比于...

    VC图像显示(BMP/JPG/PNG/GIF)

    在VC++编程环境中,显示BMP、JPG、PNG和GIF等常见图像格式是常见的需求,尤其是在开发图形用户界面的应用程序时。本教程将详细讲解如何在VC++(这里特指VC++ 2010)中使用PictureControl控件来实现这些图像的显示,...

    分解GIF图片、合成GIF图片

    libgif-js:JavaScript GIF 解析器和播放器。 使用libgif-js分解GIF图片。 gif.js:JavaScript GIF 编码库。 使用gif.js合成GIF图片。 demo:处理被分解的GIF每一帧,写入图片、文字数据,生成新的GIF图片。

    makegif 多张jpg合成gif

    将多张jpg合成gif图片 直接将exe放进图片文件夹内,运行即可

    图片转换工具JPG/BMP/ICO/GIF/PNG

    图片转换工具是一款功能强大的软件,专门用于将图片文件在不同格式之间进行转换,如JPG、BMP、ICO、GIF和PNG等。这些格式各有其特点和应用场景,理解它们的差异是使用这类工具的基础。 1. **JPG(Joint ...

    在MFC程序中显示JPG/GIF图像

    如果你是一个使用VB编程的程序员,要在程序中显示JPG或者GIF图像简直易如反掌,将图像控件拖到Form中,分分钟即可搞掂。但是C++程序员要显示同样的图形却没有那么轻松,那么是不是要自己编写JPG解压缩代码呢?当然...

    png是什么格式,png、jpg、gif格式区别.docx

    * GIF 格 式 只 在 简 单 动 画 领 域 有 优 势,但 是 GIF 只 能 显 示 256 种 颜 色。 在 选 择 图 像 格 式 时, 应该 根据 图 像 的 特 性 来 选 择 最佳 的 输 出 格 式。 * 如果 是 照 片, 则 应 该 选 择 ...

    C# 操作gif 合成类

    1. **读取源图像**:使用Image.FromFile()方法读取每个jpg/gif/png文件,确保每个图像都转换为同一尺寸,以便于合成。 2. **创建Bitmap对象**:创建一个新的Bitmap对象,其大小与合成后的GIF相同。这是最终GIF的...

    在MFC程序中显示JPG/GIF图像(299KB)

    MFC提供了CImage类,可以方便地处理位图(BMP)、JPEG(JPG)和GIF等图像格式。在CView派生类中,你可以加载图像资源,如这样: ```cpp CImage image; image.Load(_T("path_to_your_image.jpg")); // 或者 .gif ...

    Gif.js 将多张Jpg图片生成一张Gif图片

    - 图片压缩:在生成GIF前,可以考虑对JPG图片进行压缩,减少传输和存储的大小。 - 参数调整:合理设置GIF的帧延迟和循环次数,可以影响最终文件的大小和播放效果。 6. **兼容性和注意事项** - Gif.js可能不支持...

    C#中用于生成gif或将gif分解成图片的程序

    总结来说,GifCreator是C#开发者处理GIF文件的有力工具,通过它可以方便地进行GIF分解和合成。这个库的使用大大简化了涉及GIF动画的工作流程,提高了开发效率。只需按照上述步骤,开发者就能轻松实现将GIF分解为PNG...

    gif合成器-很有用的工具

    标题中的“gif合成器-很有用的工具”表明这是一个用于创建和编辑GIF动画的软件。GIF(Graphics Interchange Format)是一种常见的图像文件格式,特别适用于制作简短的循环动画,广泛应用于互联网上。 在描述中,...

    C#批量转换图片格式,BMP/JPG/PNG/GIF转换

    摘要:C#源码,图形图像,批量图片格式转换 C#批量转换图片格式,支持的图片格式为:BMP/JPG/PNG/GIF,为了使大批量的图像格式转换变的简单,因此开发出批量图像格式转换工具,图像格式转换主要通过Bitmap类的Save方法...

    gifflen_jpg合成gif_c语言

    在IT行业中,尤其是在移动应用开发领域,图像处理是一项至关重要的技术。...总的来说,"gifflen_jpg合成gif_c语言"是一个很好的实例,展示了如何结合原生代码和跨平台技术解决特定的图像处理问题。

    实现GIF/JPG/PNG文件显示保存程序

    程序可以显示并保持GIF、JPG、PNG格式的文件,附带源代码,绝对值得研究

    易语言GIF帧分解1源码,易语言GIF帧分解1.0

    易语言GIF帧分解1.0是一款专门针对GIF图像格式设计的源代码程序,它提供了对GIF图像帧的处理功能,包括分解GIF图像为单帧图片、保存每一帧以及调整播放速度等。这款工具对于那些需要对GIF进行深入编辑或研究的人来说...

Global site tag (gtag.js) - Google Analytics