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

Java 使用ImageIO.write()创建JPEG会创建一个0字节的文件,java,byte,jpeg,javax.imageio,zero,Java,Byte,Jpeg,Javax.imageio,Zero,我正试图写一个方法,采取了一个图像,并保存了100对100的图像缩略图。但是,当我保存该文件时,它在Ubuntu的ImageViewer中显示为一个无法读取的0字节图像(错误为“错误解释JPEG图像文件(在状态200下不正确调用JPEG库)”)。我的代码如下: public boolean scale(){ String file = filename.substring(filename.lastIndexOf(File.separator)+1); File out = n

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

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字节的映像。

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

ImageIO.write(thumb, "jpg", out);

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

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

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
}

好的,您需要关闭IO缓冲区,以便实际写入任何内容。这通常是IO在Java中的工作方式,但可能是错误的。请检查您是否有写入磁盘的权限以及您是否有磁盘空间available@Reimeus-我有写入权限,并且我有可用的磁盘空间;至少我相信我能够成功地创建其他文件(特别是.txt文件),除非我误解了您对“磁盘空间”的含义,否则我有足够的空间。@Telthien-除非我缺少一些东西,否则ImageIO似乎没有关闭其缓冲区的方法。我假设它然后由ImageIO处理,而不需要调用任何东西。@ThomasPreston Hm。似乎确实如此。嗯,我以前从未使用过这个,所以我将把这个留给那些更熟练使用ImageIO:P的人