Я разрабатываю приложение для Android, и часть приложения должна делать снимки и сохранять их на SD-карту. Метод onPictureTaken вернул байтовый массив с данными захваченного изображения.
Все, что мне нужно сделать, это сохранить массив байтов в файл изображения .jpeg. Я попытался сделать это с помощью BitmapFactory.decodeByteArray (чтобы получить Bitmap), а затем bImage.compress (для OutputStream), простого OutputStream и BufferedOutputStream. Кажется, все три метода вызывают у меня одну и ту же странную ошибку.Мой телефон Android (8-мегапиксельная камера и приличный процессор), похоже, сохраняет фотографию (размер выглядит правильным), но искаженным образом (изображение нарезано, и каждый фрагмент смещен; или я просто получаю почти горизонтальные линии разных цветов) ; и Странно то, что планшет Android с 5-мегапиксельной камерой и быстрым процессором, кажется, правильно сохраняет изображение.
Я подумал, что, возможно, процессор не справляется с сохранением больших изображений, потому что я получил исключения OutOfMemory после примерно трех изображений (даже при качестве сжатия 40). Но как тогда встроенное приложение камеры делает это, причем намного быстрее? Я почти уверен (из отладки), что OutputStream записывает все данные (байты), и все должно быть в порядке, но все еще повреждено.
*** Короче говоря, каков самый лучший / самый быстрый способ (который работает) сохранить массив байтов в файл jpeg?
Заранее спасибо, Отметьте
код, который я попробовали (и некоторые другие небольшие варианты):
try {
Bitmap image = BitmapFactory.decodeByteArray(args, 0, args.length);
OutputStream fOut = new FileOutputStream(externalStorageFile);
long time = System.currentTimeMillis();
image.compress(Bitmap.CompressFormat.JPEG,
jpegQuality, fOut);
System.out.println(System.currentTimeMillis() - time);
fOut.flush();
fOut.close();
} catch (Exception e) {
}
и
try {
externalStorageFile.createNewFile();
FileOutputStream fos = new FileOutputStream(externalStorageFile);
fos.write(args);
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
Эй это кодирует для kotlin
camera.addCameraListener(object : CameraListener(){
override fun onPictureTaken(result: PictureResult) {
val jpeg = result.data //result.data is a ByteArray!
val photo = File(Environment.getExternalStorageDirectory(), "/DCIM/androidify.jpg");
if (photo.exists()) {
photo.delete();
}
try {
val fos = FileOutputStream(photo.getPath() );
fos.write(jpeg);
fos.close();
}
catch (e: IOException) {
Log.e("PictureDemo", "Exception in photoCallback", e)
}
}
})