質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

2794閲覧

camera2を用いてAndroidで撮影した画像の解像度が設定できない

USBMMD3

総合スコア7

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

1クリップ

投稿2018/06/22 06:58

ネットの情報を元にAndroidで5秒ごとにカメラ撮影を行うプログラムを作成しています。
カメラ撮影、画像の保存まではうまくいったのですが、
保存した画像の解像度が320×240になってしまいます。
実際は1280×720で保存したいと考えています。
どの点をどのように修正したらいいか教えてください。

該当のソースコード

ソースコード
MainActivity.java

public class MainActivity extends AppCompatActivity { private TextureView textureView; private static final SparseIntArray ORIENTATIONS = new SparseIntArray(); static{ ORIENTATIONS.append(Surface.ROTATION_0,90); ORIENTATIONS.append(Surface.ROTATION_90,0); ORIENTATIONS.append(Surface.ROTATION_180,270); ORIENTATIONS.append(Surface.ROTATION_270,180); } private String cameraId; private CameraDevice cameraDevice; private CameraCaptureSession cameraCaptureSessions; private CaptureRequest.Builder captureRequestBuilder; private Size imageDimension; private ImageReader imageReader; private String filepath; private String dir; private File file; private static final int REQUEST_CAMERA_PERMISSION = 200; private static final int EXTERNAL_STORAGE_REQUEST_CODE = 1; private boolean mFlashSupported; private Handler mBackgroundHandler; private HandlerThread mBackgroundThread; private final int REPEAT_INTERVAL = 5000; private Handler handler = new Handler(); private Runnable runnable; CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice camera) { cameraDevice = camera; createCameraPreview();} @Override public void onDisconnected(@NonNull CameraDevice cameraDevice) { cameraDevice.close();} @Override public void onError(@NonNull CameraDevice cameraDevice, int i) { cameraDevice.close(); cameraDevice=null;} }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textureView = (TextureView)findViewById(R.id.textureView); assert textureView != null; textureView.setSurfaceTextureListener(textureListener); runnable = new Runnable() { @Override public void run() { doSomething(); handler.postDelayed(this, REPEAT_INTERVAL); } }; handler.postDelayed(runnable, REPEAT_INTERVAL); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } private void takePicture() { if(cameraDevice == null) return; CameraManager manager = (CameraManager)getSystemService(Context.CAMERA_SERVICE); try{ CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraDevice.getId()); Size[] jpegSizes = null; if(characteristics != null) jpegSizes = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP) .getOutputSizes(ImageFormat.JPEG); //撮影画像の解像度変更 int width = 720; int height = 1280; if(jpegSizes != null && jpegSizes.length > 0) { width = jpegSizes[0].getWidth(); height = jpegSizes[0].getHeight(); } final ImageReader reader = ImageReader.newInstance(width,height,ImageFormat.JPEG,2); List<Surface> outputSurface = new ArrayList<>(11); outputSurface.add(reader.getSurface()); outputSurface.add(new Surface(textureView.getSurfaceTexture())); final CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); captureBuilder.addTarget(reader.getSurface()); captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); int rotation = getWindowManager().getDefaultDisplay().getRotation(); captureBuilder.set(CaptureRequest.JPEG_ORIENTATION,ORIENTATIONS.get(rotation)); File pathExternalPublicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); dir = pathExternalPublicDir.getPath(); String forname = "/FTPCAM"; File onedir = new File(dir + forname); if (onedir.exists()) { java.text.DateFormat dM = new java.text.SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); String MonthStr = dM.format(new Date()); file = new File(onedir+"/"+MonthStr.toString()+".jpeg");; filepath =file.toString(); } else {} ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader imageReader) { Image image = null; try{ image = reader.acquireLatestImage(); ByteBuffer buffer = image.getPlanes()[0].getBuffer(); byte[] bytes = new byte[buffer.capacity()]; buffer.get(bytes); save(bytes); } catch (FileNotFoundException e){ e.printStackTrace(); } catch (IOException e){ e.printStackTrace(); } finally { if(image != null){ image.close(); } } } private void save(byte[] bytes) throws IOException { OutputStream outputStream = null; try{ outputStream = new FileOutputStream(file); outputStream.write(bytes); registerDatabase(filepath); }finally { if(outputStream != null) outputStream.close(); } } }; reader.setOnImageAvailableListener(readerListener,mBackgroundHandler); final CameraCaptureSession.CaptureCallback captureListener = new CameraCaptureSession.CaptureCallback() { @Override public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) { super.onCaptureCompleted(session, request, result); Toast.makeText(MainActivity.this, "Saved " + file, Toast.LENGTH_SHORT).show(); createCameraPreview(); } }; cameraDevice.createCaptureSession(outputSurface, new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { try{ cameraCaptureSession.capture(captureBuilder.build(),captureListener,mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { } },mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } private void registerDatabase(String file) { ContentValues contentValues = new ContentValues(); ContentResolver contentResolver = MainActivity.this.getContentResolver(); contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); contentValues.put("_data", file); contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues); } private void createCameraPreview() { try{ SurfaceTexture texture = textureView.getSurfaceTexture(); assert texture != null; texture.setDefaultBufferSize(imageDimension.getWidth(),imageDimension.getHeight()); Surface surface = new Surface(texture); captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); captureRequestBuilder.addTarget(surface); cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { if(cameraDevice == null) return; cameraCaptureSessions = cameraCaptureSession; updatePreview(); } @Override public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { Toast.makeText(MainActivity.this, "Changed", Toast.LENGTH_SHORT).show(); } },null); } catch (CameraAccessException e) { e.printStackTrace(); } } private void updatePreview() { if(cameraDevice == null) Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show(); captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO); try{ cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(),null,mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } private void openCamera() { CameraManager manager = (CameraManager)getSystemService(Context.CAMERA_SERVICE); try{cameraId = manager.getCameraIdList()[0]; CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); assert map != null; imageDimension = map.getOutputSizes(SurfaceTexture.class)[0]; if(ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this,new String[]{ Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE },REQUEST_CAMERA_PERMISSION); return;} manager.openCamera(cameraId,stateCallback,null); } catch (CameraAccessException e) { e.printStackTrace();} } TextureView.SurfaceTextureListener textureListener = new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) { openCamera();} @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {} @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { return false;} @Override public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {} }; @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if(requestCode == REQUEST_CAMERA_PERMISSION){ if(grantResults[0] != PackageManager.PERMISSION_GRANTED){ Toast.makeText(this, "You can't use camera without permission", Toast.LENGTH_SHORT).show(); finish(); } } } private void doSomething() { takePicture(); } @Override protected void onResume() { super.onResume(); startBackgroundThread(); if(textureView.isAvailable()) openCamera(); else textureView.setSurfaceTextureListener(textureListener); } @Override protected void onPause() { stopBackgroundThread(); super.onPause(); } private void stopBackgroundThread() { mBackgroundThread.quitSafely(); try{ mBackgroundThread.join(); mBackgroundThread= null; mBackgroundHandler = null; } catch (InterruptedException e) { e.printStackTrace(); } } private void startBackgroundThread() { mBackgroundThread = new HandlerThread("Camera Background"); mBackgroundThread.start(); mBackgroundHandler = new Handler(mBackgroundThread.getLooper()); } }

補足情報

HAUWEI P10 lite Android7.0
Androidstudio 3.0.1
文字数の関係でソースコードをすべて左寄せにせざる得ませんでした。見にくくて申し訳ありません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

java

1int width = 720; 2int height = 1280; 3if (jpegSizes != null && jpegSizes.length > 0) { 4 width = jpegSizes[0].getWidth(); 5 height = jpegSizes[0].getHeight(); 6}

こちらのコードでjpegSizesの最初の値をwidthとheightに入れてしまっているのが原因ではないでしょうか? jpegSizesのすべての値をチェックして、求める値があるか確認するようにしてみてください。

java

1if (jpegSizes != null && jpegSizes.length > 0) { 2 // 求める値がない場合に最初の値を使う 3 Size size = jpegSizes[0]; 4 5 // すべての値をチェック 6 for (Size jpegSize: jpegSizes) { 7 if ((jpegSize.getWidth() == 720 && jpegSize.getHeight() == 1280) 8 || (jpegSize.getWidth() == 1280 && jpegSize.getHeight() == 720)) { 9 size = jpegSize; 10 break; 11 } 12 } 13 14 width = size.getWidth(); 15 height = size.getHeight(); 16}

投稿2018/06/23 01:54

kakajika

総合スコア3131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

USBMMD3

2018/06/25 08:05

kakajikaさん回答ありがとうございます。 無事解像度を1280×720にすることができました。 変数に代入すればいいだけだと思っていましたが、縦横ともに求める値があるかをチェックしないといけないのですね。 丁寧にその箇所のコードも書いていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問