Как преобразовать необработанный байт [] в растровое изображение в приложении камеры - PullRequest
0 голосов
/ 14 февраля 2019

Это снимок, выполняющий функцию

class Camera {
...

void capturePicture() {
    Camera.Size size = mParams.getPictureSize();
    int bitsPerPixel = ImageFormat.getBitsPerPixel(mParams.getPictureFormat());
    int bufferSize = (int) Math.ceil(size.width * size.height * bitsPerPixel / 8d) ;
    Log.d(TAG, "Picture Size : " + size.width + "\t" + size.height);
    Log.d(TAG, "Picture format : " + mParams.getPictureFormat());
    Log.d(TAG, "Bits per Pixel = " + bitsPerPixel);
    Log.d(TAG, "Buffer Size = " + bufferSize);
    byte[] buffer = new byte[1382400];
    addBuffer(buffer);
    Camera.ShutterCallback shutterCallback = () -> mCameraCallbacks.onShutter();
    Camera.PictureCallback pictureCallback = (data, camera) -> {
        mCameraControllerCallbacks.onPicture(data);
        };
    mCamera.takePicture(shutterCallback, pictureCallback, null, null);
}

public interface CameraCallbacks {
    void onPicture(byte[] bytes);
}

Размер изображения должен быть 3264 x 2448, однако bitsPerPixel возвращает -1, поэтому я не могу использовать его для вычисления. Получается минимальный размер буфера1382400, я не знаю, почему.

Вот это действие получает обратный вызов

public class CameraActivity extends AppCompatActivity implements Camera.CameraCallbacks

    @Override
public void onPicture(byte[] bytes) {

    final ByteBuffer buffer = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN);
    final int[] ints = new int[bytes.length / 4];
    buffer.asIntBuffer().put(ints);
    Log.d(TAG,"Creating Bitmap of Size : "+mCameraView.mPictureSize.width +" x "+mCameraView.mPictureSize.height);
    Bitmap bitmap = Bitmap.createBitmap(ints, mCameraView.mPictureSize.width, mCameraView.mPictureSize.height, Bitmap.Config.ARGB_8888);
    Intent intent = new Intent(CameraActivity.this, PicturePreviewActivity.class);
    intent.putExtra("bitmap", bmp);
    startActivityForResult(intent, SAVE_PICTURE_OR_NOT);

}

Код здесь явно неправильный, и у меня возникают проблемы с преобразованием этих байтов [] в целые []способ, которым растровое изображение принимает, потому что я не знаю структуру данных внутри этих байтов.
Также BitmapFactory.decodeByteArray не будет работать, потому что он не может читать необработанные данные.

Кто-нибудь может мне помочь с этим?

1 Ответ

0 голосов
/ 19 февраля 2019

Невозможно получить несжатые данные растрового изображения с камеры Android, поэтому для обратного вызова изображения необходимо перейти от RawCallback к JpegCallback и использовать decodeByteArray () для получения Bitmap. Также ненадежно передавать Bitmap через Intent. Так что самый простой способэто написать непосредственно получающему действию. Код стал таким:

    @Override
public void onPicture(byte[] bytes) {
        Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, mJpeg.get().length,null);
        PicturePreviewActivity.mBitmap=new WeakReference<>(bitmap);
        Intent intent = new Intent(CameraActivity.this, PicturePreviewActivity.class);
        startActivityForResult(intent, SAVE_PICTURE_OR_NOT);
    }
}
...