Android - 将压缩位图(gzip)转换为Base64导致数据丢失

时间:2014-10-29 19:16:38

标签: android bitmap base64 gzip

我正在尝试使用gzip将位图转换为base64。

我尝试了解决方案here,但我收到此错误 GZIP无法解析或不是字段

我的解决方案正在运行,但图片正在底部剪切

enter image description here

这是我的代码:

        Bitmap myBitmap = BitmapFactory.decodeFile("\path\to\file.jpg");
        ByteArrayOutputStream stream=new ByteArrayOutputStream();
        GZIPOutputStream gzipOstream=null;
        try {
            gzipOstream=new GZIPOutputStream(stream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        myBitmap.compress(Bitmap.CompressFormat.JPEG, 100,  gzipOstream);
        byte[] byteArry=stream.toByteArray();
        String encodedImage = Base64.encodeToString(byteArry,  Base64.NO_WRAP);
        try {
            gzipOstream.close();
            stream.close();
        } catch (IOException e) {
            e.printStackTrace();
        } 

这段代码可能会使图像丢失数据,还是服务器端的东西?

1 个答案:

答案 0 :(得分:2)

调用mBitmap.compress();调用gzipOstream.flush();后,这可以保证输出字节流包含所有内容。然后,您的toByteArray();将获取当前缺失的数据。

试试这个:

Bitmap myBitmap = BitmapFactory.decodeFile("\path\to\file.jpg");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
try {
    GZIPOutputStream gzipOstream = null;
    try {
        gzipOstream = new GZIPOutputStream(stream);
        myBitmap.compress(Bitmap.CompressFormat.JPEG, 100, gzipOstream);
        gzipOstream.flush();
    } finally {
        gzipOstream.close();
        stream.close();
    }
} catch (IOException e) {
    e.printStackTrace();
    stream = null;
}
if(stream != null) {
    byte[] byteArry=stream.toByteArray();
    String encodedImage = Base64.encodeToString(byteArry, Base64.NO_WRAP);
    // do something with encodedImage
}