使用ImageIO.write()创建JPEG会创建一个0字节的文件

时间:2013-04-14 17:39:43

标签: java byte jpeg javax.imageio zero

我正在尝试编写一个拍摄图像的方法,并保存该图像的100 x 100缩略图。但是,当我保存文件时,它是一个不可读的0字节图像(错误解释“错误解释JPEG图像文件(在状态200中对JPEG库的错误调用)”)在Ubuntu的ImageViewer中。我的代码如下:

public boolean scale(){

    String file = filename.substring(filename.lastIndexOf(File.separator)+1);
    File out = new File("data"+File.separator+"thumbnails"+File.separator+file);

    if( out.exists() ) return false;

    BufferedImage bi;
    try{
        bi = ImageIO.read(new File(filename));
    }
    catch(IOException e){
        return false;
    }

    Dimension imgSize = new Dimension(bi.getWidth(), bi.getHeight());
    Dimension bounds = new Dimension(100, 100);
    int newHeight = imgSize.height;
    int newWidth = imgSize.width;

    if( imgSize.width > bounds.width ){
        newWidth = bounds.width;
        newHeight = (newWidth*imgSize.height)/imgSize.width;
    }

    if( imgSize.height > bounds.width ){
        newHeight = bounds.height;
        newWidth = (newHeight*imgSize.width)/imgSize.height;
    }

    Image img = bi.getScaledInstance(newWidth, newHeight, BufferedImage.SCALE_SMOOTH);
    BufferedImage thumb = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_4BYTE_ABGR);
    Graphics2D g2d = thumb.createGraphics();
    g2d.drawImage(img, 0, 0, null);
    g2d.dispose();

    try{
        ImageIO.write(thumb, "jpg", out);
    }
    catch(IOException e){
        return false;
    }

    return true;
}

其中“filename”是容纳此方法的类的全局变量,表示原始图像的路径。我的主要问题是我不明白为什么我要创建一个0字节的图像。

3 个答案:

答案 0 :(得分:3)

所以,问题是这个。我在OpenJDK工作。显然,OpenJDK没有JPEG编码器,所以当文件由

创建时
ImageIO.write(thumb, "jpg", out);

实际上并没有为要保存的文件创建任何内容;因此空0字节不可读文件。将ImageIO参数更改为“png”(并相应地调整新的File()扩展名)使用上面的代码成功创建了所需的图像。

答案 1 :(得分:0)

我遇到了同样的问题,即使JVM有一个JPG编码器,它也是由于下面使用了一个不受支持的BufferImage类型引起的。我曾使用BufferedImage.TYPE_USHORT_GRAY,显然不支持它,并没有给出任何错误消息,但产生了一个0字节的文件。当我切换到BufferedImage.TYPE_BYTE_GRAY时,它工作得很好。

答案 2 :(得分:0)

JPG 没有 alpha 通道,ImageIO.write() 会静默失败(只返回 false) 一种方法是将您的图像复制到另一个图像中

BufferedImage newBufferedImage = new BufferedImage(bufferedImage.getWidth(),
  bufferedImage.getHeight(), BufferedImage.TYPE_INT_RGB);
newBufferedImage.getGraphics().drawImage(bufferedImage, 0, 0, null);

boolean write = ImageIO.write(newBufferedImage, extension, outputfile);
if (!write) {
  // do something
}