我正在制作一个Android应用程序,它正在使用设备的前置摄像头,它必须以肖像形式拍摄图片,它还希望保存图片的效果与预览中显示的相同,但是当我拍摄照片时保存位图位图似乎非常尴尬,因为它增加了长度的大小。似乎我做错了什么,在保存时挤压相机图片。
我搜索了许多链接并且知道为此我们必须设置宽高比。所以我没有得到它。我需要帮助编写代码,因为我即将完成我的应用程序,它在三星盛大和S4上工作得最好,但它不适用于Lg g3和。
这是我在使用surfaceview类时所做的。我正在分享唯一的表面视图类我知道这里有一些错误,其他类很容易。 的 CameraPreview.java
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private Camera camera;
public static SurfaceHolder holder;
private Activity activity;
public CameraPreview(Context context, AttributeSet attrs, Activity activity) {
super(context, attrs);
}
public CameraPreview(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CameraPreview(Context context) {
super(context);
}
public void init(Camera camera,Activity activity) {
this.camera = camera;
this.activity = activity;
initSurfaceHolder();
}
@SuppressWarnings("deprecation") // needed for < 3.0
private void initSurfaceHolder() {
holder = getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
initCamera(holder);
}
private void initCamera(SurfaceHolder holder) {
try {
Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
Camera.Size previewSize = previewSizes.get(0); //480h x 720w
for(int i = 0 ; i<=6;i++){
Log.v("preview sizes"+previewSizes.get(i));
Camera.Size previewSizedemo = previewSizes.get(i);
Log.v("preview size are" +previewSizedemo.width+""+ previewSizedemo.height+"of"+i);
Camera.Size previewSizedemo1 = previewSizes.get(1);
Log.v("preview size of 0 is" +previewSizedemo1.width+""+ previewSizedemo1.height);
}
parameters.setPreviewSize(previewSize.width,previewSize.height);
parameters.setZoom(Camera.Parameters.FOCUS_DISTANCE_OPTIMAL_INDEX);
camera.setParameters(parameters);
requestLayout();
camera.setPreviewDisplay(holder);
camera.startPreview();
} catch (Exception e) {
Log.d("Error setting camera preview", e);
}
}
@Override
public void surfaceChanged(SurfaceHolder mHolder, int format, int width, int height) {
Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
Camera.Size previewSize = previewSizes.get(0); //480h x 720w
parameters.setPreviewSize(previewSize.width,previewSize.height);
requestLayout();
camera.setParameters(parameters);
Display display = ((WindowManager)activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
if(display.getRotation() == Surface.ROTATION_0) {
camera.setDisplayOrientation(90);
parameters.setPreviewSize(previewSize.width, previewSize.height);
} else if(display.getRotation() == Surface.ROTATION_270) {
camera.setDisplayOrientation(180);
parameters.setPreviewSize(previewSize.width, previewSize.height);
}
camera.startPreview();
}// end surfaceChanged
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.e("TABACT"+"surfaceDestroyed()");
camera.stopPreview();
camera.setPreviewCallback(null);
camera.release();
camera = null;
this.getHolder().removeCallback(this);
}
private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.1;
double targetRatio=(double)h / w;
if (sizes == null) return null;
Camera.Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
for (Camera.Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Camera.Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
请记住,我只使用前置摄像头。请帮帮我,如何从前置摄像头拍摄全长图像,然后将其翻转到任何其他角度,然后画像。