So, I've downloaded CWAC2 library and hacked it a bit so i can display a custom layout around the Preview of the camera.
The thing is that when I have the CameraFragment in preview mode inside a FrameLayout in my Activity (left side), i see one thing. After I take the picture (call the take appropriate method from the CameraFragment) and display the image inside an ImageView I see a "larger picture" (right side).
Is there to limit the camera to only capture what it displays on the Preview? I'm guessing I need to set the aspect ratio of the .... camera ?!
And no, it's not a matter of the left side being zoomed in.
As far as I understood, you would need to change what the CameraView is sending to your Frame Layout, so it's displaying the same thing as the camera is getting (your right pic).
Inside adjustAspectRatio() from the CameraView.java, try playing with the scaling of the view.
txform.setRectToRect(rectView, rectPreview, Matrix.ScaleToFit.START); // or Matrix.ScaleToFit.CENTER
float scale=Math.max((float)yourFrameLayoutHeight/rectPreview.height(), (float)yourFrameLayoutWidth/rectPreview.width());
txform.postScale(scale, scale, viewCenterX, viewCenterY);
Related
I want to display a preview in fullscreen using camera2 api. The camera size I selected is 4160x3120 (16:9) and my screen is 1080x1920 (9:16). Therefore if I want the preview to be right scaled I have to crop the camera output :
Rect zoomCrop = new Rect(0, 0, 1755, 3120);
captureRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoomCrop);
The cropped preview should be of size 1755x3120 which has a ratio of 9:16 as well. Still the preview is streched.
Question :
Am I using SCALER_CROP_REGION correctly ? If not, how am I supposed to use it ?
Thanks in advance
I've been struggling with the same sort of problem, as I want to implement a camera preview stream into a square TextureView.
Working with the SCALER_CROP_REGION seemed like the obvious place to resolve issues with incompatible aspect ratios, but I don't think that operation will ever actually change the aspect ratio of the result, hence it doesn't prevent stretching/warping behaviour. (the docs talk about this)
I've made progress by implementing a similar transform to the one in the Camera2Basic example project - see the function configureTransform in Camera2BasicFragment).
Using this sort of view-level scaling matrix, you can manage the scaling/cropping of the camera preview without altering the size of your view.
It sounds like you are getting a landscape image and displaying it in a portrait view - this means that you will have 'pillar box' lines above and below the image if you want to avoid distortion.
If you did want to fill the screen, and not have distortion or the pillar box lines then you would have to accept that part of your image will not be visible, as its outside the shape of the viewing area.
SCALER_CROP_REGION is tricky to understand without diagrams - I found the best explanation to be in the Andoir source documentation here: https://source.android.com/devices/camera/camera3_crop_reprocess
One diagram reproduced from that helps as an example here - the reason for highlight this is to show how the co-ordinates are being used. If you look at your crop region it will be biased towards the top left as you start at (0,0), which I am not sure is what you actually want.
I am using camera2 in a Texture View. I wish to add some kind of image or text on top of the live camera. for eg. the way snapchat adds the time or speed on top of the live View.
when i click a picture i want to capture the live camera image as well as the text or imageview on top of the camera.
I cannot seem to find any reference online
In theory if the base layout is a FrameLayout and then set the texture preview on the view with an index of 0, the rest of the components added after should now be on top.
I have created a custom camera activity (pretty much followed the Android tutorial)
I implemented a SurfaceView to use a preview and an ImageView to display the image taken on OnPictureTaken
Picture taken takes a while to show up and differs from the preview in terms of aspect ratio, size, lighting, white balance. (probably I didn't set the params properly). The quality of the picture doesn't really matter to me. I just want the app to be responsive, ie still picture shows up immediately, and is identical to the preview.
So what I ended up doing was remove the ImageView and only have the SurfaceView. When the camera button is clicked, I stopPreview(). However, now I don't know how to save the SurfaceView content to bitmap/file. From what I read there isn't really a way to SurfaceView to return a bitmap.
What would be a better way to implement the camera? To reiterate, I need to be able to get a bitmap that is identical to the preview, and have that still image shown to the user immediately.
My app is showing the camera preview on one of my activities. I would like to show the camera preview but not taking the full screen, just inside a small box.
The problem is that right now the image that i get from the camera is smaller that I want. For example, when I open it I can only see there my eyes and nose, but I would like to see my whole face.
It's like my surfeceView is acting like a window in a house that only allows me to see part of the views outside. The idea is that in the surfaceView (that does not take the whole screen space) I get the whole camera output but resized in order to fit the surfaceView.
Is that a problem with the camera preview size? Or should I somehow resize the camera output?
Thanks in advance
You should give us some code to find the problem, at least the layout.xml file and the class that uses SurfaceView and SurfaceHolder.Callbacks. For now, you can try the following if you didn't.
In the onSurfaceChanged method use the two int parameters width and height to calculate the best size for your preview. You do this with setPreviewSize and getSupportedPreviewSize.
If you can't fix the issue in an easy way you can also try to use an ImageView or a TextureView and paint on them the image that you are given from the onPreviewFrame callback.
I need a little help with getting my camera to work right.
What I'm trying to do is have the user take a picture that will then be used in another activity as the view's background. It is important not to have any skewing, and ideally the image would fill the entire background with the highest resolution possible.
I've been having a heck of a time trying to get the outputted picture of my camera to be oriented properly and be the same aspect of the display. So I took some time to think of exactly what I needed to do, and I don't think I need the normal saved image at all.
What I came up with is that I need a surface view to display the preview, and an overlay for some text and a capture button. When the user "takes the picture" it should autofocus, and then I need to capture the preview (under the screen overlays) to a bitmap to use in the other activity.
*Should I extend a SurfaceView for my preview and add it to a XML layout that contains the overlays?
*How do I save the SurfaceView's image to a bitmap?
Thanks.
Matt,
One basic question ,and excuse my naivety, wouldnt it just be easier to use the built in camera to the Android through an Intent? It is doable, I've done it before.
Apparently, there is no good way to convert the image format of the preview frames to a jpeg, so I ended up selecting the size for the camera to take by going through each of the camera's supported resolutions and getting the closest match the the screen aspect with the highest resolution.
Because the camera.setRotation method doesn't seem to do anything, I just rotate the image 90 with a matrix before saving it to the card if I am in portrait mode.