У меня есть активность камеры.Моя деятельность будет снимать, а затем у меня есть AsyncTask, чтобы сохранить изображение на устройстве.Вот мой код:
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 получает изображение в формате байтового массива (байт []) и сохраняет его в файл. Я хотел бы изменить его размер (до 150 КБ), а затем сохранить его, если это возможно. Я знаю, что могу создать растровое изображение, но есть ли способ сжать байтовый массив напрямую? Или любой другой класс, который я мог бы использовать.
Это код для изменения размера растрового изображения:
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();
}
}
есть способ, которым я могу создать что-то лучше и, конечно, используя минимальные ресурсы памяти.большое спасибо