Android:将Bitmap转换为字节数组和Bitmap.compress有什么区别?

时间:2015-07-30 10:12:26

标签: android bitmap

我正在从Android手机上传图片(JPEG)到服务器。我尝试了这两种方法 -

方法1:

int bytes=bitmap.getByteCount();
        ByteBuffer byteBuffer=ByteBuffer.allocate(bytes);
        bitmap.copyPixelsToBuffer(byteBuffer);
        byte[] byteArray = byteBuffer.array();
        outputStream.write(byteArray, 0, bytes-1);

方法2:

bitmap.compress(Bitmap.CompressFormat.JPEG,100,outputStream);



在method1中,我将位图转换为bytearray并将其写入流。在方法2中,我调用了压缩功能BUT,质量为100(这意味着我没有丢失)。

我希望两者都给出相同的结果。但结果却截然不同。在服务器中发生了以下情况 -
方法1(服务器中上传的文件)
已将大小 3.8MB 的文件上载到服务器。上传的文件无法识别。不与任何图像查看器打开。

方法2(服务器中上传的文件)
已将 415KB 的JPEG文件上载到服务器。上传的文件为JPEG格式。

这两种方法有什么区别。即使我将压缩质量设为100,但尺寸有多大差异?另外,为什么方法1中的任何图像查看器都无法识别文件?

1 个答案:

答案 0 :(得分:1)

  

我希望两者都给出相同的结果。

我不知道为什么。

  

这两种方法有什么区别。

第二种方法创建一个JPEG文件。第一个没有。第一个只是将形成解码图像的字节副本复制到提供的缓冲区。在任何特定的文件格式中都不会这样做,更不用说JPEG了。

  

即使我将压缩质量设为100,但尺寸差异如此之大?

因为第一种方法不适用压缩。对于JPEG质量而言,100并不意味着"未压缩"。

  

为什么方法1中的任何图像查看器都无法识别文件?

因为复制到缓冲区的字节没有以任何特定的文件格式写入,当然也不是JPEG。该缓冲区不是为了写入磁盘而设计的。相反,该缓冲区被设计为仅用于稍后重新创建位图(例如,用于通过IPC传递的位图)。