Это снимок, выполняющий функцию
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 не будет работать, потому что он не может читать необработанные данные.
Кто-нибудь может мне помочь с этим?