我通过
File f = new File(filePath);
BufferedImage bi = ImageIO.read(f);
读取了一个图片,然后通过BufferedImage对象修改了图片的宽和高,此时我如何从BufferedImage中获取新图片的大小(字节数)呢?看了论坛中说用
byte[]   data   =   ((DataBufferByte)bi.getData().getDataBuffer()).getData();
data.length;
获取字节数组的大小,可是这样获取的大小根本不是存储图片后的大小。
请教高手如何不保存BufferedImage成文件就可以获取图片大小(自己数)的方法。

解决方案 »

  1.   

    采用不同的压缩算法保存的图片大小是不同的,一些简单的格式你可以很容易的根据BufferedImage的像素数计算出保存后的大小,比如Windows位图(BMP);但是另一些复杂的图像格式就麻烦的多了,比如JPEG,你需要完全了解它的压缩算法,以及你的图像内容(每像素的像素值)。
    我不知道你要做什么,但是个人认为最好换个思路,你提出的问题可能已经偏离正常的需求了。
      

  2.   

    其实我是想将一些jpg图片读取后压缩成一个固定大小比如说50k左右,但是我没法知道BufferedImage修改图片尺寸后图片的大小。
      

  3.   

    你要是对效率没有太多要求的话,可以在内存里先对BufferedImage进行JPEG编码压缩,输出可以是内存里的一个byte数组,得到的byte数组大小就是压缩后的大小了,如果大小符合要求就把他写到到硬盘上保存成jpg文件。
    这样做的坏处是如果对当前压缩质量压缩出大小不满意需要重新调节时,都需要在内存里重新做一次编码压缩,效率不高。
      

  4.   

    to chenweionline:
    不是很明白,可否给出以上的示例代码?
      

  5.   

    我的博客里有一篇编码压缩的文章《使用 Java 进行图像处理 - 图像编码输出》
    http://blog.csdn.net/chenweionline/archive/2007/11/13/1882174.aspx下面图像在内存里压缩的方法,得到的jpegData数组大小就是图像JPEG编码压缩后的大小。ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageOutputStream ios = ImageIO.createImageOutputStream(baos);
    write(ios, null, "jpg", image, null, 0.75f);
    byte[] jpegData = baos.toByteArray();
      

  6.   

    to chenweionline:
    用你的方法不错,不过gif格式的图片好像不支持,我用的好似jdk1.5,你在文章中提到JAI_ImageIO,这个包在哪里下载。
    方便的话六个联系方式msn,qq,gtalk都可以,随时请教。多谢了!