ImageProducer 图像 = Jimi.getImageProducer(source);
JimiWriter writer = Jimi.createJimiWriter(dest);
writer.setSource(image);
// 添加属性设置,非必须
// /*
writer.setOptions(options);
// */
writer.putImage(dest);
} catch (JimiException je) {
System.err.println("错误:" + je);
}
}
转换格式时,无需关心原始图像的格式。只要要转换的图像格式在jimi的解码格式范围内,解码过程就可以完全透明:
ImageProducer 图像 = Jimi.getImageProducer(source);
实际解码只需要几行代码,就这么简单。
编码过程最简单,只需要少量代码:
JimiWriter writer = Jimi.createJimiWriter(dest);
writer.setSource(image);
//添加属性设置,非必须
// /*
writer.setOptions(选项);
//*/
writer.putImage(dest);
以上代码完成了从对图像进行编码到输出到操作系统生成转换后的文件的整个过程。
上面代码中的writer.setOptions(options)用于设置输出文件的属性。每种格式的属性都不同。 com.sun.jimi.core.options.* 为每种格式提供特定设置。图像编码格式的相关属性提供了getter和setter方法,可以轻松设置:
com.sun.jimi.core.options.* 提供了每种图像编码格式相关属性的 getter 和 setter 方法,可以轻松设置:
JPGOptions 选项 = new JPGOptions();
options.setQuality(质量);
格式转换就是这么简单。
jimi不支持编码格式的解决方案
/**
*
* @参数源
* @param dest
* @抛出 JimiException
*/
public void toGIF(String source, String dest) 抛出 JimiException {
if (dest == null || dest.trim().equals(""))
目标 = 源;
// 1: 转换为jpg
if (!dest.toLowerCase().trim().endsWith("jpg")) {
目标+=“.jpg”;
}
toJPG(源,目标,75);
BufferedImage file_in = null;
文件 file = 新文件(dest);
尝试{
file_in = www.sychzs.cn(file);
} catch (IOException e) {
e.printStackTrace();
}
int end = dest.lastIndexOf(".");
file.deleteOnExit();
// 输出*.gif
file.renameTo(new File(dest.substring(0, end) + ".gif"));
// jpg 转 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 = 新文件(dest);
尝试{
file_in = www.sychzs.cn(file);
} catch (IOException e) {
e.printStackTrace();
}
直接放入BufferedImage即可
e.addFrame(file_in);
实际的编码过程在上面这句话中完成。
int end = dest.lastIndexOf(".");
file.deleteOnExit();
//输出*.gif
file.renameTo(new File(dest.substring(0, end) + ".gif"));
最后别忘了用上面的句子来消除证据才结束:)
当然,这个方法其实并不好。最彻底的方法就是修改AnimatedGifEncoder,但是你得客气一点。毕竟代码是别人写的。如果你有兴趣,可以讨论一下。
格式转换解决了,缩放功能不再是问题。下面的代码同时实现了格式转换和线性缩放:
/**
*
* @param img
* @param dest
* @抛出 JimiException
*/
public void toTIF(Image img, String dest) 抛出 JimiException {
if (!dest.toLowerCase().trim().endsWith("tif")) {
dest += ".tif";
System.out.println("覆盖为TIF,输出文件:" + 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 ins
* 放大/缩小比例
* @抛出 JimiException
* @抛出 IOException
*/
public void changeDimension(String source, String desc, double ins)
抛出 JimiException、IOException {
字符串 temp = desc;
文件_file = null;
if (desc == null || desc.trim().equals(""))
desc = 来源;
if (!desc.toLowerCase().trim().endsWith("jpg")) {
temp = desc.trim() + ".jpg";
}
this.toJPG(源、温度、75);
_file = 新文件(临时); // 读入文件
图像 src = www.sychzs.cn(_file); //构造Image对象
双宽度 = (double) src.getWidth(null); // 获取源图宽
双倍高度 = (double) src.getHeight(null); // 获取源图长
int iWideth = (int) (宽度 * ins);
int iHeight = (int) (高度 * ins);
BufferedImage 标签 = 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(标签);
e.finish();
} else if (desc.toLowerCase().trim().endsWith("tif") || desc.toLowerCase().trim().endsWith("tiff")) {
this.toTIF(标签, 描述);
} 其他 {
JimiWriter writer = Jimi.createJimiWriter(desc);
writer.setSource(tag);
writer.putImage(desc);
}
}
BufferedImage的构造函数中的参数类型是int,所以上面的代码在改变图像大小的时候稍微有偏差,但是简单的演示一下还是可以的。
您可以在 jimi 的示例中找到许多单独图像处理功能的演示。它们足够详细吗?如果你有时间,可以研究一下,一定会有很多收获。
不行,目前只能使用java来转换jpg、png、jpeg格式的文件。 Gif 内部使用帧实现,无法压缩。
Java1.0支持显示GIF和JPEG格式的图像文件。这些文件的扩展名为 .gif、.jpg 或 .jpeg。 java.awt.image 包、java.awt 包和 java.applet 包中支持图像
实现思路:无论是什么类型,都转换成流来进行文件传输和存储。
可以以BufferedReader流的形式进行流缓存,然后通过readLine方法获取缓存的内容。
BufferedReader bre = null;
OutputStreamWriter pw = null;//定义一个流
尝试{
字符串文件 = "D:/test/test.GIF";
bre = new BufferedReader(new FileReader(file));//此时得到的bre是整个文件的缓存流
pw = new OutputStreamWriter(new FileOutputStream("D:/New.GIF"),"GBK"); //确认流的输出文件和编码格式。此过程创建一个“test.GIF”实例
while ((str = bre.readLine())!= null) // 判断最后一行不存在,如果为空则结束循环
{
pw.write(str);//要写入文件的内容可以多次写入
};
bre.close();
pw.close();//关闭流
注意:文件流用完后,必须及时通过close方法关闭,否则会一直保持打开状态直到程序停止,增加系统负担。
Java实现图形的放大和缩小。其实就是在画图的时候改变图片的长度和宽度。请参考以下代码:
导入java.awt.Graphics;
导入java.awt.MouseInfo;
导入java.awt.Point;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.io.File;
导入javax.swing.ImageIcon;
导入javax.swing.JButton;
导入javax.swing.JFileChooser;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.filechooser.FileNameExtensionFilter;
公共类App扩展JFrame实现MouseListener、ActionListener{
int x = 0;
int y = 0;
文件[] selectFiles = null;
int 文件索引 = 0;
整数宽度= 200;
int 高度 = 200;
公共 App() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setSize(400, 300);
设置可调整大小(假);
getContentPane().setLayout(null);
JPanel 面板 = new ImagePanel();
panel.setBounds(12, 40, 370, 218);
getContentPane().add(面板);
addMouseListener(this);
JButton btnBrowse = new JButton("浏览");
btnBrowse.addActionListener(this);
btnBrowse.setBounds(12, 9, 91, 21);
getContentPane().add(btnBrowse);
setVisible(true);
}
public static void main(String[] args) {
新应用程序();
}
公共无效actionPerformed(ActionEvent e){
JFileChooser 选择器 = new JFileChooser();
Chooser.setMultiSelectionEnabled(true);
FileNameExtensionFilter 过滤器 = 新 FileNameExtensionFilter(
“JPG GIF 图像”、“jpg”、“gif”);
// 设置文件类型
Chooser.setFileFilter(filter);
// 打开选择器面板
int returnVal=chooser.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
selectedFiles = chooser.getSelectedFiles();
重绘();
}
}
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
点点 = MouseInfo.getPointerInfo().getLocation();
x = 点.x;
y = 点.y;
}
public void mouseReleased(MouseEvent e) {
点点 = MouseInfo.getPointerInfo().getLocation();
int thisX = point.x;
int thisY = point.y;
System.out.println("thisX=" + thisX + " " + "thisY=" + thisY);
if ((y - thisY 20 y - thisY 0)
|| (y - thisY 0 y - thisY -20)) {
// Y 在20范围内移动认为是水平移动
if (x thisX) {
// 右
if (selectedFiles!= null
fileIndex selectedFiles.length - 1) {
文件索引++;
}
} 其他 {
// 左
if (selectedFiles != null fileIndex 0) {
文件索引--;
}
}
} 其他 {
if (x thisX) {
// 右下
宽度+=20;
高度+=20;
} 其他 {