怎么使用 ImageIO 将一个 BufferedImage 保存位为 JPEG 文件时不正常.

abcdhy 2005-12-12 07:19:47
为什么一个 BufferedImage 在SWING 中显示时和
使用 ImageIO 保存为 PNG 文件都是正常的.
但保存为 JPEG 文件就不正常.

哪位高手知道怎么处理,谢谢!!

演示代码如下:
package dbb;

import java.awt.image.*;
import java.io.*;
import javax.imageio.*;

public class ImageTools {

public static BufferedImage readImage(String fileName) {
BufferedImage bi = null;
try {
bi = ImageIO.read(new File(fileName));
} catch(IOException ioe) {
ioe.printStackTrace();
}
return bi;
}

public static boolean writeImage(RenderedImage im, String formatName, String fileName) {
boolean result = false;
try {
result = ImageIO.write(im,formatName,new File(fileName));
} catch(IOException ioe) {
ioe.printStackTrace();
}
return result;
}

public static boolean writeJPEGImage(RenderedImage im, String fileName) {
return writeImage(im,"JPEG",fileName);
}
public static boolean writeGIFImage(RenderedImage im, String fileName) {
return writeImage(im,"GIF",fileName);
}
public static boolean writePNGImage(RenderedImage im, String fileName) {
return writeImage(im,"PNG",fileName);
}
public static boolean writeBMPImage(RenderedImage im, String fileName) {
return writeImage(im,"BMP",fileName);
}

public static void main(String[] args) {
BufferedImage bi = ImageTools.readImage("test.jpg");
System.out.println(ImageTools.writeJPEGImage(bi,"tj.jpg"));
}

}
...全文
1693 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
datalover 2006-03-23
  • 打赏
  • 举报
回复
datalover 2006-02-04
  • 打赏
  • 举报
回复
import java.awt.Image.*;
import java.awt.*;
public class atest {
public static void main(String[] args) throws Exception {
BufferedImage img = ImageIO.read(new File("DE087_L.jpg"));
Graphics g =img.getGraphics();
g.setPaintMode();
g.setFont(new Font("黑体",Font.BOLD,48));
g.setColor(Color.red);
g.drawString("伟大的人是不死的,哈哈哈",100,200);
ImageIO.write(img,"JPEG",new File("c://2222.jpg"));
}
}


给分,呵呵
abcdhy 2006-01-25
  • 打赏
  • 举报
回复
不使用

TYPE_INT_ARGB
TYPE_INT_ARGB_PRE
TYPE_4BYTE_ABGR
TYPE_4BYTE_ABGR_PRE

这几种来建立 BufferedImage 就可以了.
也就是不使用 Alpha通道,就没有问题.
abcdhy 2006-01-25
  • 打赏
  • 举报
回复
gtlang78() 我猜测也是这样,但有没有解决的办法呢?谢谢!
gtlang78 2006-01-25
  • 打赏
  • 举报
回复
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4836466
因为你用的BufferedImage里面包含了Alpha通道, 所以写出来的JPG图像可能不能被其他的一些程序读出来。根据sun的说法,这不是ImageIO的Bug,而是因为其他这些程序没有完全实现JPEG的标准。
abcdhy 2006-01-25
  • 打赏
  • 举报
回复
晕,强烈建议你们多看看 Java 的书! 特别是应该仔细的看看<编写 Java 程序的建议>.
先弄懂 JDK 源代码的结构再说.

讨论到此为止. 我不想无聊的争论这个问题了.
Saro 2006-01-23
  • 打赏
  • 举报
回复
晕,楼主走火入魔了。
abcdhy 2006-01-23
  • 打赏
  • 举报
回复
yonghar(ohno) 你弄错了, 我们这里说的

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
不是 JAI 包中的类,

而是在 JDK 标准包rt.jar 中,
具体地址如下:
rt.jar\com\sun\image\codec\jpeg\

而且 JAI 中我们调用的类都在 javax 包中,代表 java 扩展 ,
com.sun.* 包代表 sun.com 的实现,是不提倡直接调用的.

你可以看看!
yonghar 2006-01-22
  • 打赏
  • 举报
回复
楼主钻牛角尖了,而且概念错误。

JPEGImageEncoder 是JAI包里面的,是SUN公司发布的java开发包。
如果SUN公司发布的开发包还不能用,那还有什么可以用????

JAI全称:Java Advanced Imaging。是更加高级的图象处理包。

说使用swt不符合java规范可以理解,要是使用jai也不符合java规范的话...........
whycloud 2006-01-17
  • 打赏
  • 举报
回复
我虽然没有找到错误原因。但是我觉得既然com.sun.*中有,为什么不用呢?
另外如果打开的文家如果是jpg呢,是否能够保存正常呢?如果没记错的话应该在哪本书上看到过例子,好像打开jgp,然后添加水印,最后输出。应该是没问题的呀。建议LZ试一下打开jpg文件试试。如果可以的话,那就是说明是编码的问题。
universe01 2006-01-17
  • 打赏
  • 举报
回复
显示正常啊!
abcdhy 2006-01-17
  • 打赏
  • 举报
回复
我觉得应该不是编码的问题 ,要不早就进 sun 的 bug 列表了.

应该是我们的使用方法不对!

我自己觉得啊
storm_huang 2006-01-16
  • 打赏
  • 举报
回复
是有这个问题,不过我用acdsee可以打开,但是用ie之类的浏览器就浏览不了。之前做了一个缩略图的程序也是用ImageIO来保存的不过很正常没有出现这种问题
abcdhy 2006-01-16
  • 打赏
  • 举报
回复
我试过了,保存为 PNG 文件是没有问题的

但保存为 JPG 文件就不行了!!

可能是 没有正确的使用 ImageIO 类吧!
abcdhy 2006-01-15
  • 打赏
  • 举报
回复
图片只是在 Java 里显示正常

你把生成的图片用其他软件显示就不正常了,比如:Acdsee
storm_huang 2006-01-13
  • 打赏
  • 举报
回复
我试过你的两个程序都没有问题喔,显示都正常。我用的是jdk5.0+intelliJ
abcdhy 2006-01-04
  • 打赏
  • 举报
回复
使用 com.sun.* 包内东西
的程序是没有向后兼容性的,希望大家以后不要这么用了.
abcdhy 2006-01-04
  • 打赏
  • 举报
回复

使用 ImageIO 才是正确的,但居然没有人知道怎么用?

只有人会用违反 Java 使用规范 的东西?!!

晕晕晕!!
usxue 2006-01-02
  • 打赏
  • 举报
回复
有现成的为什么不用?
你可以自己开发啊!
abcdhy 2005-12-14
  • 打赏
  • 举报
回复
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

可以看到 JPEGImageEncoder 在 com.sun 包中
加载更多回复(5)

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧