我正在尝试转换和压缩从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字符串,并将解码的数据写入文件:
//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) {}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。