GIF解码和编码操作库源码Word格式.docx
《GIF解码和编码操作库源码Word格式.docx》由会员分享,可在线阅读,更多相关《GIF解码和编码操作库源码Word格式.docx(45页珍藏版)》请在冰豆网上搜索。
1
frame
per
sec
e.addFrame(src);
e.setDelay(1000);
e.addFrame(src1);
e.setDelay(100);
e.addFrame(src2);
e.finish();
}catch(IOException
e){
e.printStackTrace();
}
}
下面的例子来自:
ideas
多张jpg图合成gif动画
/**
*
把多张jpg图片合成一张
@param
pic
String[]
多个jpg文件名
包含路径
newPic
String
生成的gif文件名
*/
private
synchronized
jpgToGif(String
pic[],
newPic)
{
try
e.start(newPic);
src[]
BufferedImage[pic.length];
for
(int
i
0;
<
src.length;
i++)
e.setDelay(200);
//设置播放的延迟时间
src[i]
File(pic[i]));
读入需要播放的jpg文件
e.addFrame(src[i]);
//添加到帧中
catch
(Exception
e)
System.out.println(
"
jpgToGif
Failed:
2
gif动画分解成多张jpg
/**
*//**
把gif图片按帧拆分成jpg图片
gifName
小gif图片(路径+名称)
path
生成小jpg图片的路径
@return
返回生成小jpg图片的名称
*/
splitGif(String
gifName,String
path)
GifDecoder
decoder
GifDecoder();
decoder.read(gifName);
int
n
decoder.getFrameCount();
//得到frame的个数
subPic
String[n];
tag
this.getTag();
n;
decoder.getFrame(i);
//得到帧
//int
delay
decoder.getDelay(i);
//得到延迟时间
//生成小的JPG文件
subPic[i]
+
String.value(i)+
.jpg"
;
FileOutputStream
out
FileOutputStream(subPic[i]);
ImageIO.write(frame,
jpeg"
out);
JPEGImageEncoder
encoder
JPEGCodec.createJPEGEncoder(out);
encoder.encode(frame);
//存盘
out.flush();
out.close();
return
subPic;
splitGif
Failed!
null;
3
根据提供的文字生成jpg图片
s
文字
smallWidth
每个字的宽度和高度是一样的
bgcolor
Color
背景色
fontcolor
字色
fontPath
字体文件
jpgname
jpg图片名
@return
createJpgByFont(String
s,
smallWidth,Color
bgcolor,Color
fontcolor,String
fontPath,String
jpgname)
{
bimage
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
File(fontPath);
//字体文件
//根据字体文件所在位置,创建新的字体对象(此语句在jdk1.5下面才支持)
Font
font
Font.createFont(Font.TRUETYPE_FONT,
file);
//font.deriveFont(float
f)复制当前
对象并应用新设置字体的大小
g.setFont(font.deriveFont((float)
smallWidth));
g.drawString(s,0,
//在指定坐标除添加文字
g.dispose();
FileOutputStream(jpgname);
//指定输出文件
JPEGEncodeParam
param
encoder.getDefaultJPEGEncodeParam(bimage);
param.setQuality(50f,
true);
encoder.encode(bimage,
param);
//存盘
createJpgByFont
4
多张小jpg图合成一张大JPG图,在这里对大图只作宽度限制,不做高度限制
将多个小图片合成一张大jpg图
(小的jpg图片按照行列顺序平铺)
smallJPG
ArrayList
一组小的jpg图片
bigWidth
大图宽度
单个文字生成的小图的宽度和高度是一致的
createBigJPG(ArrayList
smallJPG,
bigWidth,
smallHeigh,Color
bgColor
String
picName)
if
(bigWidth
smallWidth)
//如果大图片的高度比小图片的高度还小
直接返回
return;
colCount
/
smallWidth;
//每行放置的字数
leftMargin
(int)
((bigWidth
-
2f);
//左边距
rowCount
smallJPG.size();
//小图行数
setWidth
bigWidth;
//每列中间不留空隙,只留左右边距
setHeight
//按照大图片宽高绘制一个背景图片
bufImage
BufferedImage(setWidth,
setHeight,
BufferedImage.TYPE_INT_RGB);
bufImage.createGraphics();
g.setColor(bgColor);
//背景的颜色
setWidth,
setHeight);
y
//纵坐标
rowCount;
//遍历每行
col
(ArrayList)
(smallJPG.get(i));
x
leftMargin;
//横坐标
可能会出现左边距
j
col.size();
j++)
(String)
(col.get(j));
ImageIcon
icon
ImageIcon(jpgname);
Image
img
icon.getImage();
imgWidth
img.getHeight(null);
g.drawImage(img,
x,
y,
null);
+=
imgWidth;
(smallWidth);
FileOutputStream(picName);
//设置文件格式
encoder.getDefaultJPEGEncodeParam(bufImage);
//从图片缓冲中读取
encoder.encode(bufImage,
createBigJPG
注:
(1)AnimatedGifEncoder和GifDecoder,以及这两个类涉及到的相关类,在网上搜索一下就可以找到。
(2)在linux系统下,如果你想支持更多系统外的字体,使用下面两句话,可以不用为系统添加字体,直接把字体文件拷贝到相应位置即可,但是需要jdk1.5环境。
//根据字体文件所在位置,创建新的字体对象
如果是jdk1.5以下版本则需要为系统添加字体,因为createFont(int
fontFormat,
fontFile)
这个方法,是从1.5才开始有的。
(3)g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
我在测试中发现,当设置的字体过大的时候,会出现很明星的锯齿,后来在网上找到了这个解决方法。
(4)有了以上几个方法,就可以做出更好看的闪信了。
我也是因为需求才写下这些方法的,美工做了一些热门词汇的gif图片,在短信转彩信遇到这些词汇时,要使用提供的图片替换文字。
AnimatedGifEncoder.java源码(处理GIF图片)
2007-01-1017:
49
java.awt.*;
Class
Encodes
a
GIF
consisting
of
one
or
more
frames.
pre>
Example:
e.start(outputFileName);
e.addFrame(image1);
e.addFrame(image2);
/pre>
No
copyright
asserted
on
the
source
code
this
class.
May
be
used
any
purpose,
however,
refer
to
Unisys
LZW
patent
restrictions
use
associated
LZWEncoder
Please
forward
corrections
kweiner@.
*
@author
Kevin
Weiner,
FM
Software
@version
1.03
November
2003
protected
width;
image
size
height;
transparent
color
given
transIndex;
index
in
table
repeat
-1;
no
repeat
(hundredths)
boolean
started
false;
ready
output
frames
OutputStream
out;
image;
current
frame
byte[]
pixels;
BGR
byte
array
from
indexedPixels;
converted
indexed
palette
colorDepth;
number
bit
planes
colorTab;
RGB
boolean[]
usedEntry
boolean[256];
active
palette
entries
palSize
7;
table
size
(bits-1)
dispose
disposal
(-1
default)
closeStream
close
stream
when
finished
firstFrame
true;
sizeSet
fals