- 浏览: 189569 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
刘一杰:
...
Database Link详解 -
chaomc:
...
Database Link详解 -
mz0827:
这玩意儿返回的是那个字段的list
hibernate去掉重复记录 -
kadan_james:
...
Database Link详解 -
moonights:
惭愧了 这个不是俺写的.......
有关JAVA的内存泄露的文章
图片文件格式转换最核心的问题就是要解决各种图片格式的编码和解码,推荐用Jimi包,可从http://java.sun.com/products/jimi/下载该包及其源码和demo。
需要注意的是:Jimi提供了对几乎所有图片格式的解码支持,但是为提供gif和tif/tiff格式的编码api,gif编码问题在网上可以找到县相关的源码,tiff好像jai:http://java.sun.com/products/java-media/jai/index.jsp提供了它的编码,不过我没有用jai,暂时用JPEG编码代替了。
察看Jimi的源码,在com.sun.jimi.core中是Jimi的核心处理api。
public void toJPG(String source, String dest, int quality) { if (dest == null || dest.trim().equals("")) dest = source; if (!dest.toLowerCase().trim().endsWith("jpg")) { dest += ".jpg"; System.out.println("Overriding to JPG, output file: " + dest); } if (quality < 0 || quality > 100 || (quality + "") == null || (quality + "").equals("")) { System.out.println("quality must between ’0’ and ’100’"); System.out.println("set to DEFAULT value:’75’"); quality = 75; } try { JPGOptions options = new JPGOptions(); options.setQuality(quality); ImageProducer image = Jimi.getImageProducer(source); JimiWriter writer = Jimi.createJimiWriter(dest); writer.setSource(image); // 加入属性设置,非必要 // /* writer.setOptions(options); // */ writer.putImage(dest); } catch (JimiException je) { System.err.println("Error: " + je); } } |
在进行格式转换时,并不需要关心原图的格式,只要要转换的图片格式在Jimi的解码格式范围内,就可以完全透明的进行decode过程:
ImageProducer image = Jimi.getImageProducer(source);
实际的解码只需要以行代码,就这么简单。
编码过程最简单的也只需要很少的代码:
JimiWriter writer = Jimi.createJimiWriter(dest); writer.setSource(image); // 加入属性设置,非必要 // /* writer.setOptions(options); // */ writer.putImage(dest); |
以上代码就完成了图片编码到输出到os生成转换后文件的全过程。
上面代码中的 writer.setOptions(options)是用来对输出文件的属性进行相关的设置,每种格式的属性都不一样,com.sun.jimi.core.options.*中针对每种图片编码格式的相关属性提供了getter和setter方法,可以方便的进行设置:
com.sun.jimi.core.options.*中针对每种图片编码格式的相关属性提供了getter和setter方法,可以方便的进行设置:
JPGOptions options = new JPGOptions(); options.setQuality(quality); |
格式转换就这么简单。
Jimi不支持的encode格式的解决
/** * * @param source * @param dest * @throws JimiException */ public void toGIF(String source, String dest) throws JimiException { if (dest == null || dest.trim().equals("")) dest = source; // 1:转换为jpg if (!dest.toLowerCase().trim().endsWith("jpg")) { dest += ".jpg"; } toJPG(source, dest, 75); BufferedImage file_in = null; File file = new File(dest); try { file_in = javax.imageio.ImageIO.read(file); } catch (IOException e) { e.printStackTrace(); } int end = dest.lastIndexOf("."); file.deleteOnExit(); // output *.gif file.renameTo(new File(dest.substring(0, end) + ".gif")); // jpg to gif AnimatedGifEncoder e = new AnimatedGifEncoder(); e.start(dest); e.addFrame(file_in); e.finish(); } |
这里用到了AnimatedGifEncoder 类,是我在网上搜索到的,对gif编码提供了一个实现,虽然还有待晚善的地方,不过单作格式转关已经够用了:)
AnimatedGifEncoder e = new AnimatedGifEncoder(); e.start(dest); e.addFrame(file_in); e.finish(); |
需要注意的是:AnimatedGifEncoder 不能对所有格式的图片正确的识别,所以先要将其他格式转为jpg格式(最简单的方法是用imageIO)。
BufferedImage file_in = null; File file = new File(dest); try { file_in = javax.imageio.ImageIO.read(file); } catch (IOException e) { e.printStackTrace(); } |
这样直接放入BufferedImage中就ok了。
e.addFrame(file_in); |
实际的编码过程在上面这句完成。
int end = dest.lastIndexOf("."); file.deleteOnExit(); // output *.gif file.renameTo(new File(dest.substring(0, end) + ".gif")); |
最后,在完成之前别忘了用上面几句消灭证据哟:)
当然这种方法其实并不好,最彻底的方法是修改AnimatedGifEncoder,不过做人你要厚道一点,毕竟是人家写的代码嘛!如果有兴趣的朋友可以讨论一下。 格式转换解决了,缩放功能也就不算是问题了,以下代码同时实现了格式转关和线性缩放:
/** * * @param img * @param dest * @throws JimiException */ public void toTIF(Image img, String dest) throws JimiException { if (!dest.toLowerCase().trim().endsWith("tif")) { dest += ".tif"; System.out.println("Overriding to TIF, output file: " + dest); } dest = dest.substring(0, dest.lastIndexOf(".")) + ".jpg"; JimiWriter writer = Jimi.createJimiWriter(dest); writer.setSource(img); dest = dest.substring(0, dest.lastIndexOf(".")) + ".tif"; writer.putImage(dest); } /** * 线性改变图片尺寸(可同时改变图片格式) * * @param source * 源文件完整路径 * @param desc * 目标文件完整路径 * @param ins * 放大/缩小比率 * @throws JimiException * @throws IOException */ public void changeDimension(String source, String desc, double ins) throws JimiException, IOException { String temp = desc; File _file = null; if (desc == null || desc.trim().equals("")) desc = source; if (!desc.toLowerCase().trim().endsWith("jpg")) { temp = desc.trim() + ".jpg"; } this.toJPG(source, temp, 75); _file = new File(temp); // 读入文件 Image src = javax.imageio.ImageIO.read(_file); // 构造Image对象 double wideth = (double) src.getWidth(null); // 得到源图宽 double height = (double) src.getHeight(null); // 得到源图长 int iWideth = (int) (wideth * ins); int iHeight = (int) (height * ins); BufferedImage tag = new BufferedImage(iWideth, iHeight, BufferedImage.TYPE_INT_RGB); tag.getGraphics().drawImage(src, 0, 0, iWideth, iHeight, null); // 绘制缩小后的图 if (!temp.trim().equals(desc)) _file.deleteOnExit(); if (desc.toLowerCase().trim().endsWith("gif")) { AnimatedGifEncoder e = new AnimatedGifEncoder(); e.start(desc); e.addFrame(tag); e.finish(); } else if (desc.toLowerCase().trim().endsWith("tif") || desc.toLowerCase().trim().endsWith("tiff")) { this.toTIF(tag, desc); } else { JimiWriter writer = Jimi.createJimiWriter(desc); writer.setSource(tag); writer.putImage(desc); } } |
BufferedImage的构造函数中的参数类型为int,所以以上代码在改变图象尺寸时稍有偏差,不过简单演示一下还是可以的。
Jimi的example中可以找到很多单项图片处理功能的demo,有时间可以研究一下,会有不少收获的。
发表评论
-
Android推送服务器
2014-11-02 18:03 400NIO实现的 Socket底层数据传输框架 参考了mi ... -
修改配置文件动态生效
2013-01-23 15:05 1115在我们的应用中,会经常性的修改配置文件,但是往往web应 ... -
桶排序
2012-04-06 08:53 1040优点:一种十分巧妙的排序方式,排序速度也很快。 缺点:排序是 ... -
一个惯性思维出现的错误-有点意思
2011-11-22 16:52 1939很久没有积累东西了,碰巧前几天遇到一个的问题,虽然不大但是比较 ... -
知识积累—Java内存泄露问题分析(转)
2011-06-29 10:35 952个人转载的一篇文章,可以对内存泄露的问题理解多一些,其中标红的 ... -
有关JAVA的内存泄露的文章
2011-06-29 10:34 1568Java的一个重要优点就是通过垃圾收集器GC (Garbag ... -
proxool连接池监听配置
2011-06-27 14:36 1398连接池监听<servlet> <servl ... -
JSF中的FacesContext对象详解
2011-03-21 11:10 1349JSF中的FacesContext对象详 ... -
Java NIO原理和使用
2011-02-18 13:32 854Java NIO原理和 ... -
java 栈和堆的比较
2011-02-18 13:22 640From : http://www.j2medev ... -
问题积累—解决Windows不能在本地计算机启动apache tomcat
2010-07-03 11:48 2311错误描述:在windows下以服务的方式启动时提示如下: “w ... -
收藏整理—常用正则表达式
2010-06-01 14:41 6141。^\d+$ //匹配非负整数(正整数 + 0) 2。 ... -
递归删除目录和文件
2010-06-01 11:17 833import java.io.*; ... -
批量下载魔兽replays录像文件
2010-02-24 13:45 1764自己是个war3爱好者,也经常去浩方或者VS平台去打 ... -
java实现基于http协议的网络文件下载
2010-01-26 13:50 14971.HTTP协议工作方式 基于HTTP协议的客户/服务 ... -
java.net.URL的URL构建方式
2010-01-26 13:47 1620认识IP、认识URL是进行网络编程的第一步。java.net. ... -
Java中的几个术语的解释与关系
2010-01-07 15:54 705java的几种对象(PO,VO,DAO,BO,POJO)解释 ... -
JAVA 中URL链接中文参数乱码的处理方法
2010-01-07 09:11 1019JAVA 中URL链接中文参数乱码的若干处理方法,现在整理收录 ... -
怎样用Java来获取真实的IP地址
2009-08-06 10:10 967在JSP里,获取客户端的IP地址的方法是:reque ... -
java实现外部调用exe文件
2009-07-31 12:35 789package com.moonights.tools; / ...
相关推荐
### 基于Java的图片文件格式转换与线性缩放技术详解 #### 一、引言 在当今数字化时代,图像处理技术是信息技术领域的一个重要组成部分。图像处理包括多种操作,如格式转换、图像缩放等。这些操作在很多应用中都至...
Java Advanced Imaging(JAI)是Sun Microsystems开发的一个扩展Java 2D API的库,用于处理复杂的图像操作,包括旋转、缩放、色彩空间转换以及溶合等。使用JAI,开发者可以轻松地实现图片溶合特效。例如,通过`...
Hu不变矩是一种用于描述图像形状的数学方法,具有旋转、缩放和镜像不变性,常用于图像识别、分类和物体检测。 Hu不变矩是由Maurice M. Hu于1962年提出的,它们通过将图像转换为它的中心矩并进行归一化来定义。中心...
在IT行业中,图片的缩放和拖动是用户界面(UI)设计中常见的功能,尤其在图像编辑软件、照片浏览器和各种应用中。这个例子似乎是一个图像查看器或编辑器的初步实现,允许用户交互地操作图片,但还缺少图片旋转的功能...
`Graphics`对象可以用来绘制、缩放和旋转图像。 10. **使用第三方库**: - 如果需要更复杂或高效的图像处理功能,可以考虑使用第三方库,如Java Advanced Imaging (JAI) 或 Apache Commons Imaging (formerly ...
BMP是一种无损的图像文件格式,它存储了图像的每个像素的颜色信息,因此在处理时需要考虑像素级别的细节。 首先,我们要理解BMP文件的结构。BMP文件由文件头、信息头和像素数据三部分组成。文件头包含了文件的基本...
JAI API不仅支持常见的图像操作,如旋转、缩放、裁剪等,还特别适用于复杂的图像处理任务,如非线性变换和几何运算。然而,JAI API并不包含所有的图像编码和解码器,特别是对于GIF、JPEG和PNG之外的其他格式。 Java...
这些公式是基于ITU-R BT.601标准,将RGB的每个分量线性缩放并加权后得到YUV的相应分量。其中,Y表示亮度,U和V表示色差,它们有助于保留图像的色彩信息。在YUV420格式中,U和V的采样率只有Y的一半,这意味着每4个...
【Java实现的多元线性回归分析】 多元线性回归是一种统计学方法,用于研究多个自变量与一个因变量之间的关系。在Java编程语言中,我们可以使用各种库来实现这一分析,例如Apache Commons Math库或者Weka机器学习库...
6. **PCA算法**:数据预处理、特征缩放、协方差矩阵计算、特征值分解、主成分选择和转换等步骤。 7. **结果可视化**:可能使用Java的图表库(如JFreeChart)展示解决方案或PCA的结果。 8. **文件操作**:读取和写入...
在`gaussElimination`方法中,我们将实现上述的行交换、行缩放和行减法操作。最终,我们可以通过回代法得到线性方程组的解。 从提供的文件名`code6.cpp`来看,虽然它是一个C++文件而不是Java,但我们可以假设这里...
第1章 Java概述、安装及简易教学 14 1-1 Java概述 14 1-2 Java安装 16 1-3 Eclipse安装 18 1-4 GUI设计工具WindowBuilder 18 1-5 在Eclipse开发第一个Java程式 23 1-6 在Eclipse开发第一个Java视窗程式-显示影像 26 ...
3. **经纬度与瓦片坐标转换**:`LatLngToTileUtil.java`文件中的`LatLngToTileUtil`类可能实现了将地图上的经纬度坐标转换为对应的瓦片坐标。这涉及到Web Mercator投影的数学计算,包括纬度的线性化和经度的换算。 ...
总结来说,基于WorldWind Java加载MD2关键帧动画模型的研究涉及到多个技术层面:MD2模型解析、关键帧动画控制、3D渲染和性能优化。对于开发者来说,这既是一个挑战,也是提升技能和深入理解图形编程的好机会。通过这...
7. **仿射变换(Affine Transformation)**:包括平移、旋转、缩放和剪切,是一种线性变换,常用于图像处理和几何图形变换。 实现坐标转换的编程语言有多种,如Python的`pyproj`库、C++的`PROJ`库、Java的`GeoTools...
7. **变换操作**:Java2D支持矩阵变换,如平移、旋转、缩放和倾斜,可以用来创建动态的视觉效果。Graphics2D的translate(), rotate(), scale()和shear()方法是进行这些变换的关键。 8. **抗锯齿和平滑处理**:为了...
同时,为了适应SVM的线性或非线性处理,需要对数据进行适当的转换,如通过核函数转换。 5. 核函数的选择: 如前所述,选择合适的核函数对SVM性能至关重要。常见的核函数有高斯核(RBF),它以数据点之间的欧氏距离...
SVG是一种基于XML的矢量图像格式,它可以无限缩放而不失真,非常适合用于图标、徽标和其他图形元素。CSS3引入了内联SVG的支持,使得可以直接在CSS中使用SVG图形,从而简化了页面的结构和维护。另一方面,CSS可以用来...