如何使用gzip-android将图像转换为base64字符串
我试图转换和压缩从android上的文件路径获取的图像 ,用base64的gzip进行转换(我正在使用这个,因为我的桌面版本,用java编写,也在做同样的事情)。 这是我目前用于压缩的内容:
Bitmap bm = BitmapFactory.decodeFile(imagePath); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] data = baos.toByteArray(); String base64Str = null; ByteArrayOutputStream out_bytes = new ByteArrayOutputStream(); OutputStream out = new Base64.OutputStream(out_bytes); try { out.write(data); out.close(); byte[] encoded = out_bytes.toByteArray(); base64Str = Base64.encodeBytes(encoded, Base64.GZIP); baos.close(); } catch (Exception e) {}
这是您的代码目前所做的:
//1. Decode data from image file Bitmap bm = BitmapFactory.decodeFile(imagePath); ... //2. Compress decoded image data to JPEG format with max quality bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); ... //3. Encode compressed image data to base64 out.write(data); ... //4. Compress to gzip format, before encoding gzipped data to base64 base64Str = Base64.encodeBytes(encoded, Base64.GZIP);
我不知道您的桌面版本是如何做到的,但是步骤3是不必要的,因为您在第4步中执行相同的操作。
(删除部分答案)
编辑:以下代码将读取文件中的字节,gzip字节并将它们编码为base64。 它适用于小于2 GB的所有可读文件。 传入Base64.encodeBytes
的字节将与文件中的字节相同,因此不会丢失任何信息(与上面的代码相反,首先将数据转换为JPEG格式)。
/* * imagePath has changed name to path, as the file doesn't have to be an image. */ File file = new File(path); long length = file.length(); BufferedInputStream bis = null; try { bis = new BufferedInputStream(new FileInputStream(file)); if(length > Integer.MAX_VALUE) { throw new IOException("File must be smaller than 2 GB."); } byte[] data = new byte[(int)length]; //Read bytes from file bis.read(data); } catch (IOException e) { e.printStackTrace(); } finally { if(bis != null) try { bis.close(); } catch(IOException e) {} } //Gzip and encode to base64 String base64Str = Base64.encodeBytes(data, Base64.GZIP);
EDIT2:这应解码base64 String
并将解码后的数据写入文件:
//outputPath is the path to the destination file. //Decode base64 String (automatically detects and decompresses gzip) byte[] data = Base64.decode(base64str); FileOutputStream fos = null; try { fos = new FileOutputStream(outputPath); //Write data to file fos.write(data); } catch(IOException e) { e.printStackTrace(); } finally { if(fos != null) try { fos.close(); } catch(IOException e) {} }
- 我怎么知道Soundpool已经准备好使用低于2.2的SDK目标?
- 读取并显示传入的消息文本android
- 如何在android上创建pdf文件
- LibGDX:如何实施Google Play游戏服务?
- Android InflateException错误膨胀类片段
- Android从中创建自定义RecyclerView.Adapter并创建其他类
- 导入com.badlogic.gdx.graphics.gl10无法解析
- java.lang.IllegalStateException:在Android Studio中找不到按钮的onClick方法
- Android StAX游标解析器 – 找不到方法javax.xml.stream.XMLInputFactory.newInstance