下面列出了怎么用android.hardware.Camera.Size的API类实例代码及写法,或者点击链接到github查看源代码。
private Rect getCroppedRect(Size cameraPreviewSize, Rect visibleRect, int rotation) {
final int previewWidth = cameraPreviewSize.width;
final int previewHeight = cameraPreviewSize.height;
if (rotation % 180 > 0) rotateRect(visibleRect);
float scale = (float) previewWidth / visibleRect.width();
if (visibleRect.height() * scale > previewHeight) {
scale = (float) previewHeight / visibleRect.height();
}
final float newWidth = visibleRect.width() * scale;
final float newHeight = visibleRect.height() * scale;
final float centerX = (VERSION.SDK_INT < 14 || isTroublemaker()) ? previewWidth - newWidth / 2 : previewWidth / 2;
final float centerY = previewHeight / 2;
visibleRect.set((int) (centerX - newWidth / 2),
(int) (centerY - newHeight / 2),
(int) (centerX + newWidth / 2),
(int) (centerY + newHeight / 2));
if (rotation % 180 > 0) rotateRect(visibleRect);
return visibleRect;
}
private void startPreview(SurfaceHolder holder) {
try {
Parameters params = camera.getParameters();
if (params.getSupportedFocusModes().contains(
Parameters.FOCUS_MODE_AUTO)) {
params.setFocusMode(Parameters.FOCUS_MODE_AUTO);
}
List<Size> previewSizes = camera.getParameters().getSupportedPreviewSizes();
List<Size> pictureSizes = camera.getParameters().getSupportedPictureSizes();
params.setPreviewSize(previewSizes.get(previewSizes.size()-2).width,previewSizes.get(previewSizes.size()-2).height);
params.setPictureSize(pictureSizes.get(pictureSizes.size()-2).width,pictureSizes.get(pictureSizes.size()-2).height);
camera.setParameters(params);
camera.setPreviewDisplay(holder);
camera.startPreview();
previewConsumer.start(camera);
} catch(IOException e) {
Log.e(TAG, "Error starting camera preview", e);
}
}
public static int loadTexture(final IntBuffer data, final Size size, final int usedTexId) {
int textures[] = new int[1];
if (usedTexId == NO_TEXTURE) {
GLES20.glGenTextures(1, textures, 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, size.width, size.height,
0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, data);
} else {
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, usedTexId);
GLES20.glTexSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, size.width,
size.height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, data);
textures[0] = usedTexId;
}
return textures[0];
}
public static com.tiktokdemo.lky.tiktokdemo.record.camera.camera.utils.CameraInfo getCameraInfo(){
com.tiktokdemo.lky.tiktokdemo.record.camera.camera.utils.CameraInfo info = new com.tiktokdemo.lky.tiktokdemo.record.camera.camera.utils.CameraInfo();
try{
Size size = getPreviewSize();
CameraInfo cameraInfo = new CameraInfo();
mCameraInfo = cameraInfo;
Camera.getCameraInfo(cameraID, cameraInfo);
info.previewWidth = PREVIEW_WIDTH;
info.previewHeight = PREVIEW_HEIGHT;
info.orientation = cameraInfo.orientation;
info.isFront = cameraID == 1 ? true : false;
size = getPictureSize();
if (size != null){
info.pictureWidth = size.width;
info.pictureHeight = size.height;
}
if(camera != null){
info.flashMode = camera.getParameters().getFlashMode();
}
return info;
}catch (Exception e){
e.printStackTrace();
return info;
}
}
public Camera.Size getMaxPreviewResolution() {
int maxWidth=0;
Camera.Size curRes=null;
mCamera.lock();
for ( Camera.Size r: getResolutionList() ) {
if (r.width>maxWidth) {
Log.d(TAG,"supported preview resolution: "+r.width+"x"+r.height);
maxWidth=r.width;
curRes=r;
}
}
return curRes;
}
public void setMaxPictureResolution() {
int maxWidth=0;
Size curRes=null;
for ( Size r: getPictureResolutionList() ) {
Log.d(TAG,"supported picture resolution: "+r.width+"x"+r.height);
if (r.width>maxWidth) {
maxWidth=r.width;
curRes=r;
}
}
if (curRes!=null) {
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPictureSize(curRes.width, curRes.height);
mCamera.setParameters(parameters);
Log.d(TAG, "selected picture resolution: " + curRes.width + "x" + curRes.height);
}
return;
}
public void setMaxPreviewResolution() {
int maxWidth=0;
Size curRes=null;
mCamera.lock();
for ( Size r: getResolutionList() ) {
if (r.width>maxWidth) {
Log.d(TAG,"supported preview resolution: "+r.width+"x"+r.height);
maxWidth=r.width;
curRes=r;
}
}
if (curRes!=null) {
setResolution(curRes);
Log.d(TAG, "selected preview resolution: " + curRes.width + "x" + curRes.height);
}
return;
}
@Override
public void onPreviewFrame(final byte[] data, final Camera camera) {
final Size previewSize = camera.getParameters().getPreviewSize();
if (mGLRgbBuffer == null) {
mGLRgbBuffer = IntBuffer.allocate(previewSize.width * previewSize.height);
}
if (mRunOnDraw.isEmpty()) {
runOnDraw(new Runnable() {
@Override
public void run() {
GPUImageNativeLibrary.YUVtoRBGA(data, previewSize.width, previewSize.height,
mGLRgbBuffer.array());
mGLTextureId = OpenGlUtils.loadTexture(mGLRgbBuffer, previewSize, mGLTextureId);
camera.addCallbackBuffer(data);
if (mImageWidth != previewSize.width) {
mImageWidth = previewSize.width;
mImageHeight = previewSize.height;
adjustImageScaling();
}
}
});
}
}
public static int loadTexture(final IntBuffer data, final Size size, final int usedTexId) {
int textures[] = new int[1];
if (usedTexId == NO_TEXTURE) {
GLES20.glGenTextures(1, textures, 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, size.width, size.height,
0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, data);
} else {
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, usedTexId);
GLES20.glTexSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, size.width,
size.height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, data);
textures[0] = usedTexId;
}
return textures[0];
}
/**
* 获取所有支持的预览尺寸
*/
public Size getPropPreviewSize(List<Size> list, int minWidth) {
Collections.sort(list, ascendSizeComparator);
int i = 0;
for (Size s : list) {
if ((s.width >= minWidth)) {
break;
}
i++;
}
if (i == list.size()) {
i = 0;//如果没找到,就选最小的size
}
return list.get(i);
}
/**
* 获取所有支持的返回图片尺寸
*/
public Size getPropPictureSize(List<Size> list, int minWidth) {
Collections.sort(list, ascendSizeComparator);
int i = 0;
for (Size s : list) {
if ((s.width >= minWidth)) {
break;
}
i++;
}
if (i == list.size()) {
i = 0;//如果没找到,就选最小的size
}
return list.get(i);
}
@NonNull
public static Point findSuitableImageSize(@NonNull final Parameters parameters,
final int frameWidth, final int frameHeight) {
final List<Size> sizes = parameters.getSupportedPreviewSizes();
if (sizes != null && !sizes.isEmpty()) {
Collections.sort(sizes, new CameraSizeComparator());
final float frameRatio = (float) frameWidth / (float) frameHeight;
for (float distortion = MIN_DISTORTION; distortion <= MAX_DISTORTION;
distortion += DISTORTION_STEP) {
for (final Size size : sizes) {
final int width = size.width;
final int height = size.height;
if (width * height >= MIN_PREVIEW_PIXELS &&
Math.abs(frameRatio - (float) width / (float) height) <= distortion) {
return new Point(width, height);
}
}
}
}
final Size defaultSize = parameters.getPreviewSize();
if (defaultSize == null) {
throw new CodeScannerException("Unable to configure camera preview size");
}
return new Point(defaultSize.width, defaultSize.height);
}
/** 设置回调 */
protected void setPreviewCallback() {
Camera.Size size = mParameters.getPreviewSize();
if (size != null) {
PixelFormat pf = new PixelFormat();
PixelFormat.getPixelFormatInfo(mParameters.getPreviewFormat(), pf);
int buffSize = size.width * size.height * pf.bitsPerPixel / 8;
try {
camera.addCallbackBuffer(new byte[buffSize]);
camera.addCallbackBuffer(new byte[buffSize]);
camera.addCallbackBuffer(new byte[buffSize]);
camera.setPreviewCallbackWithBuffer(this);
} catch (OutOfMemoryError e) {
Log.e("Yixia", "startPreview...setPreviewCallback...", e);
}
Log.e("Yixia", "startPreview...setPreviewCallbackWithBuffer...width:" + size.width + " height:" + size.height);
} else {
camera.setPreviewCallback(this);
}
}
@TargetApi(VERSION_CODES.HONEYCOMB)
protected List<Size> getSupportedVideoSizes(int currentSdkInt) {
Parameters params = mNativeCamera.getNativeCameraParameters();
List<Size> supportedVideoSizes;
if (currentSdkInt < Build.VERSION_CODES.HONEYCOMB) {
CLog.e(CLog.CAMERA, "Using supportedPreviewSizes iso supportedVideoSizes due to API restriction");
supportedVideoSizes = params.getSupportedPreviewSizes();
} else if (params.getSupportedVideoSizes() == null) {
CLog.e(CLog.CAMERA, "Using supportedPreviewSizes because supportedVideoSizes is null");
supportedVideoSizes = params.getSupportedPreviewSizes();
} else {
supportedVideoSizes = params.getSupportedVideoSizes();
}
return supportedVideoSizes;
}
@Override
public void onCameraViewStarted(int width, int height) {
String caption = Integer.valueOf(mOpenCvCameraView.getWidth()).toString() + "x" + Integer.valueOf(mOpenCvCameraView.getHeight()).toString();
Log.v("screen_size ",caption);
List<Camera.Size> mResolutionList = mOpenCvCameraView.getResolutionList();
Camera.Size mSize = null;
for (Camera.Size size : mResolutionList) {
Log.i(TAG, "Available resolution: "+size.width+" "+size.height);
if(size.width<=1280&&size.height<=960) { //change the resolution, 1280x960 and 1440x1080 are working fine in nexus 5x
mSize = size;
Log.i(TAG, "selected resolution: "+size.width+" "+size.height);
break;
}
}
mOpenCvCameraView.setResolution(mSize); //set resolution
Size resolution = mOpenCvCameraView.getResolution();
mRgba = new Mat();
//initialize findmazesandballs
findmazesandballs = new FindMazesAndBalls(mOpenCvCameraView.getWidth(), mOpenCvCameraView.getHeight(),resolution.width, resolution.height);
if(findmazesandballs.getselfAddr()!=0&&gs != null)
gs.setAddressandScreenSize(findmazesandballs.getselfAddr(),mOpenCvCameraView.getWidth(),mOpenCvCameraView.getHeight());
}
private Rect getCroppedRect(Size cameraPreviewSize, Rect visibleRect, int rotation) {
final int previewWidth = cameraPreviewSize.width;
final int previewHeight = cameraPreviewSize.height;
if (rotation % 180 > 0) rotateRect(visibleRect);
float scale = (float) previewWidth / visibleRect.width();
if (visibleRect.height() * scale > previewHeight) {
scale = (float) previewHeight / visibleRect.height();
}
final float newWidth = visibleRect.width() * scale;
final float newHeight = visibleRect.height() * scale;
final float centerX = (VERSION.SDK_INT < 14 || isTroublemaker()) ? previewWidth - newWidth / 2 : previewWidth / 2;
final float centerY = previewHeight / 2;
visibleRect.set((int) (centerX - newWidth / 2),
(int) (centerY - newHeight / 2),
(int) (centerX + newWidth / 2),
(int) (centerY + newHeight / 2));
if (rotation % 180 > 0) rotateRect(visibleRect);
return visibleRect;
}
public static @Nullable Size getPreferredPreviewSize(int displayOrientation,
int width,
int height,
@NonNull Parameters parameters) {
final int targetWidth = displayOrientation % 180 == 90 ? height : width;
final int targetHeight = displayOrientation % 180 == 90 ? width : height;
final double targetRatio = (double) targetWidth / targetHeight;
Log.d(TAG, String.format(Locale.US,
"getPreferredPreviewSize(%d, %d, %d) -> target %dx%d, AR %.02f",
displayOrientation, width, height,
targetWidth, targetHeight, targetRatio));
List<Size> sizes = parameters.getSupportedPreviewSizes();
List<Size> ideals = new LinkedList<>();
List<Size> bigEnough = new LinkedList<>();
for (Size size : sizes) {
Log.d(TAG, String.format(Locale.US, " %dx%d (%.02f)", size.width, size.height, (float)size.width / size.height));
if (size.height == size.width * targetRatio && size.height >= targetHeight && size.width >= targetWidth) {
ideals.add(size);
Log.d(TAG, " (ideal ratio)");
} else if (size.width >= targetWidth && size.height >= targetHeight) {
bigEnough.add(size);
Log.d(TAG, " (good size, suboptimal ratio)");
}
}
if (!ideals.isEmpty()) return Collections.min(ideals, new AreaComparator());
else if (!bigEnough.isEmpty()) return Collections.min(bigEnough, new AspectRatioComparator(targetRatio));
else return Collections.max(sizes, new AreaComparator());
}
@Override
public int compare(Size lhs, Size rhs) {
final double lhsDiff = Math.abs(target - (double) lhs.width / lhs.height);
final double rhsDiff = Math.abs(target - (double) rhs.width / rhs.height);
if (lhsDiff < rhsDiff) return -1;
else if (lhsDiff > rhsDiff) return 1;
else return super.compare(lhs, rhs);
}
protected Size choosePictureSize(List<Size> localSizes) {
Size size = null;
for (Size sz : localSizes) {
if (sz.width > 640 && sz.width <= 1024)
size = sz;
if (size != null)
break;
}
if (size == null)
size = localSizes.get(localSizes.size() - 1);
return size;
}
public Size getPreviewSize() {
if (null != camera) {
return camera.getParameters().getPreviewSize();
}
return null;
}
public Size getMaxPreviewResolution() {
int maxWidth=0;
Size curRes=null;
mCamera.lock();
for ( Size r: getResolutionList() ) {
if (r.width>maxWidth) {
maxWidth=r.width;
curRes=r;
}
}
return curRes;
}
public void onPreviewFrame(byte[] data, Camera camera) {
Size size = camera.getParameters().getPreviewSize();
// 这里需要将获取的data翻转一下,因为相机默认拿的的横屏的数据
byte[] rotatedData = new byte[data.length];
for (int y = 0; y < size.height; y++) {
for (int x = 0; x < size.width; x++)
rotatedData[x * size.height + size.height - y - 1] = data[x + y * size.width];
}
// 宽高也要调整
int tmp = size.width;
size.width = size.height;
size.height = tmp;
initCrop();
/**
* TODO
* ZBarDecoder 为qunar库 由于sdk需要剔除qunar相关的库 所以暂时注释掉
*/
// ZBarDecoder zBarDecoder = new ZBarDecoder();
String result = null;// = zBarDecoder.decodeCrop(rotatedData, size.width, size.height, mCropRect.left, mCropRect.top, mCropRect.width(), mCropRect.height());
if (!TextUtils.isEmpty(result)) {
previewing = false;
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
scanResult.setText("barcode result " + result);
barcodeScanned = true;
Intent intent = getIntent();
intent.putExtra("content",result);
setResult(Activity.RESULT_OK,intent);
CustomCaptureActvity.this.finish();
}
}
public Size getPreviewSize()
{
if (null != camera)
{
return camera.getParameters().getPreviewSize();
}
return null;
}
private static Size getPictureSize(){
if(camera == null){
return null;
}
try{
return camera.getParameters().getPictureSize();
}catch (Exception e){
return null;
}
}
public Camera.Size getMaxPictureResolution(float previewRatio) {
int maxPixels=0;
int ratioMaxPixels=0;
Camera.Size currentMaxRes=null;
Camera.Size ratioCurrentMaxRes=null;
for ( Camera.Size r: getPictureResolutionList() ) {
float pictureRatio = (float) r.width / r.height;
Log.d(TAG,"supported picture resolution: "+r.width+"x"+r.height+" ratio: "+pictureRatio);
int resolutionPixels = r.width * r.height;
if (resolutionPixels>ratioMaxPixels && pictureRatio == previewRatio) {
ratioMaxPixels=resolutionPixels;
ratioCurrentMaxRes=r;
}
if (resolutionPixels>maxPixels) {
maxPixels=resolutionPixels;
currentMaxRes=r;
}
}
//boolean matchAspect = mSharedPref.getBoolean("match_aspect", true);
if (ratioCurrentMaxRes!=null && true) {
Log.d(TAG,"Max supported picture resolution with preview aspect ratio: "
+ ratioCurrentMaxRes.width+"x"+ratioCurrentMaxRes.height);
return ratioCurrentMaxRes;
}
return currentMaxRes;
}
public void setResolution(Size resolution) {
disconnectCamera();
mMaxHeight = resolution.height;
mMaxWidth = resolution.width;
connectCamera(getWidth(), getHeight());
Log.d(TAG,"resolution: "+resolution.width+" x "+resolution.height);
}
public boolean equalRate(Size s, float rate) {
float r = (float) (s.width) / (float) (s.height);
if (Math.abs(r - rate) <= 0.03) {
return true;
} else {
return false;
}
}
public int compare(Size lhs, Size rhs) {
if (lhs.width == rhs.width) {
return 0;
} else if (lhs.width < rhs.width) {
return 1;
} else {
return -1;
}
}
public int compare(Size lhs, Size rhs) {
if (lhs.width == rhs.width) {
return 0;
} else if (lhs.width > rhs.width) {
return 1;
} else {
return -1;
}
}
private void initConfig() {
Log.v(TAG, "initConfig");
try {
mParameters = mCamera.getParameters();
// 如果摄像头不支持这些参数都会出错的,所以设置的时候一定要判断是否支持
List<String> supportedFlashModes = mParameters.getSupportedFlashModes();
if (supportedFlashModes != null && supportedFlashModes.contains(Parameters.FLASH_MODE_OFF)) {
mParameters.setFlashMode(Parameters.FLASH_MODE_OFF); // 设置闪光模式
}
List<String> supportedFocusModes = mParameters.getSupportedFocusModes();
if (supportedFocusModes != null && supportedFocusModes.contains(Parameters.FOCUS_MODE_AUTO)) {
mParameters.setFocusMode(Parameters.FOCUS_MODE_AUTO); // 设置聚焦模式
}
mParameters.setPreviewFormat(ImageFormat.NV21); // 设置预览图片格式
mParameters.setPictureFormat(ImageFormat.JPEG); // 设置拍照图片格式
mParameters.setExposureCompensation(0); // 设置曝光强度
Size previewSize = getSuitableSize(mParameters.getSupportedPreviewSizes());
mPreviewWidth = previewSize.width;
mPreviewHeight = previewSize.height;
mParameters.setPreviewSize(mPreviewWidth, mPreviewHeight); // 设置预览图片大小
Log.d(TAG, "previewWidth: " + mPreviewWidth + ", previewHeight: " + mPreviewHeight);
Size pictureSize = getSuitableSize(mParameters.getSupportedPictureSizes());
mParameters.setPictureSize(pictureSize.width, pictureSize.height);
Log.d(TAG, "pictureWidth: " + pictureSize.width + ", pictureHeight: " + pictureSize.height);
mCamera.setParameters(mParameters); // 将设置好的parameters添加到相机里
} catch (Exception e) {
e.printStackTrace();
}
}