【问题标题】:Java byte array larger than jpg image大于 jpg 图像的 Java 字节数组
【发布时间】:2014-06-20 22:59:55
【问题描述】:

我有一个非常有趣的问题,我正在将 jpg 图像转换为 Java 中的字节数组,如下所示:

>   public byte[] toBytes(String file) throws IOException {
        File img = new File(file);
        BufferedImage image = ImageIO.read(img);
        WritableRaster r = image.getRaster();
        DataBufferByte data = (DataBufferByte) r.getDataBuffer();

        return data.getData();
    }

这显然只是系统的一部分,但请相信我的话^_^: 这个方法返回一个字节数组,但是 - 当我给它一个大小约为 20,000 字节的 .jpg 文件时(Linux - 右键单击​​图像 -> 属性 -> 大小显示为大约 20 000 字节),获得的字节数组有长度超过 345 000,即 345 000 字节(所有这些都初始化为一些值,而不仅仅是 0-s)。你们知道为什么会这样吗?

【问题讨论】:

  • 如果您使用的是 linux 并使用右键单击查看图像的大小,那么对不起,伙计,但我不会相信您的话。跨度>
  • Jpeg 被压缩了......所以......
  • 在Linux上使用图形界面有什么问题?????????你听说过 - Ubuntu 吗?它是操作系统,显然 - 它具有图形(实际上非​​常好)界面,就像许多其他 Linux 发行版一样。

标签: java arrays image byte


【解决方案1】:

Jpeg 是一种高度压缩的图形格式。它使用各种技巧以尽可能少的字节对图像进行编码,而不会使其看起来与原始图像相差太大(至少就人眼而言)。

但是,当您使用image.getRaster() 对图像进行光栅化时,图像会被解码。所有的压缩技巧都被还原以创建一个未压缩的图像,每像素 3 个字节(一个用于红色、绿色和蓝色)。

当您出于某种原因需要压缩的 JPEG 数据时,请使用 FileInputStream 直接访问 File 对象。

【讨论】:

  • 谢谢。这就是我的想法——但不确定。你知道任何了解图形格式的好资源吗?最好上网?特别是我的意思是像标题,如何阅读它们等等。
  • 顺便说一句——如果 1 个像素变成 3 个字节,那么 alpha 通道呢?
  • @PawelHuszcza JPEG 没有 Alpha 通道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
相关资源
最近更新 更多