`

图片处理的资料

阅读更多
这几天一直在做图片处理,其中遇到了一些问题,在网上也找到了解决办法(虽然不是最佳的),在这里还是作个记录吧。
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 楼 xiejin2008 2009-03-27  
我用过你的这个例子.但是gif分解后,图片失真严重..(我是直接生成图片d),但是如果放在jpanel上面显示,是正常的

相关推荐

    数字图像处理资料(数字图像处理资料PPT)

    这份"数字图像处理资料"PPT详细介绍了小波处理图像的方法及其基本原理,是学习和理解这一技术的宝贵资源。 小波分析的核心在于小波函数,它是一种具有有限持续时间和有限频宽的函数,可以看作是短时傅立叶变换的...

    labview视觉运动LabVIEW VIs 图像处理资料机器视觉基础技术培训资料.zip

    labview视觉运动LabVIEW VIs 图像处理资料机器视觉基础技术培训资料 LabVIEW VIs 图像处理 labview实时图像采集.pdf LabVIEW应用于实时图像采集及处理系统.pdf LabVIEW调用MATLAB进行图像处理的实现.pdf NI_机器视觉...

    图像处理资料pdf

    这份"图像处理资料pdf"可能包含了从基础理论到高级实践的全面内容,对于学习图像处理的初学者和专业人士来说都是宝贵的资源。其中,标签提到了"图像处理"和"人脸检测",这暗示了文档可能涵盖这两个关键主题。 图像...

    中科大图像处理资料.zip

    【中科大图像处理资料.zip】是一个包含了一系列关于图像处理学习资源的压缩文件,主要由视频、PDF文档和PPT演示文稿组成。这些文件详细涵盖了图像处理的基础理论和关键技术,适合于想要深入理解和学习图像处理的学员...

    冈萨雷斯版数字图像处理资料

    《冈萨雷斯版数字图像处理资料》是一份包含详尽信息和实践代码的资源集合,主要针对数字图像处理这一领域。这份资料集包括了两本经典的书籍——《数字图像处理》的英文版和中文版,以及相关的MATLAB实现代码,为学习...

    Android图片处理资料

    这份"Android图片处理资料"很可能是关于Android平台上的图像处理技术的深入探讨,可能包括源码分析和相关工具的使用。虽然描述中没有提供具体信息,但我们可以从标题和标签中推测出一些可能涵盖的关键知识点。 1. *...

    LABVIEW基础 图像处理资料

    《 LABVIEW基础与图像处理资料解析 》 在探索计算机科学的世界中,LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是一种强大的图形化编程环境,特别适用于数据采集、测量控制和科学工程应用。...

    matlab绘图与图像处理资料汇总(18份).zip

    matlab绘图与图像处理资料汇总, MATLAB绘图.ppt MATLAB图形句柄.ppt MATLAB图形用户界面设计.ppt 基于MATLAB的图像处理的课程设计.doc 基于Matlab的图像融合研究设计.doc 基于matlab数字图像增强处理-毕业论文.doc...

    数字图像处理资料

    这组“数字图像处理资料”显然提供了关于这一主题的具体实例,对于学习和研究图像处理的人员来说是宝贵的资源。其中包含的“DELPHI数字图像处理附盘”可能是一个包含Delphi编程语言实现的图像处理程序或库。 图像...

    DELPHI数字图像处理资料集

    "DELPHI数字图像处理资料集"提供了丰富的资源,包括源代码、教程书籍和示例,帮助Delphi程序员深入理解和实践数字图像处理技术。 《Delphi数字图像处理及高级应用》是其中的核心参考资料,这本书籍详细介绍了如何在...

    matlab图像处理资料

    本资源"matlab图像处理资料"包含了一系列MATLAB书籍和教程,旨在帮助用户深入理解和应用MATLAB进行图像处理。 1. MATLAB基础: MATLAB是一种高级编程环境,专为数值计算和数据可视化设计。它的语法简洁,易学易用...

    My图像处理资料!!!

    在这个名为"My图像处理资料!!!"的压缩包中,我们可以期待找到一系列与图像处理相关的资源,这可能是教程、论文、代码示例或者软件工具。 首先,图像处理的基础概念包括像素、分辨率、色彩模型(如RGB、CMYK)以及...

    基于labview视觉运动LabVIEW VIs 图像处理资料机器视觉基础技术培训资料.zip

    基于labview视觉运动LabVIEW VIs 图像处理资料机器视觉基础技术培训资料: LabVIEW VIs 图像处理 labview实时图像采集.pdf LabVIEW应用于实时图像采集及处理系统.pdf LabVIEW调用MATLAB进行图像处理的实现.pdf NI_...

    ENVI遥感图像处理资料.zip

    《ENVI遥感图像处理资料详解》 遥感技术,作为一种获取地球表面信息的重要手段,已经广泛应用于环境监测、城市规划、农业估产等多个领域。ENVI(Environment for Visualizing Images)作为一款专业的遥感图像处理...

    labview图像处理资料

    在图像处理领域,LabVIEW因其强大的数据处理能力和直观的编程界面而被广泛使用。本资料“Image Acquisition and Processing with LabVIEW (Image Processing Series).pdf”显然是一份详细探讨LabVIEW图像获取与处理...

    数字图像处理matlab版配套资料(图片和源码)

    本资料包——“冈萨雷斯数字图像处理MATLAB版配套资料”,旨在为学习者提供实践操作的素材,包括图片实例和源代码,以帮助深入理解和应用相关知识。 1. 冈萨雷斯《数字图像处理》:这是一本经典教材,由著名学者...

    图像处理资料opencv.zip

    图像处理资料opencv.zip

    图像处理资料我也是找的分享一下-资料.part01.rar

    图像处理资料我也是找的分享一下-资料.part01.rar 因为比较大,请大家耐心的往下下,因为是分卷,只有下完才能看,一定要有耐心 啊 !刚雷萨斯里有书中的图片和一些源程序。大家可以边看边看边在matlab上运行。。

Global site tag (gtag.js) - Google Analytics