java对图片的处理(保存和显示)
2007-12-13 14:47
393 查看
java 中的图片处理是很让人头疼的一件事情。目前 java api 中的 imageIO 可以将 gif 图片转换成 png 图片, jpg 图片可以正常转换。据说 gif 转 jpg 也是有办法的,但是将 jpg 转成 gif ,我费了很大的工夫才找到一个很好的解决方案。
首先介绍的是一段很好的缩放图片的代码::
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public
static
BufferedImage resize(BufferedImage source,
int
targetW,
int
targetH)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
targetW,targetH分别表示目标长和宽
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
int
type
=
source.getType();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
BufferedImage target
=
null
;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
double
sx
=
(
double
) targetW
/
source.getWidth();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
double
sy
=
(
double
) targetH
/
source.getHeight();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
这里想实现在targetW,targetH范围内实现等比缩放。如果不需要等比缩放
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
则将下面的if else语句注释即可
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if
(sx
>
sy)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
sx
=
sy;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
targetW
=
(
int
)(sx
*
source.getWidth());
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
}
else
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
sy
=
sx;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
targetH
=
(
int
)(sy
*
source.getHeight());
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if
(type
==
BufferedImage.TYPE_CUSTOM)
![](http://www.blogjava.net/Images/dot.gif)
{
//
handmade
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
ColorModel cm
=
source.getColorModel();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
WritableRaster raster
=
cm.createCompatibleWritableRaster(targetW, targetH);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
boolean
alphaPremultiplied
=
cm.isAlphaPremultiplied();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
target
=
new
BufferedImage(cm, raster, alphaPremultiplied,
null
);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
else
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
target
=
new
BufferedImage(targetW, targetH, type);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Graphics2D g
=
target.createGraphics();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
smoother than exlax:
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
g.dispose();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return
target;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
接下来是将
InputStream
保存为
jpg
文件
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
public
static
void
saveImageAsJpg (InputStream in, File saveFile,
int
width,
int
hight)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
throws
Exception
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
BufferedImage srcImage;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
srcImage
=
ImageIO.read(in);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if
(width
>
0
||
hight
>
0
)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
srcImage
=
resize(srcImage, width, hight);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
ImageIO.write(srcImage,
"
JPEG
"
, saveFile);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
in.close();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
参数解释:
in ::是一个 jpg 图片的 InputStream
saveFile ::目标文件
width ::目标宽度,如果不需要缩放则置 0
hight ::目标高度,如果不需要缩放则置 0
然后是将
InputStream
保存为
gif
文件:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
private
static
void
saveImageAsGif(InputStream in, File fileToSave,
int
width,
int
hight)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
throws
Exception
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
BufferedImage srcImage;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
srcImage
=
ImageIO.read(in);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if
(width
>
0
&&
hight
>
0
)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
srcImage
=
resize(srcImage, width, hight);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
FileOutputStream out
=
new
FileOutputStream(fileToSave);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
GifEncoder encoder
=
new
GifEncoder(srcImage, out);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
encoder.encode();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
in.close();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
参数解释:
in::是一个jpg或者gif图片的InputStream
saveFile::目标文件
width::目标宽度,如果不需要缩放则置0
hight::目标高度,如果不需要缩放则置0
GifEncoder这个类是java api中没有的,也是我找寻了很久的一个东西。它是Acme.JPM.Encoders.GifEncoder,只要找到这个包,将jpg转为gif就不是问题了。
Jpg图片使用的是24-bit的编码,png有png-24和png-8两种,但是gif是8-bit的编码。如果强行将jpg图片信息流按字节拆开,转换成gif图片,即使使用标准256色,也会出现严重的失真。
我曾经使用了gif4j_light_trial_1.0.jar这个包,但是这个包让我很失望。尽管它可以将多张图片合成一个动态的gif图片,但是它是付费的,免费使用期只有一个月。并且,在使用它将jpg图片转换成gif图片之后中间会有一条白色的横线,不知道这是系统的缺陷还是在费用包中做的手脚。
首先介绍的是一段很好的缩放图片的代码::
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public
static
BufferedImage resize(BufferedImage source,
int
targetW,
int
targetH)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
targetW,targetH分别表示目标长和宽
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
int
type
=
source.getType();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
BufferedImage target
=
null
;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
double
sx
=
(
double
) targetW
/
source.getWidth();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
double
sy
=
(
double
) targetH
/
source.getHeight();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
这里想实现在targetW,targetH范围内实现等比缩放。如果不需要等比缩放
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
则将下面的if else语句注释即可
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if
(sx
>
sy)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
sx
=
sy;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
targetW
=
(
int
)(sx
*
source.getWidth());
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
}
else
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
sy
=
sx;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
targetH
=
(
int
)(sy
*
source.getHeight());
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if
(type
==
BufferedImage.TYPE_CUSTOM)
![](http://www.blogjava.net/Images/dot.gif)
{
//
handmade
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
ColorModel cm
=
source.getColorModel();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
WritableRaster raster
=
cm.createCompatibleWritableRaster(targetW, targetH);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
boolean
alphaPremultiplied
=
cm.isAlphaPremultiplied();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
target
=
new
BufferedImage(cm, raster, alphaPremultiplied,
null
);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
else
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
target
=
new
BufferedImage(targetW, targetH, type);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Graphics2D g
=
target.createGraphics();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//
smoother than exlax:
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
g.dispose();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return
target;
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
接下来是将
InputStream
保存为
jpg
文件
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
public
static
void
saveImageAsJpg (InputStream in, File saveFile,
int
width,
int
hight)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
throws
Exception
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
BufferedImage srcImage;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
srcImage
=
ImageIO.read(in);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if
(width
>
0
||
hight
>
0
)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
srcImage
=
resize(srcImage, width, hight);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
ImageIO.write(srcImage,
"
JPEG
"
, saveFile);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
in.close();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
参数解释:
in ::是一个 jpg 图片的 InputStream
saveFile ::目标文件
width ::目标宽度,如果不需要缩放则置 0
hight ::目标高度,如果不需要缩放则置 0
然后是将
InputStream
保存为
gif
文件:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
private
static
void
saveImageAsGif(InputStream in, File fileToSave,
int
width,
int
hight)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
throws
Exception
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
BufferedImage srcImage;
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
srcImage
=
ImageIO.read(in);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if
(width
>
0
&&
hight
>
0
)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
srcImage
=
resize(srcImage, width, hight);
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
FileOutputStream out
=
new
FileOutputStream(fileToSave);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
GifEncoder encoder
=
new
GifEncoder(srcImage, out);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
encoder.encode();
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
in.close();
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
参数解释:
in::是一个jpg或者gif图片的InputStream
saveFile::目标文件
width::目标宽度,如果不需要缩放则置0
hight::目标高度,如果不需要缩放则置0
GifEncoder这个类是java api中没有的,也是我找寻了很久的一个东西。它是Acme.JPM.Encoders.GifEncoder,只要找到这个包,将jpg转为gif就不是问题了。
Jpg图片使用的是24-bit的编码,png有png-24和png-8两种,但是gif是8-bit的编码。如果强行将jpg图片信息流按字节拆开,转换成gif图片,即使使用标准256色,也会出现严重的失真。
我曾经使用了gif4j_light_trial_1.0.jar这个包,但是这个包让我很失望。尽管它可以将多张图片合成一个动态的gif图片,但是它是付费的,免费使用期只有一个月。并且,在使用它将jpg图片转换成gif图片之后中间会有一条白色的横线,不知道这是系统的缺陷还是在费用包中做的手脚。
相关文章推荐
- java对图片的处理(保存和显示)(zz)
- java对图片的处理(保存和显示)
- 用python简单处理图片(1):打开\显示\保存图像
- java--打开图片--显示图片--保存图片
- 用python处理图片之打开\显示\保存图像的方法
- Java处理微信公众号文章图片不显示微信
- 用python简单处理图片(1):打开\显示\保存图像
- 基于Qt与OpenCV的图片读取、保存,并利用Canny进行简单的边缘处理结果显示
- javaweb上传图片,并且从数据库中查出,在页面显示,同时保存图片到数据库中
- python简易图片处理(1):打开\显示\保存图片
- Android上传图片到服务器并显示(后台用Java处理)
- 用python简单处理图片(1):打开\显示\保存图像
- 用python简单处理图片(1):打开\显示\保存图像
- 【JAVA】使用jacob生成的html,关于文字乱码处理,图片无法显示等问题。
- struts2中使用Blob类型处理图片上传保存在数据库中并在JSP页面中显示图片
- java在eclipse当中关于图片显示的处理
- 用python简单处理图片(1):打开\显示\保存图像
- 用python简单处理图片(1):打开\显示\保存图像
- ASP.NET:在一般处理程序中通过 Session 保存验证码却无法显示图片?
- java读取mysql中保存的图片并显示在jsp上