androidで自撮りのカメラ機能を実装しています。
カメラ撮影時は、正常なのですが、撮影後プレビューを確認すると横に潰れたような画像(本来の画像よりも、細くなってしまう)になってしまいます。
previewSizesとpictureSizesの調整をしているのですが、どうしてもプレビューの画像が横に潰されてしまいます。
他に考慮する点や、解決策は何か無いでしょうか?
コードは、次のように実装しています。
宜しくお願いいたしますm(_ _)m
環境
android studio 3.1
compileSdkVersion 27
buildToolsVersion '27.0.0'
Java
1 @Override 2 public void surfaceCreated(SurfaceHolder holder) { 3 if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED 4 || ContextCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 5 requestPermissions(new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE}, 50); 6 } else { 7 startCamera(); 8 } 9 } 10 11 public void startCamera() { 12 try { 13 mCamera = getCameraInstance(); 14 Camera.Parameters parameters = mCamera.getParameters(); 15 parameters.setPreviewSize(determineBestPreviewSize(parameters).width, determineBestPreviewSize(parameters).height); 16 parameters.setPictureSize(determineBestPictureSize(parameters).width, determineBestPictureSize(parameters).height); 17 mCamera.setParameters(parameters); 18 mCamera.setDisplayOrientation(90); 19 mCamera.setPreviewDisplay(mHolder); 20 mCamera.startPreview(); 21 } catch (IOException e) { 22 e.printStackTrace(); 23 } 24 } 25 26 public static Camera.Size determineBestPreviewSize(Camera.Parameters parameters) { 27 List<Camera.Size> sizes = parameters.getSupportedPreviewSizes(); 28 return determineBestSize(sizes); 29 } 30 31 public static Camera.Size determineBestPictureSize(Camera.Parameters parameters) { 32 List<Camera.Size> sizes = parameters.getSupportedPictureSizes(); 33 return determineBestSize(sizes); 34 } 35 36 protected static Camera.Size determineBestSize(List<Camera.Size> sizes) { 37 Camera.Size bestSize = null; 38 long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); 39 long availableMemory = Runtime.getRuntime().maxMemory() - used; 40 for (Camera.Size currentSize : sizes) { 41 int newArea = currentSize.width * currentSize.height; 42 long neededMemory = newArea * 4 * 4; // newArea * 4 Bytes/pixel * 4 needed copies of the bitmap (for safety :) ) 43 boolean isDesiredRatio = (currentSize.width / 4) == (currentSize.height / 3); 44 boolean isBetterSize = (bestSize == null || currentSize.width > bestSize.width); 45 boolean isSafe = neededMemory < availableMemory; 46 if (isDesiredRatio && isBetterSize && isSafe) { 47 bestSize = currentSize; 48 } 49 } 50 if (bestSize == null) { 51 return sizes.get(0); 52 } 53 return bestSize; 54 } 55
あなたの回答
tips
プレビュー