为什么一个 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"));
}}

解决方案 »

  1.   

    我试了你的代码 保存为jpg的文件 一点问题都没有呀
      

  2.   

    错误的演示代码:
    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);
    }}
      

  3.   

    你open的file是什么类型?
    是png吧?
    得encode一下:
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputStream);
            // The default quality is 0.75.
            JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(bi);        encoder.encode(bi, jep);
            outputStream.flush();
      

  4.   

    eureka0891(迷茫中...)  这个方法我知道
    但 JPEGImageEncoder 不是标准JDK的类.也就是你使用 JPEGImageEncoder 的程序,在以后可能会不能用的.编写 Java 程序,只能使用 Java 的标准包的东西,不能使用 sun 包的东西,因为它并不保证以后的可用性.所以只能使用 ImageIO 包.呵呵
      

  5.   

    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;可以看到 JPEGImageEncoder 在 com.sun 包中
      

  6.   

    晕 
    使用 ImageIO 才是正确的,但居然没有人知道怎么用?只有人会用违反 Java 使用规范 的东西?!!晕晕晕!!
      

  7.   

    使用  com.sun.* 包内东西 
    的程序是没有向后兼容性的,希望大家以后不要这么用了.
      

  8.   

    我试过你的两个程序都没有问题喔,显示都正常。我用的是jdk5.0+intelliJ
      

  9.   

    图片只是在 Java 里显示正常你把生成的图片用其他软件显示就不正常了,比如:Acdsee
      

  10.   

    是有这个问题,不过我用acdsee可以打开,但是用ie之类的浏览器就浏览不了。之前做了一个缩略图的程序也是用ImageIO来保存的不过很正常没有出现这种问题
      

  11.   

    我试过了,保存为 PNG 文件是没有问题的但保存为 JPG 文件就不行了!!可能是 没有正确的使用 ImageIO 类吧!
      

  12.   

    我虽然没有找到错误原因。但是我觉得既然com.sun.*中有,为什么不用呢?
    另外如果打开的文家如果是jpg呢,是否能够保存正常呢?如果没记错的话应该在哪本书上看到过例子,好像打开jgp,然后添加水印,最后输出。应该是没问题的呀。建议LZ试一下打开jpg文件试试。如果可以的话,那就是说明是编码的问题。
      

  13.   

    我觉得应该不是编码的问题 ,要不早就进 sun 的 bug 列表了.应该是我们的使用方法不对!我自己觉得啊
      

  14.   

    楼主钻牛角尖了,而且概念错误。JPEGImageEncoder 是JAI包里面的,是SUN公司发布的java开发包。
    如果SUN公司发布的开发包还不能用,那还有什么可以用????JAI全称:Java Advanced Imaging。是更加高级的图象处理包。说使用swt不符合java规范可以理解,要是使用jai也不符合java规范的话...........
      

  15.   

    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 的实现,是不提倡直接调用的.你可以看看!
      

  16.   

    晕,强烈建议你们多看看 Java 的书!  特别是应该仔细的看看<编写 Java 程序的建议>.
    先弄懂 JDK 源代码的结构再说.讨论到此为止. 我不想无聊的争论这个问题了.
      

  17.   

    http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4836466
    因为你用的BufferedImage里面包含了Alpha通道, 所以写出来的JPG图像可能不能被其他的一些程序读出来。根据sun的说法,这不是ImageIO的Bug,而是因为其他这些程序没有完全实现JPEG的标准。
      

  18.   

    gtlang78()  我猜测也是这样,但有没有解决的办法呢?谢谢!
      

  19.   

    不使用 TYPE_INT_ARGB
    TYPE_INT_ARGB_PRE
    TYPE_4BYTE_ABGR
    TYPE_4BYTE_ABGR_PRE这几种来建立 BufferedImage 就可以了.
    也就是不使用 Alpha通道,就没有问题.
      

  20.   

    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"));
    }
    }
    给分,呵呵