Android / Java: Сохранение байтового массива в файл (.jpeg)

Я разрабатываю приложение для 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();
    }
27
задан Mark 2 November 2011 в 10:33
поделиться

1 ответ

Эй это кодирует для 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)
            }
        }
})
0
ответ дан 28 November 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: