问题
I am trying to convert and compress an image taken from a filepath on android to be converted with base64's gzip (i am using this because my desktop version, written in java, is doing the same). Here is what I have currently for compression:
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:
This is what your code currently does:
//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);
I don't know how your desktop version does it, but step 3 is unnecessary since you are doing the same thing as part of step 4.
(Removed part of answer)
EDIT: The following code will read the bytes from the file, gzip the bytes and encode them to base64. It works on all readable files smaller than 2 GB. The bytes passed in to Base64.encodeBytes
will be the same bytes as in the file, so no information is lost (as opposed to the code above, where you convert the data to JPEG format first).
/*
* 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: This should decode the base64 String
and write the decoded data to a file:
//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) {}
}
来源:https://stackoverflow.com/questions/16379904/how-to-convert-an-image-to-a-base64-string-with-gzip-android