`

几种图像处理

 
阅读更多
这几天一直在做图片处理,其中遇到了一些问题,在网上也找到了解决办法(虽然不是最佳的),在这里还是作个记录吧。

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



分享到:
评论

相关推荐

    几种图像处理的VC源代码

    在给定的“几种图像处理的VC源代码”中,我们涵盖了几个关键的图像处理算法,这些算法都是用C++语言实现,并且基于Visual C++(VC++)环境。下面我们将详细介绍每个算法及其在图像处理中的应用。 1. **高斯平滑**:...

    ImageDeal几种图像处理算法

    在图像处理领域,ImageDeal是一种可能的库或工具,它提供了对图像进行各种操作的功能。在给定的标题和描述中,提到了四种特定的图像处理算法:Gray、Reverse、Smooth和Nihong。让我们详细了解一下这些算法及其在图像...

    用卷积滤波器matlab代码-Image_processing_utils:为Matlab/Octave编写的几种图像处理实用程序

    Octave编写的几种图像处理实用程序(代码已注释): distort.m-功能,使具有高斯模糊核和加性高斯噪声的灰度输入图像失真。 为了避免由FFT卷积引起的振铃伪像,对称地填充了图像。 dcnvwiener.m-维纳反卷积,用于...

    图像直方图均衡化算法matlab代码-Image-Processing:用matlab编写的几种图像处理功能的集合

    几种图像处理功能的集合。 每个文件夹都包含该功能的Matlab代码,该功能的测试驱动程序以及一个或多个测试映像。 对比度增强:使用直方图均衡功能以增加图像对比度的功能。 分别编写了彩色和灰度图像的独立功能以及...

    图像处理中几个关键算法的研究.docx

    本文将介绍几种图像处理中的关键算法,包括直方图均衡化、滤波、边缘检测、形态学处理和深度学习算法等,并探讨它们的应用和优缺点。 1. 直方图均衡化 直方图均衡化是一种常用的增强算法。它的主要思想是将原始...

    图像处理程序

    根据给定的信息,本文将对图像处理中的几个关键算法...以上就是对给定文件中所涉及的几种图像处理技术的详细解释。这些技术都是图像处理领域中非常基础且重要的部分,对于理解后续更复杂的图像处理算法具有重要意义。

    MATLAB图像处理实例详解_MATLAB图像处理实例详解_matlab图像处理_

    在图像处理领域,MATLAB是一种广泛使用的工具,其强大的功能和直观的编程环境深受科研人员和工程师的喜爱。本文将深入探讨“MATLAB图像处理实例详解”这一主题,旨在帮助读者理解并掌握MATLAB在图像处理中的应用。 ...

    2VC 与MATLAB混合编程方法在图像处理中的应用.pdf

    文章还提到了其他几种图像处理功能,包括图像滤波、边缘提取、图像二值化和图像变色等,这些功能的实现方法与图像反色类似。 总体来看,VC++与MATLAB的混合编程为图像处理提供了强大的工具,使得开发者可以结合两者...

    数字图像处理 许录平

    在数字图像处理中,我们通常会涉及以下几个关键领域: 1. 图像增强:通过调整图像的亮度、对比度、锐化等属性,改善图像的视觉效果,使其更易于观察和分析。例如,直方图均衡化是一种常见的对比度增强技术。 2. ...

    一个图像处理的毕业设计

    在这个毕业设计中,可能实施了几种常见的滤波技术,如: 1. 均值滤波:这是一种线性滤波方法,通过在像素周围区域取平均值来平滑图像。虽然可以有效去除高斯噪声,但可能会导致图像细节的丢失。 2. 中值滤波:这是...

    常用图像处理算法pdf

    数字图像处理是图像处理的一种形式,它利用数字计算来处理图像,相比传统的模拟图像处理,具有更高的精度和灵活性。在数字图像处理中,图像通常被表示为二维矩阵,每个元素代表一个像素的亮度或颜色值。常见的数字...

    几种常用图像处理算法

    本文将深入探讨几种常用的图像处理算法,这些算法在图像识别、图像分析、医疗影像处理、安全监控等多个领域都有广泛应用。 1. **滤波器**:滤波器是图像处理中最基础的操作之一,主要用于去除噪声或平滑图像。常见...

    探地雷达图像数据处理及应用研究.pdf

    在图像处理方面,本文也提出了几种图像处理方法,以提高图像的分辨率和目标识别的准确性。这些方法包括图像滤波、图像增强和图像分割等。 本文对探地雷达数据处理技术进行了深入的研究,提出了几种数据处理和图像...

    GNU图像处理程序 gimp

    GNU图像处理程序(GIMP)是一种功能强大且免费的图像编辑软件,它提供了多种工具和方法来进行图像处理,包括抠图。以下是使用GIMP进行抠图的一般步骤: 打开图像:启动GIMP并打开你需要处理的图像。 选择工具...

    数字图像处理3

    通过本次实验,学生不仅学习了数字图像处理中几种典型的平滑处理技术,还掌握了如何使用Matlab实现这些技术。此外,通过对不同方法的应用和对比,加深了对这些技术特点和适用场景的理解。未来在实际工作中遇到图像...

    基于MATLAB图像处理的几种滤波器的比较.pdf

    在图像处理领域,滤波技术是去除图像噪声、增强图像特征的重要手段之一。本文将详细讨论基于MATLAB平台实现的几种常见滤波器,并对其进行比较分析,这些滤波器包括但不限于低通滤波器、高通滤波器、带通滤波器和带阻...

    数字图像处理程序

    压缩包内的文件可能包括了以下几种类型的程序: 1. **基本操作**:例如,可能会有用于读取、显示、保存图像的程序,这些都是图像处理的起点和终点。在Matlab中,imread、imshow和imwrite是常用的基本图像操作函数。...

    数字图像处理去反光_matlab图像处理_去反光_去图像反光

    针对"去反光"问题,我们可以采用以下几种方法: 1. **直方图均衡化**:对于反光造成的局部亮度不均,直方图均衡化是一种有效手段。通过调整整个图像的灰度分布,可以使图像的对比度增强,有助于凸显反光区域的真实...

Global site tag (gtag.js) - Google Analytics