原文地址:http://www.blogjava.net/PrettyBoyCyb/archive/2006/11/13/80922.html

java 中的图片处理是很让人头疼的一件事情。目前 java api 中的 imageIO 可以将 gif 图片转换成 png 图片, jpg 图片可以正常转换。据说 gif 转 jpg 也是有办法的,但是将 jpg 转成 gif ,我费了很大的工夫才找到一个很好的解决方案。

首先介绍的是一段很好的缩放图片的代码:

public static BufferedImage resize(BufferedImage source, int targetW, int targetH) {
// targetW,targetH分别表示目标长和宽
int type = source.getType();
BufferedImage target = null;
double sx = (double) targetW / source.getWidth();
double sy = (double) targetH / source.getHeight(); //这里想实现在targetW,targetH范围内实现等比缩放。如果不需要等比缩放
//则将下面的if else语句注释即可
if(sx>sy)
{
sx = sy;
targetW = (int)(sx * source.getWidth());
}else{
sy = sx;
targetH = (int)(sy * source.getHeight());
} if (type == BufferedImage.TYPE_CUSTOM) { //handmade
ColorModel cm = source.getColorModel();
WritableRaster raster = cm.createCompatibleWritableRaster(targetW, targetH);
boolean alphaPremultiplied = cm.isAlphaPremultiplied();
target = new BufferedImage(cm, raster, alphaPremultiplied, null);
} else
target = new BufferedImage(targetW, targetH, type);
Graphics2D g = target.createGraphics();
//smoother than exlax:
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
g.dispose();
return target;
}

接下来是将InputStream保存为jpg文件

public static void saveImageAsJpg (InputStream in, File saveFile,int width,int hight)
throws Exception {
BufferedImage srcImage; srcImage = ImageIO.read(in); if(width > 0 || hight > 0)
{
srcImage = resize(srcImage, width, hight);
} ImageIO.write(srcImage, "JPEG", saveFile);
in.close();
}

参数解释:

in ::是一个 jpg 图片的 InputStream

saveFile ::目标文件

width ::目标宽度,如果不需要缩放则置 0

hight ::目标高度,如果不需要缩放则置 0

然后是将 InputStream 保存为 gif 文件:

private static void saveImageAsGif(InputStream in, File fileToSave,int width, int hight)
throws Exception {
BufferedImage srcImage; srcImage = ImageIO.read(in); if(width>0 && hight >0)
{
srcImage = resize(srcImage, width, hight);
} FileOutputStream out = new FileOutputStream(fileToSave);
GifEncoder encoder = new GifEncoder(srcImage, out);
encoder.encode(); in.close();
}

参数解释:

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对图片的处理的更多相关文章

  1. Java中图片压缩处理

    原文http://cuisuqiang.iteye.com/blog/2045855 整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享. 首先,要压缩的图片格式不能说动态图片,你 ...

  2. java获取图片原始尺寸

    java获取图片原始尺寸 URL url = null; InputStream is = null; BufferedImage img = null; try { url = new URL(pi ...

  3. java Swing 图片缓冲机制

    java Swing 图片缓冲机制: 参考:http://jorneyr.iteye.com/blog/868858#comments package util; import java.awt.ge ...

  4. java实现图片压缩

    java实现图片压缩 package Test; import java.awt.Image; import java.awt.image.BufferedImage; import java.io. ...

  5. java多图片上传--前端实现预览--图片压缩 、图片缩放,区域裁剪,水印,旋转,保持比例。

    java多图片上传--前端实现预览 前端代码: https://pan.baidu.com/s/1cqKbmjBSXOhFX4HR1XGkyQ 解压后: java后台: <!--文件上传--&g ...

  6. java裁剪图片

    java裁剪图片保存到指定位置 /** * 图片裁剪通用接口 * * @param src 源图片地址,图片格式PNG * @param dest 目的图片地址 * @param x 图片起始点x坐标 ...

  7. JAVA的图片文字识别技术

    从2013年的记录看,JAVA中图片文字识别技术大部分采用ORC的tesseract的软件功能,后来渐渐开放了java-api调用接口. 图片文字识别技术,还是采用训练的方法.并未从根本上解决图片与文 ...

  8. 如何用java实现图片与base64转换

    如果你是一个软件开发,不论前端后端工程师,图片的处理你是肯定要会的,关于图片的Base64编码,你可能有点陌生,但是这是一个软件工程师应该要掌握的知识点,现在很多网友把图片与base64转换都做成了小 ...

  9. java创建图片的缩略图

    //java创建图片的缩略图private void createThumbnail(String filename, int thumbWidth, int thumbHeight, int qua ...

  10. Java控制图片按比例缩放- (注意内存释放)

    package mytiny.com.common; import java.awt.Color;import java.awt.Graphics2D;import java.awt.Image;im ...

随机推荐

  1. 20145325张梓靖 《Java程序设计》第6周学习总结

    20145325张梓靖 <Java程序设计>第6周学习总结 教材学习内容总结 串流设计 输入串流(将数据从来源取出),代表对象为java.io.InputStream实例,输出串流(将数据 ...

  2. How to install tensorflow on ubuntu 18.04 64bit

    Ans:pip install tensorflow (note:  version number of pip and python must be  consistent)

  3. HDU 6315 Naive Operations(线段树+区间维护)多校题解

    题意:a数组初始全为0,b数组题目给你,有两种操作: 思路:dls的思路很妙啊,我们可以将a初始化为b,加一操作改为减一,然后我们维护一个最小值,一旦最小值为0,说明至少有一个ai > bi,那 ...

  4. poj_3071 Football(概率dp)

    直接上状态转移方程: 记dp[i][j]为第i轮比赛,第j个队伍获胜的概率. 那么初始状态下,dp[0][j]=1://也就是第0轮比赛全都获胜 d[i][j]=sum(d[i-1][j]*d[i-1 ...

  5. Lucene 基础知识

    1. 数据分类 结构化数据: 指具有固定格式或有限长度的数据,如数据库等; 非结构化数据: 指不定长或无固定格式的数据, 如邮件,word 文档等磁盘上的文件; 1.1 非结构化数据查询方法 顺序扫描 ...

  6. JS判断输入值为正整数

    JS中的test是原来是JS中检测字符串中是否存在的一种模式,JS输入值是否为判断正整数代码: <script type=”text/javascript”> function test( ...

  7. 下载百度网盘破解 获得 所下载视频URL 粘贴到thunder

    Chrome:方法1. 进入谷歌商城,搜索baidudl.安装即可. 方法2. 下载baidudl.zip.解压获得baidudl文件夹.进入chrome://extensions/,勾选右上角Dev ...

  8. shell 将输入的字符转换成大写

    test.sh #!/bin/bash while read line do echo $line | tr '[a-z]' '[A-Z]' done 输出 dddddd DDDDDD sssss S ...

  9. JDK环境变化配置

    JDK环境变化配置 第一"JAVA_HOME" JAVA_HOME的内容是jdk安装目录.如小编安装的位置:D: \Java\jdk1.7.0_60,并且后边不带分号 第二, CL ...

  10. IOS-详解KVO底层实现

    一.KVO (Key-Value Observing) KVO 是 Objective-C 对观察者模式(Observer Pattern)的实现.也是 Cocoa Binding 的基础.当被观察对 ...