java - Android:我需要一个圆形相机预览。如何实现?

标签 java android xml camera

我发现自己需要帮助。

我正在尝试开发这个简单的拍照应用(哇,原来是原创!)。一切都很好。我唯一需要的是有一个 CIRCULAR CAMERA PREVIEW。

我将我的 camerapreview 类(它扩展了 surfaceview)放置在一个框架布局中,这基本上是我的相机预览。众所周知,它呈矩形。由于我对应用程序有更大的计划,我需要圆形的相机预览(例如,有人可以拍下某人的脸,而我可以在周围画一些图……)。

现在,我不知道如何进行。我尝试了不同的方法,使用 xml 创建了一个形状并将其设置为我的框架布局的背景,但这并没有奏效。

在谷歌上花了几个小时寻找解决方案后,我决定放弃并来到这里。

所以,如果有人知道任何事情,请告诉我们 :) 我希望我说得足够清楚,如果需要,请不要犹豫,要求澄清。

最佳答案

简单的方法:

1) 没有为priview设置surface

2)捕捉原始数据

3) 转换为位图并制作circle

4) 显示(例如在 imegeview 上)

仅供示例:

public class CameraRoundPriview extends ImageView {
 private Camera camera;
 private Bitmap bitmap = null;
 private int mPreviewWidth, mPreviewHeight; 
 boolean mCameraOn = false;  

 public CameraRoundPriview(Context context, AttributeSet attrs) {
        super(context, attrs); 
 }   

 private Bitmap getclip() { 
     //clip
     Bitmap output = Bitmap.createBitmap(bitmap.getHeight(),
                                         bitmap.getHeight(), 
                                         Config.ARGB_8888);  
     Canvas canvas = new Canvas(output);     
     final int color = 0xff424242;
     final Paint paint = new Paint();
     final Rect rect = new Rect(0, 0, bitmap.getHeight(),
                                     bitmap.getHeight()); 

     paint.setAntiAlias(true);
     canvas.drawARGB(0, 0, 0, 0);
     canvas.drawCircle(bitmap.getHeight() / 2,
                       bitmap.getHeight() / 2, 
                       bitmap.getHeight() / 2, paint);
     paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
     canvas.drawBitmap(bitmap, rect, rect, paint);

     //rotate
      android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
      android.hardware.Camera.getCameraInfo(getCameraID(), info);
      int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
      int degrees = 0;
      switch (rotation) {
          case Surface.ROTATION_0:
              degrees = 0;
              break;
          case Surface.ROTATION_90:
              degrees = 90;
              break;
          case Surface.ROTATION_180: 
              degrees = 180;
              break;
          case Surface.ROTATION_270:
              degrees = 270;
              break;
      }

     int result = degrees; 
     if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP){
          if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
              result = (info.orientation + degrees) % 360;
              result = (360 - result) % 360; // compensate the mirror
          } else { // back-facing
              result = (info.orientation - degrees + 360) % 360;
          }
     }
     Matrix matrix = new Matrix();
     matrix.postRotate(result);
     Bitmap scaledBitmap  = Bitmap.createScaledBitmap(output,output.getWidth(),output.getHeight(),true);
     Bitmap rotatedBitmap = Bitmap.createBitmap(scaledBitmap , 0, 0, scaledBitmap.getWidth(), scaledBitmap .getHeight(), matrix, true);

     return rotatedBitmap;
 }

private void showImage(){   
     if ((bitmap != null)){
         this.setImageBitmap(getclip());   
     }
 }

public boolean onClickCamera(){
    if (mCameraOn){
        mCameraOn = false;
        cameraStop();
    }else{
        mCameraOn = true;
        cameraStart();
    }
    return mCameraOn;
}

private void cameraStop(){
    if (camera == null) return;
    camera.setPreviewCallback(null);
    camera.release();
    camera = null; 
}

private int getCameraID(){
    // specify camera id
    return 0;
}

private void cameraStart(){
      Camera camera = Camera.open(getCameraID());
      final Camera.Size previewSize   = camera.getParameters().getPreviewSize();
      mPreviewWidth                   = previewSize.width; 
      mPreviewHeight                  = previewSize.height; 

      try {  
       camera.setPreviewCallback(new PreviewCallback() {
        public void onPreviewFrame(byte[] data, Camera camera_call) {
         ByteArrayOutputStream outstr = new ByteArrayOutputStream();
         Rect rect = new Rect(0, 0, mPreviewWidth, mPreviewHeight);  
         YuvImage yuvimage=new YuvImage(data,ImageFormat.NV21,mPreviewWidth,mPreviewHeight,null);
         yuvimage.compressToJpeg(rect, 50, outstr);
         bitmap = BitmapFactory.decodeByteArray(outstr.toByteArray(), 0, outstr.size());
         showImage();
         camera_call.addCallbackBuffer(data);
        } 
       }); 
      } catch (Exception e) {}
      camera.startPreview();

      this.camera=camera;   
}
}

关于java - Android:我需要一个圆形相机预览。如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23136695/

相关文章:

c# - 在 WP8 应用程序中反序列化 XML

java - 如何将lucene36转移到lucene 40

java - 处理文件时,如果行之间有空字符串,则中断进程,但在文件末尾时则不会中断进程

android - 如何将 Espresso UI 测试编译成一个版本?

php - 将 xml 产品加载到 mysql 数据库中,更新存在 productid 的位置,插入新的位置并删除 db 中不在 xml 中的 productid

php - 使用PHP从XML youtube视频获取视频ID

java - 从当前日期获取当前财政年度 (YYYY-YYYY)

java - 在 Java 中读取打开的进程/应用程序列表?

Android facebook SDK - 无法为 facebook sharebutton 设置 onclicklistener

java - 如果获取数据的结果为空,如何停止AsyncTask?