我有相机活动。我的活动将拍照,然后我有一个AsyncTask将pic保存到设备。这是我的代码:
class SavePhotoTask extends AsyncTask<byte[], String, String> {
private ProgressDialog dialog;
// protected Context applicationContext;
@Override
public void onPreExecute() {
dialog = new ProgressDialog(CameraPreviewActivity.this);
dialog.setMessage("gravando...");
dialog.show();
}
@Override
protected String doInBackground(byte[]... jpeg) {
try {
int i =jpeg[0].length;
System.out.println("byte array size"+i);
String timeStamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date());
Random generator2 = new Random(10000);
int r=generator2.nextInt(99999);
File cacheDir = getDir(DIRECTORIO, Context.MODE_PRIVATE);
String filename = timeStamp+"-" +r+ ".jpg";
File file = new File(cacheDir, filename);
FileOutputStream stream = new FileOutputStream(file);
//FileOutputStream fos = new FileOutputStream(photo.getPath());
stream.write(jpeg[0]);
stream.close();
long t=file.length();
System.out.println("file size"+t);
} catch (java.io.IOException e) {
Log.e("PictureDemo", "Exception in photoCallback", e);
}
return (null);
}
@Override
protected void onPostExecute(String result) {
this.dialog.cancel();
}
}
(此类是对CommonsWare书籍(高级android开发)中的修改
因此SavePhotoTask以字节数组格式(byte [])接收图像并将其保存在文件中。 我想做的是调整它(150K以下)然后保存它,如果可能的话。我知道我可以创建一个位图,但有没有办法直接压缩字节数组?或者我可以使用的任何其他课程。
这是调整位图大小的代码:
Bitmap thumbnail=BitmapFactory.decodeByteArray(jpeg[0], 0, jpeg[0].length)
thumbnail.compress(Bitmap.CompressFormat.JPEG, 100, stream);
stream.close();
long t=file.length();
if(t>Constants.MAX_FILE_SIZE){
stream = new FileOutputStream(file);
thumbnail.compress(Bitmap.CompressFormat.JPEG, 75, stream);
stream.close();
t=file.length();
int i=50;
while(t>Constants.MAX_FILE_SIZE && i>=0){
stream = new FileOutputStream(file);
thumbnail.compress(Bitmap.CompressFormat.JPEG, i, stream);
stream.close();
i=i-5;
t=file.length();
}
}
有没有办法可以创造更好的东西,当然还有最少的内存资源。非常感谢
答案 0 :(得分:0)
可能是我错了,但我认为你无法压缩JPEG格式的已压缩数据。如果您将压缩已经压缩的数据,稍后将无法解码这些数据。 我认为你应该考虑图像重新调整大小。您可以增加图像的宽度和高度,这会增加图像文件的大小。