Problems with photography with Android (vertical camera | portrait)

The following code shows a vertical preview of the camera, and it works. BUT!! I get a photo in the landscape !: (

How can I build it vertically? I have a vertical preview, but I cannot save the image vertically.

greetings and thanks, Fran

Onclick

public void onClick(View arg0) { camera.takePicture(myShutterCallback, myPictureCallback_RAW, myPictureCallback_JPG); } 

ANNOUNCEMENT

 @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (previewing) { camera.stopPreview(); previewing = false; } if (camera != null) { /* * camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); * previewing = true; */ Camera.Parameters parameters = camera.getParameters(); parameters.setPreviewSize(width, height); camera.setParameters(parameters); // Condicions per utilitzar la orientacio adecuada segons el sdk if (Integer.parseInt(Build.VERSION.SDK) >= 8) setDisplayOrientation(camera, 90); else { if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { parameters.set("orientation", "portrait"); parameters.set("rotation", 90); } if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { parameters.set("orientation", "landscape"); parameters.set("rotation", 90); } camera.setParameters(parameters); } // camera.startPreview(); previewing = true; } } 

TAKE A PHOTO

 PictureCallback myPictureCallback_JPG = new PictureCallback() { @Override public void onPictureTaken(byte[] arg0, Camera arg1) { // intentar canvia horientacio Bitmap bitmapPicture = BitmapFactory.decodeByteArray(arg0, 0, arg0.length); //bitmapPicture. OutputStream imageFileOS; try { imageFileOS = new FileOutputStream(String.format("/sdcard/DCIM/iboo/captura.jpg")); imageFileOS.write(arg0); imageFileOS.flush(); imageFileOS.close(); // Missatge en cas de capturar l'imatge correctament Toast.makeText(Principal.this, "Imatge Capturada!", Toast.LENGTH_LONG).show(); MostrarFoto("/sdcard/DCIM/iboo/captura.jpg"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // camera.startPreview(); } }; 
+4
source share
5 answers

This is the solution I implemented. It works great. Hope this helps.

 PictureCallback myPictureCallback_JPG = new PictureCallback() { @Override public void onPictureTaken(byte[] arg0, Camera arg1) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 6; options.inDither = false; // Disable Dithering mode options.inPurgeable = true; // Tell to gc that whether it needs free // memory, the Bitmap can be cleared options.inInputShareable = true; // Which kind of reference will be // used to recover the Bitmap // data after being clear, when // it will be used in the future options.inTempStorage = new byte[32 * 1024]; options.inPreferredConfig = Bitmap.Config.RGB_565; bMap = BitmapFactory.decodeByteArray(arg0, 0, arg0.length, options); // others devices if(bMap.getHeight() < bMap.getWidth()){ orientation = 90; } else { orientation = 0; } Bitmap bMapRotate; if (orientation != 0) { Matrix matrix = new Matrix(); matrix.postRotate(orientation); bMapRotate = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(), bMap.getHeight(), matrix, true); } else bMapRotate = Bitmap.createScaledBitmap(bMap, bMap.getWidth(), bMap.getHeight(), true); FileOutputStream out; try { out = new FileOutputStream( String.format("/sdcard/DCIM/test/screen.jpg")); bMapRotate.compress(Bitmap.CompressFormat.JPEG, 90, out); if (bMapRotate != null) { bMapRotate.recycle(); bMapRotate = null; } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } camera.startPreview(); MostrarFoto(imageInSD); editor = prefs.edit(); editor.putString("PathSeleccio", imageInSD); editor.commit(); } }; 
+7
source

Take a look here .

+2
source
 Camera.Parameters param; param = camera.getParameters(); Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); if(display.getRotation() == Surface.ROTATION_0) { camera.setDisplayOrientation(90); param.setRotation(90); } if(display.getRotation() == Surface.ROTATION_270) { camera.setDisplayOrientation(180); param.setRotation(180); } camera.setParameters(param); camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
+1
source

To adjust the image orientation, use the code below:

 Matrix mat = new Matrix(); mat.postRotate(90); image_to_upload = Bitmap.createBitmap(myImage, 0, 0, myImage.getWidth(), myImage.getHeight(), mat, true); 
0
source

You do not need to rotate the bitmap. This is memory consuming / slow, etc. It seems that in your case it is better (saving the file immediately after shooting) for updating Exif tags in a JPEG file , for example:

  int degrees = 90; ExifInterface exif = new ExifInterface(path); exif.setAttribute(ExifInterface.TAG_ORIENTATION, String.valueOf(degrees)); exif.saveAttributes(); 
0
source

Source: https://habr.com/ru/post/1383407/


All Articles