|
|
|
@ -47,6 +47,7 @@ import android.util.Rational;
|
|
|
|
|
import android.util.Size;
|
|
|
|
|
import android.util.SparseIntArray;
|
|
|
|
|
import android.view.LayoutInflater;
|
|
|
|
|
import android.view.MotionEvent;
|
|
|
|
|
import android.view.OrientationEventListener;
|
|
|
|
|
import android.view.Surface;
|
|
|
|
|
import android.view.TextureView;
|
|
|
|
@ -62,8 +63,10 @@ import android.widget.Toast;
|
|
|
|
|
import com.xypower.mppreview.bean.Contants;
|
|
|
|
|
import com.xypower.mppreview.bean.PngPhotoBean;
|
|
|
|
|
import com.xypower.mppreview.interfaces.CompleteCallback;
|
|
|
|
|
import com.xypower.mppreview.utils.HdrUtil;
|
|
|
|
|
import com.xypower.mppreview.widget.ErrorDialog;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.io.BufferedReader;
|
|
|
|
|
import java.io.File;
|
|
|
|
|
import java.io.InputStream;
|
|
|
|
@ -139,6 +142,9 @@ public class Camera2RawFragment extends Fragment {
|
|
|
|
|
private ExecutorService executorService;
|
|
|
|
|
private Button takepic;
|
|
|
|
|
private ImageView rorpic;
|
|
|
|
|
private Rect focusArea;
|
|
|
|
|
private ImageSaver.ImagePairRunnable runnable;
|
|
|
|
|
private ImageSaver.ImagePair imagePair;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static native boolean makeHdr(long exposureTime1, String path1, long exposureTime2, String path2, String outputPath);
|
|
|
|
@ -386,6 +392,11 @@ public class Camera2RawFragment extends Fragment {
|
|
|
|
|
private CameraCaptureSession.CaptureCallback mPreCaptureCallback = new CameraCaptureSession.CaptureCallback() {
|
|
|
|
|
|
|
|
|
|
private void process(CaptureResult result) {
|
|
|
|
|
|
|
|
|
|
// Integer afStates = result.get(CaptureResult.CONTROL_AF_STATE);
|
|
|
|
|
// if (afStates!=null &&(afStates == CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED || afStates == CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED)) {
|
|
|
|
|
// resetAutoFocus();
|
|
|
|
|
// }
|
|
|
|
|
synchronized (mCameraStateLock) {
|
|
|
|
|
switch (mState) {
|
|
|
|
|
case STATE_PREVIEW: {
|
|
|
|
@ -558,10 +569,117 @@ public class Camera2RawFragment extends Fragment {
|
|
|
|
|
takePicture();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
// mTextureView.setOnTouchListener(new View.OnTouchListener() {
|
|
|
|
|
// @Override
|
|
|
|
|
// public boolean onTouch(View v, MotionEvent event) {
|
|
|
|
|
// if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
|
|
|
|
// float x = event.getX();
|
|
|
|
|
// float y = event.getY();
|
|
|
|
|
//
|
|
|
|
|
// // 将触摸坐标转换为相机对焦区域
|
|
|
|
|
// focusArea = calculateFocusArea(x, y);
|
|
|
|
|
// triggerAutoFocus(focusArea);
|
|
|
|
|
// }
|
|
|
|
|
// return true;
|
|
|
|
|
// }
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
executorService = Executors.newFixedThreadPool(2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onDestroy() {
|
|
|
|
|
super.onDestroy();
|
|
|
|
|
imagePair = null;
|
|
|
|
|
runnable = null;
|
|
|
|
|
mTextureView = null;
|
|
|
|
|
executorService.shutdown();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Rect calculateFocusArea(float x, float y) {
|
|
|
|
|
int viewWidth = mTextureView.getWidth();
|
|
|
|
|
int viewHeight = mTextureView.getHeight();
|
|
|
|
|
|
|
|
|
|
int focusSize =200; // 对焦区域大小
|
|
|
|
|
// int left = (int) (x / viewWidth * 2000 - 1000 - focusSize / 2);
|
|
|
|
|
// int top = (int) (y / viewHeight * 2000 - 1000 - focusSize / 2);
|
|
|
|
|
int left = (int) (x - focusSize / 2);
|
|
|
|
|
int top = (int) (y - focusSize / 2);
|
|
|
|
|
int right = left + focusSize;
|
|
|
|
|
int bottom = top + focusSize;
|
|
|
|
|
|
|
|
|
|
if (left<0) {
|
|
|
|
|
left = 0;
|
|
|
|
|
}
|
|
|
|
|
if (top<0) {
|
|
|
|
|
top = 0;
|
|
|
|
|
}
|
|
|
|
|
if (right < 0) {
|
|
|
|
|
right = 0;
|
|
|
|
|
}
|
|
|
|
|
if (bottom < 0) {
|
|
|
|
|
bottom = 0;
|
|
|
|
|
}
|
|
|
|
|
return new Rect(left, top, right, bottom);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void triggerAutoFocus(Rect focusArea) {
|
|
|
|
|
try {
|
|
|
|
|
// CaptureRequest.Builder mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
|
|
|
|
|
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
|
|
|
|
|
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
|
|
|
|
|
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_REGIONS, new MeteringRectangle[]{new MeteringRectangle(focusArea, 1000)});
|
|
|
|
|
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, new MeteringRectangle[]{new MeteringRectangle(focusArea, 1000)});
|
|
|
|
|
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START);
|
|
|
|
|
//
|
|
|
|
|
// try {
|
|
|
|
|
// AE/AF区域设置通过setRepeatingRequest不断发请求
|
|
|
|
|
mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), mPreCaptureCallback, mBackgroundHandler);
|
|
|
|
|
// } catch (CameraAccessException e) {
|
|
|
|
|
// e.printStackTrace();
|
|
|
|
|
// }
|
|
|
|
|
// mCaptureSession.capture(captureBuilder.build(), null, null);
|
|
|
|
|
|
|
|
|
|
// startControlAFRequest(new MeteringRectangle(focusArea, 1000), mPreCaptureCallback);
|
|
|
|
|
|
|
|
|
|
// mCaptureSession.capture(mPreviewRequestBuilder.build(), mPreCaptureCallback, mBackgroundHandler);
|
|
|
|
|
|
|
|
|
|
} catch (CameraAccessException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// int previewWidth = mTextureView.getWidth();
|
|
|
|
|
// int previewHeight = mTextureView.getHeight();
|
|
|
|
|
// RectF previewRect = new RectF(focusArea.left, focusArea.top, previewWidth, previewHeight);
|
|
|
|
|
//
|
|
|
|
|
// CoordinateTransformer cf = new CoordinateTransformer(mCharacteristics, previewRect);
|
|
|
|
|
//
|
|
|
|
|
// RectF rect = cf.toCameraSpace(previewRect);
|
|
|
|
|
|
|
|
|
|
// MeteringRectangle mr = new MeteringRectangle(new Rect((int) rect.left, (int) rect.top, (int) rect.right, (int) rect.bottom), 1000);
|
|
|
|
|
// startControlAFRequest(new MeteringRectangle(focusArea, 1000), mPreCaptureCallback);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void resetAutoFocus() {
|
|
|
|
|
try {
|
|
|
|
|
// CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
|
|
|
|
|
// mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
|
|
|
|
|
// mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
|
|
|
|
|
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
|
|
|
|
|
// mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// mCaptureSession.capture(captureBuilder.build(), mPreCaptureCallback, null);
|
|
|
|
|
mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), mPreCaptureCallback, mBackgroundHandler);
|
|
|
|
|
} catch (CameraAccessException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@Override
|
|
|
|
|
public void onResume() {
|
|
|
|
|
super.onResume();
|
|
|
|
@ -627,7 +745,7 @@ public class Camera2RawFragment extends Fragment {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void startControlAFRequest(MeteringRectangle rect, CameraCaptureSession.CaptureCallback captureCallback) {
|
|
|
|
|
|
|
|
|
|
// mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
|
|
|
|
|
MeteringRectangle[] rectangle = new MeteringRectangle[]{rect};
|
|
|
|
|
// Focus Mode AUTO
|
|
|
|
|
// mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_AUTO);
|
|
|
|
@ -643,6 +761,7 @@ public class Camera2RawFragment extends Fragment {
|
|
|
|
|
}
|
|
|
|
|
//触发对焦
|
|
|
|
|
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START);
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
//触发对焦通过capture发送请求, 因为用户点击屏幕后只需触发一次对焦
|
|
|
|
|
mCaptureSession.capture(mPreviewRequestBuilder.build(), captureCallback, mBackgroundHandler);
|
|
|
|
@ -1117,14 +1236,28 @@ public class Camera2RawFragment extends Fragment {
|
|
|
|
|
double step = rational.doubleValue();
|
|
|
|
|
captureBuilder.set(CaptureRequest.EDGE_MODE, CaptureRequest.EDGE_MODE_HIGH_QUALITY);
|
|
|
|
|
captureBuilder.set(CaptureRequest.NOISE_REDUCTION_MODE, CaptureRequest.NOISE_REDUCTION_MODE_HIGH_QUALITY);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// if (focusArea!=null) {
|
|
|
|
|
// captureBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
|
|
|
|
|
// captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
|
|
|
|
|
// captureBuilder.set(CaptureRequest.CONTROL_AF_REGIONS, new MeteringRectangle[]{new MeteringRectangle(focusArea, 1000)});
|
|
|
|
|
// captureBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, new MeteringRectangle[]{new MeteringRectangle(focusArea, 1000)});
|
|
|
|
|
// captureBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START);
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// try {
|
|
|
|
|
// AE/AF区域设置通过setRepeatingRequest不断发请求
|
|
|
|
|
// mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), mPreCaptureCallback, mBackgroundHandler);
|
|
|
|
|
|
|
|
|
|
if (pic1 < 21) {
|
|
|
|
|
// mCharacteristics.get(CameraMetadata.CONTROL_AE_COMPENSATION_STEP)
|
|
|
|
|
ArrayList<PngPhotoBean> mlist = new ArrayList<>();
|
|
|
|
|
List<CaptureRequest> requests = new ArrayList<>();
|
|
|
|
|
long v = 0;
|
|
|
|
|
|
|
|
|
|
ImageSaver.ImagePair imagePair = new ImageSaver.ImagePair(2);
|
|
|
|
|
ImageSaver.ImagePairRunnable runnable = new ImageSaver.ImagePairRunnable(imagePair) {
|
|
|
|
|
imagePair = new ImageSaver.ImagePair(2);
|
|
|
|
|
runnable = new ImageSaver.ImagePairRunnable(imagePair) {
|
|
|
|
|
@Override
|
|
|
|
|
public void run() {
|
|
|
|
|
final List<ImageSaver.ImageInfo> images = imagePair.getImages();
|
|
|
|
@ -1140,11 +1273,23 @@ public class Camera2RawFragment extends Fragment {
|
|
|
|
|
Log.d("开始Hdr处理", "strat");
|
|
|
|
|
String hdrOutputPath = outputPath + "HDR_" + generateTimestamp() + ".bmp";
|
|
|
|
|
boolean b = makeHdr3(img1.exposureTime, img1.bitmap, img1.length, img2.exposureTime, img2.bitmap, img2.length, hdrOutputPath);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Mat mat1 = new Mat();
|
|
|
|
|
// Mat mat2 = new Mat();
|
|
|
|
|
// Mat Hdrmat = new Mat();
|
|
|
|
|
// Utils.bitmapToMat(img1.bitmap, mat1);
|
|
|
|
|
// Utils.bitmapToMat(img2.bitmap, mat2);
|
|
|
|
|
//
|
|
|
|
|
// Mat[] mats = {mat1, mat2};
|
|
|
|
|
// float[] floats = {img1.exposureTime,img2.exposureTime};
|
|
|
|
|
// HdrUtil.createHDR(mats, floats,Hdrmat,hdrOutputPath);
|
|
|
|
|
img1.bitmap.recycle();
|
|
|
|
|
img2.bitmap.recycle();
|
|
|
|
|
img1 = null;
|
|
|
|
|
img2 = null;
|
|
|
|
|
images.clear();
|
|
|
|
|
|
|
|
|
|
Log.d("结束Hdr处理", "end");
|
|
|
|
|
if (b) {
|
|
|
|
|
getActivity().runOnUiThread(new Runnable() {
|
|
|
|
@ -1173,10 +1318,10 @@ public class Camera2RawFragment extends Fragment {
|
|
|
|
|
captureBuilder.setTag(mRequestCounter.getAndIncrement());
|
|
|
|
|
|
|
|
|
|
if (idx == 0) {
|
|
|
|
|
// captureBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, new Integer(4));
|
|
|
|
|
// 设置曝光时间,例如设置为1000微秒
|
|
|
|
|
// long exposureTime = 1000 000000L; // 1000微秒
|
|
|
|
|
captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
|
|
|
|
|
captureBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 0);
|
|
|
|
|
if (exposureTime > 0) {
|
|
|
|
|
v = exposureTime;
|
|
|
|
|
captureBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, v);
|
|
|
|
@ -1188,6 +1333,7 @@ public class Camera2RawFragment extends Fragment {
|
|
|
|
|
|
|
|
|
|
if (idx == 1) {
|
|
|
|
|
captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
|
|
|
|
|
captureBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 2);
|
|
|
|
|
if (exposureTime > 0) {
|
|
|
|
|
if (pic1 <= 0) {
|
|
|
|
|
v = exposureTime * DEFAULT_COMPATATION;
|
|
|
|
|