java,gif,合成,拆分,jpg,图片生成
这几天一直在做图片处理,其中遇到了一些问题,在网上也到了解决办法(虽然不是最佳的),在这里还是作个记录吧。
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];
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); //设置播诺难映偈奔?/span>
src[i] = ad(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图片(路径+名称)
e.setDelay(200); //设置播诺难映偈奔?/span>
src[i] = ad(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();
ad(gifName);
int n = FrameCount(); //得到frame的个数
String[] subPic = new String[n];
String tag = Tag();
for (int i = 0; i < n; i++) {
BufferedImage frame = Frame(i); //得到帧
//int delay = Delay(i); //得到延迟时间
//生成小的JPG文件
subPic[i] = path + String.value(i)+ ".jpg";
* @return String[] 返回生成小jpg图片的名称
*/
private synchronized String[] splitGif(String gifName,String path) {
try {
GifDecoder decoder = new GifDecoder();
ad(gifName);
int n = FrameCount(); //得到frame的个数
String[] subPic = new String[n];
String tag = Tag();
for (int i = 0; i < n; i++) {
BufferedImage frame = Frame(i); //得到帧
//int delay = Delay(i); //得到延迟时间
//生成小的JPG文件
subPic[i] = path + String.value(i)+ ".jpg";
FileOutputStream out = new FileOutputStream(subPic[i]);
ImageIO.write(frame, "jpeg", out);
JPEGImageEncoder encoder = ateJPEGEncoder(out);
de(frame); //存盘
out.flush();
out.close();
}
return subPic;
} catch (Exception e) {
System.out.println( "splitGif Failed!");
e.printStackTrace();
return null;
}
3 根据提供的文字生成jpg图片
/**
ImageIO.write(frame, "jpeg", out);
JPEGImageEncoder encoder = ateJPEGEncoder(out);
de(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 = ateGraphics();
* @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 = ateGraphics();
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 = ateFont(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 = ateJPEGEncoder(out);
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 = ateFont(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 = ateJPEGEncoder(out);
JPEGEncodeParam param = DefaultJPEGEncodeParam(bimage);
param.setQuality(50f, true);
de(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.setQuality(50f, true);
de(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,
* @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 = ateGraphics();
g.setColor(bgColor); //背景的颜
g.fillRect(0, 0, setWidth, setHeight);
int y = 0; //纵坐标
for (int i = 0; i < rowCount; i++) { //遍历每行
ArrayList col = (ArrayList) ((i));
int x = leftMargin; //横坐标 可能会出现左边距
for (int j = 0; j < col.size(); j++) {
String jpgname = (String) ((j));
ImageIcon icon = new ImageIcon(jpgname);
Image img = Image();
int imgWidth = Height(null);
g.drawImage(img, x, y, null);
x += imgWidth;
Graphics2D g = ateGraphics();
g.setColor(bgColor); //背景的颜
g.fillRect(0, 0, setWidth, setHeight);
int y = 0; //纵坐标
for (int i = 0; i < rowCount; i++) { //遍历每行
ArrayList col = (ArrayList) ((i));
int x = leftMargin; //横坐标 可能会出现左边距
for (int j = 0; j < col.size(); j++) {
String jpgname = (String) ((j));
ImageIcon icon = new ImageIcon(jpgname);
Image img = Image();
int imgWidth = Height(null);
g.drawImage(img, x, y, null);
x += imgWidth;
}
y += (smallWidth);
}
g.dispose();
FileOutputStream out = new FileOutputStream(picName); //指定输出文件
JPEGImageEncoder encoder = ateJPEGEncoder(out); //设置文件格式
JPEGEncodeParam param = DefaultJPEGEncodeParam(bufImage); //从图片缓冲中读取
param.setQuality(50f, true);
de(bufImage, param); //存盘
out.flush();
out.close();
} catch (Exception e) {
System.out.println( "createBigJPG Failed!");
y += (smallWidth);
}
g.dispose();
FileOutputStream out = new FileOutputStream(picName); //指定输出文件
JPEGImageEncoder encoder = ateJPEGEncoder(out); //设置文件格式
JPEGEncodeParam param = DefaultJPEGEncodeParam(bufImage); //从图片缓冲中读取
param.setQuality(50f, true);
de(bufImage, param); //存盘
out.flush();
out.close();
} catch (Exception e) {
System.out.println( "createBigJPG Failed!");
e.printStackTrace();
}
}
java创建文件注:
(1)AnimatedGifEncoder和GifDecoder,以及这两个类涉及到的相关类,在网上搜索一下就可以到。
(2)在linux系统下,如果你想支持更多系统外的字体,使用下面两句话,可以不用为系统添加字体,直接把字体文件拷贝到相应位置即可,但是需要jdk1.5环境。
File file = new File(fontPath); //字体文件
Font font = ateFont(Font.TRUETYPE_FONT, file); //根据字体文件所在位置,创建新的字体对象
如果是jdk1.5以下版本则需要为系统添加字体,因为createFont(int fontFormat, File fontFile)
这个方法,是从1.5才开始有的。
(3)g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
我在测试中发现,当设置的字体过大的时候,会出现很明星的锯齿,后来在网上到了这个解决方法。
}
}
java创建文件注:
(1)AnimatedGifEncoder和GifDecoder,以及这两个类涉及到的相关类,在网上搜索一下就可以到。
(2)在linux系统下,如果你想支持更多系统外的字体,使用下面两句话,可以不用为系统添加字体,直接把字体文件拷贝到相应位置即可,但是需要jdk1.5环境。
File file = new File(fontPath); //字体文件
Font font = ateFont(Font.TRUETYPE_FONT, file); //根据字体文件所在位置,创建新的字体对象
如果是jdk1.5以下版本则需要为系统添加字体,因为createFont(int fontFormat, File fontFile)
这个方法,是从1.5才开始有的。
(3)g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
我在测试中发现,当设置的字体过大的时候,会出现很明星的锯齿,后来在网上到了这个解决方法。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论