为什么一个 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"));
}}
使用 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"));
}}
解决方案 »
- AWT图形界面画图-----------------------------题目长才有人看!!
- java 高手请进
- 帮忙看看那的错误,谢谢了!!!!
- drawImage() 为什么第一次总画布上的问题
- 如何将中文转换为其对应的十六进制字符串?(!!!高分!!!)
- 使用反射调用service方法,spring注入的dao失效
- 找兼职或Java熟手写一个程序,价格再议!
- 请问 关于SQLSERVER2000的JDBC驱动的问题
- 现实的渺茫---未来是什么?
- 有没有Hashtable和ArrayList的结合的类,既可以存放key/value对,而且数据还是有序存放的?别人帮了我的忙,可我不知该如何给他加分。
- 准确的来说,j2se基础类包括那些包?
- 会这些东西可以找到工作吗~!
package dbb;import java.awt.*;
import java.awt.image.*;
import javax.swing.*;public class ImageMaker {
int width = 32;
int height = 32;
Color color = Color.RED;
Font font = new Font("华文行楷",Font.BOLD,36);
public ImageMaker() {
this(32,32);
}
public ImageMaker(int width , int height) {
this.width = width;
this.height = height;
}
public void setSize(int width , int height) {
this.width = width;
this.height = height;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
public int getHeight() {
return height;
}
public int getWidth() {
return width;
}
public Font getFont() {
return font;
}
public void setFont(Font font) {
this.font = font;
}
public BufferedImage make(String text) {
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2d = image.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
// g2d.setColor(Color.GREEN);
// g2d.drawRect(0,0,width-1,height-1);
g2d.setColor(color);
g2d.setFont(font);
g2d.drawString(text,-3,28);
return image;
}
public static void main(String[] args) {
System.setProperty("swing.plaf.metal.controlFont","宋体");
JFrame f = new JFrame("图标生成器演示");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ImageMaker im = new ImageMaker();
BufferedImage image = im.make("六");
//ImageTools.writePNGImage(image,"z6.png");
ImageTools.writeJPEGImage(image,"z6.jpg");
ImageIcon icon = new ImageIcon(image);
JLabel label = new JLabel("测试",icon,JLabel.CENTER);
f.getContentPane().add(label);
f.pack();
int w = f.getWidth();
int h = f.getHeight();
Dimension ScreenSize = Toolkit.getDefaultToolkit().getScreenSize();
f.setBounds((int)((ScreenSize.width-w)/2),(int)((ScreenSize.height-h)/2),w,h);
f.setVisible(true);
}}
是png吧?
得encode一下:
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputStream);
// The default quality is 0.75.
JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(bi); encoder.encode(bi, jep);
outputStream.flush();
但 JPEGImageEncoder 不是标准JDK的类.也就是你使用 JPEGImageEncoder 的程序,在以后可能会不能用的.编写 Java 程序,只能使用 Java 的标准包的东西,不能使用 sun 包的东西,因为它并不保证以后的可用性.所以只能使用 ImageIO 包.呵呵
import com.sun.image.codec.jpeg.JPEGImageEncoder;可以看到 JPEGImageEncoder 在 com.sun 包中
使用 ImageIO 才是正确的,但居然没有人知道怎么用?只有人会用违反 Java 使用规范 的东西?!!晕晕晕!!
的程序是没有向后兼容性的,希望大家以后不要这么用了.
另外如果打开的文家如果是jpg呢,是否能够保存正常呢?如果没记错的话应该在哪本书上看到过例子,好像打开jgp,然后添加水印,最后输出。应该是没问题的呀。建议LZ试一下打开jpg文件试试。如果可以的话,那就是说明是编码的问题。
如果SUN公司发布的开发包还不能用,那还有什么可以用????JAI全称:Java Advanced Imaging。是更加高级的图象处理包。说使用swt不符合java规范可以理解,要是使用jai也不符合java规范的话...........
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 的实现,是不提倡直接调用的.你可以看看!
先弄懂 JDK 源代码的结构再说.讨论到此为止. 我不想无聊的争论这个问题了.
因为你用的BufferedImage里面包含了Alpha通道, 所以写出来的JPG图像可能不能被其他的一些程序读出来。根据sun的说法,这不是ImageIO的Bug,而是因为其他这些程序没有完全实现JPEG的标准。
TYPE_INT_ARGB_PRE
TYPE_4BYTE_ABGR
TYPE_4BYTE_ABGR_PRE这几种来建立 BufferedImage 就可以了.
也就是不使用 Alpha通道,就没有问题.
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"));
}
}
给分,呵呵