精华内容
下载资源
问答
  • //图片旋转后 Rect imageRect = finder_view.getScanAreaRect(size.height, size.width); bmp = Bitmap.createBitmap(bmp, imageRect.left, imageRect.top, imageRect.width(), imageRect.height()); //...
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    
    image.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, stream);
    Bitmap bmp = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size());


    Matrix matrix = new Matrix();
    matrix.setRotate(90);
    bmp = Bitmap.createBitmap(bmp, 0, 0, size.width, size.height, matrix, false);
    //图片旋转后
    Rect imageRect = finder_view.getScanAreaRect(size.height, size.width);
    bmp = Bitmap.createBitmap(bmp, imageRect.left, imageRect.top, imageRect.width(), imageRect.height());
    //此时的bmp已经只包含了框内的画面
    stream.reset();
    display.setImageBitmap(bmp);
    展开全文
  • 仿华为相机旋转动画,配置界面支持 随重力360度旋转
  • Android开发中经常需要重写相机,由此会导致一些旋转的情况(不同的设备摄像头角度是不一样的),此处按照解决思路给出解决方案: 情形一:只需要旋转摄像头方向以及最终的照片,注意两者需要保持一致 1. 获取当前...

    Android开发中经常需要重写相机,由此会导致一些旋转的情况(不同的设备摄像头角度是不一样的),此处按照解决思路给出解决方案:

    情形一:只需要旋转摄像头方向以及最终的照片,注意两者需要保持一致

    1. 获取当前相机摄像头的角度,并进行相应的旋转,方法如下:

    此处获取到的摄像头角度可以保存下来,在后面情形二中会用到,这里存到静态变量 orientationDegree 中。

    public static int orientationDegree = 0;

       /**
         * 适配相机旋转
         *
         * @param activity
         * @param cameraId
         * @param camera
         */
        public void setCameraDisplayOrientation(Activity activity, int cameraId, Camera camera) {
            Camera.CameraInfo info = new Camera.CameraInfo();
            Camera.getCameraInfo(cameraId, 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;
            //前置
            if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                result = (info.orientation + degrees) % 360;
                result = (360 - result) % 360;
            }
            //后置
            else {
                result = (info.orientation - degrees + 360) % 360;
            }
            orientationDegree = result;
            camera.setDisplayOrientation(result);
        }
    

    2. 上述方法中涉及到的参数,第一个Activity,可以传入当前相机Activity的Context,随后进行强转;第二个参数为相机ID(一般设备有多个摄像头,前置,后置等等),下面将给出获取相机ID的方法;

    第三个参数为camera对象,当调用open方法的时候就可以获取到 mCamera = Camera.open();

    获取相机ID的方法如下:

       /**
         * 获取摄像头ID
         *
         * @return
         */
        private int getDefaultCameraId() {
            int defaultId = -1;
            int numberOfCameras = Camera.getNumberOfCameras();
    
            Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
            for (int i = 0; i < numberOfCameras; i++) {
                Camera.getCameraInfo(i, cameraInfo);
                if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
                    defaultId = i;
                }
            }
            if (defaultId == -1) {
                if (numberOfCameras > 0) {
                    //没有后置摄像头
                    defaultId = 0;
                } else {
                    Logger.e("没有摄像头");
                }
            }
            return defaultId;
        }

    情形二:在情形一的基础上,需要旋转拍摄过程中的视频帧,与其他平台对接,涉及到JNI编程。此处参考了stackoverflow上的解答,链接如下:

    https://stackoverflow.com/questions/14167976/rotate-an-yuv-byte-array-on-android

    拍照回调过程中会产生图片数据,格式为NV21.类型是字节数据。如果需要将此数据传输到其他平台或者保存到本地(本地视频),则也需要进行相应的旋转。

    public class CameraPreviewCallback implements Camera.PreviewCallback {
    public CameraPreviewCallback(CameraPreviewSend previewSend) { this.mCameraPreviewSend = previewSend; } /** * 在相机预览时每产生一帧时回调 * * @param data 图片数据,格式 NV21 * @param camera 相机对象 */ @Override public void onPreviewFrame(byte[] data, Camera camera) { //todo:业务逻辑 } }

    情形一中获取到的相机旋转角度,此处根据角度来进行相应的旋转。具体方法如下:

    switch (orientationDegree) {
                    case 0:
                        localFrameSave(data);
                        break;
                    case 90:
                        localFrameSave(picRotate90(data, previewWidth, previewHeight));
                        break;
                    case 180:
                        localFrameSave(picRotate180(data, previewWidth, previewHeight));
                        break;
                    case 270:
                        localFrameSave(picRotate270(data, previewWidth, previewHeight));
                        break;
                }
        /**
         * 旋转图片,顺时针旋转90度
         *
         * @param data   nv21格式的图片
         * @param width  图片宽度
         * @param height 图片高度
         * @return 转换后的图片数据
         */
        public native byte[] picRotate90(byte[] data, int width, int height);
    
        static {
            System.loadLibrary("native-lib");
        }

    cpp部分:

    /**
     * 将nv21格式的图片旋转90度
     */
    extern "C"
    jbyteArray
    Java_com_XXX_io_CameraPreviewSend_picRotate90(
            JNIEnv *env, jobject /*this*/, jbyteArray data, jint width, jint height) {
        jbyte *pBuffer = env->GetByteArrayElements(data, 0);
        int length = env->GetArrayLength(data);
        jbyte newData[length];//返回的图片数据
        //根据原数据pBuffer生成新数据newData
        doRotate(pBuffer, newData, width, height);
    
        jbyteArray array = env->NewByteArray(length);
        env->SetByteArrayRegion(array, 0, length, newData);
        env->ReleaseByteArrayElements(data, pBuffer, 0);
        return array;
    } 
    /**
     * 将nv21格式的图片旋转90度
     * @param data 原图片数据
     * @param newData 转换所得图片数据
     * @param width 转换后的图片的宽度
     * @param height 转换后的图片的高度
     */
    void doRotate(jbyte *data, jbyte *newData, jint width, jint height) {
        int i = 0;
        for (int x = 0; x < width; x++) {
            for (int y = height - 1; y >= 0; y--) {
                newData[i] = data[y * width + x];
                i++;
            }
        }
        i = width * height * 3 / 2 - 1;
        for (int x = width - 1; x > 0; x = x - 2) {
            for (int y = 0; y < height / 2; y++) {
                newData[i] = data[(width * height) + (y * width) + x];
                i--;
                newData[i] = data[(width * height) + (y * width) + (x - 1)];
                i--;
            }
        }
    }

    旋转180度的情况:

    /**
     * 将nv21格式的图片旋转180度
     * @param data
     * @param newData
     * @param width
     * @param height
     */
    void doRotate180(jbyte *data, jbyte *newData, jint width, jint height) {
        int i = 0;
        int count = 0;
        for (i = width * height - 1; i >= 0; i--) {
            newData[count] = data[i];
            count++;
        }
        for (i = width * height * 3 / 2 - 1; i >= width * height; i -= 2) {
            newData[count++] = data[i - 1];
            newData[count++] = data[i];
        }
    }
    
    /**
     * 将nv21格式的图片旋转180度
     */
    extern "C"
    jbyteArray
    Java_com_XXX_io_CameraPreviewSend_picRotate180(
            JNIEnv *env, jobject /*this*/, jbyteArray data, jint width, jint height) {
        jbyte *pBuffer = env->GetByteArrayElements(data, 0);
        int length = env->GetArrayLength(data);
        jbyte newData[length];//返回的图片数据
        //根据原数据pBuffer生成新数据newData
        doRotate180(pBuffer, newData, width, height);
    
        jbyteArray array = env->NewByteArray(length);
        env->SetByteArrayRegion(array, 0, length, newData);
        env->ReleaseByteArrayElements(data, pBuffer, 0);
        return array;
    }

    旋转270度的情况:

    /**
     * 将nv21格式的图片旋转270度
     * @param data
     * @param newData
     * @param width
     * @param height
     */
    void doRotate270(jbyte *data, jbyte *newData, jint width, jint height) {
        // Rotate the Y
        int i = 0;
        for (int x = width - 1; x >= 0; x--) {
            for (int y = 0; y < height; y++) {
                newData[i] = data[y * width + x];
                i++;
            }
        }// Rotate the U and V color components
        i = width * height;
        for (int x = width - 1; x > 0; x = x - 2) {
            for (int y = 0; y < height / 2; y++) {
                newData[i] = data[(width * height) + (y * width) + (x - 1)];
                i++;
                newData[i] = data[(width * height) + (y * width) + x];
                i++;
            }
        }
    }
    
    /**
     * 将nv21格式的图片旋转270度
     */
    extern "C"
    jbyteArray
    Java_com_XXX_io_CameraPreviewSend_picRotate270(
            JNIEnv *env, jobject /*this*/, jbyteArray data, jint width, jint height) {
        jbyte *pBuffer = env->GetByteArrayElements(data, 0);
        int length = env->GetArrayLength(data);
        jbyte newData[length];//返回的图片数据
        //根据原数据pBuffer生成新数据newData
        doRotate270(pBuffer, newData, width, height);
    
        jbyteArray array = env->NewByteArray(length);
        env->SetByteArrayRegion(array, 0, length, newData);
        env->ReleaseByteArrayElements(data, pBuffer, 0);
        return array;
    }

    完结,很感谢stackoverflow上的解答。

     

    转载于:https://www.cnblogs.com/xuanwei-qingfeng/p/8058562.html

    展开全文
  • 好,所以我想我明白了!看来Xamarin中的OpenCV示例...所以,我返工内码ProcessedCameraPreviewprotected override void OnDraw(Android.Graphics.Canvas canvas)本来我是转换图像对象下面对本机的Android位图和旋转...

    好,所以我想我明白了!

    看来Xamarin中的OpenCV示例使用缓冲区中的原始数据流,并且默认情况下以90度角出现,无论您具有相机的UI布局或设置/参数的方向。

    所以,我返工内码ProcessedCameraPreview

    protected override void OnDraw(Android.Graphics.Canvas canvas)

    本来我是转换图像对象下面对本机的Android位图和旋转的。性能受到很大影响。

    Image image = _bgrBuffers.GetBuffer(0);

    所以,我想通了,如果我做了以下内容: -

    Image rotateImage = image.Rotate(90, new Bgr(System.Drawing.Color.Black));

    canvas.DrawBitmap(rotateImage.ToBitmap(), 0, 0, _paint);

    在90度角的要求它将呈现。性能影响并不十分明显。

    我现在有图像对象,我需要执行我想要使用的OpenCV函数。

    P.S.值得注意的另一个值得注意的方法是使用Canvas旋转画面: -

    Matrix matrix = new graphics.Matrix();

    matrix.PostRotate(90);

    DrawBitmap(image.ToBitmap(), matrix, _paint);

    对性能的影响并不明显。

    展开全文
  • 最近在做一款 Android 端的自定义相机,发现有些手机(如三星、LG,大部分手机是正确的)拍出的照片方向并不对, 且通过 Exif 信息读取到的 旋转角度是 0,也就是说没有办法通过旋转角度去纠正所拍摄的照片。 另外...
  • //自动旋转180情况下 myCamera = Camera.open(); myCamera .setDisplayOrientation(180); //图片旋转180情况下解决方法 params.set("orientation", "portrait"); params.set("rotation", 180);

     //自动旋转180情况下

    myCamera = Camera.open();

    myCamera .setDisplayOrientation(180);
    //图片旋转180情况下解决方法
    params.set("orientation", "portrait");
    params.set("rotation", 180);

    展开全文
  • 首先找到CameraBridgeViewBase文件的 protected void deliverAndDrawFrame(CvCameraViewFrame frame)方法,阅读源码发现该方法主要实现的就是相机预览图的绘制,核心代码如下: if (bmpValid && ...
  • 主要通过获取EXIF信息进行设置:publicstaticintreadPictureDegree(Stringpath){intdegree=0;try{ExifInterfaceexifInterface=newExifInterface(path);intorientation=exifInterface.getAttributeInt(ExifInterf...
  • 我已经创建了一个相机应用程序,我想让我的应用程序在所有4个可能的方向转换,并相应地更新相机预览.因为我已经使用我从以下复制的以下方法:Android – Camera preview is sidewayspublic void updateCameraDisplay...
  • Android OpenCV接入后竖屏JavaCameraView旋转90°问题解决(本文缺胳膊断腿,个人处理方法留存,慎点) 这篇博客只是留个临时的处理方法,如果大神们有其他方法来分享分享喔。 首先,JavaCameraView进行人脸识别、...
  • android相机拍照,存储 调用相册, 图片旋转,裁剪
  • 自定义相机旋转拍照角度

    千次阅读 2017-07-03 17:07:55
    自定义相机拍照时有时会把手机倾斜着拍或者倒过来拍,怎么能在浏览拍摄的照片时看到的是一张正立的图片呢? 先利用传感器获得手机的拍照时的角度 private SensorManager sm = null; private SensorEventListener ...
  • Android Camera 照相机屏幕旋转问题

    万次阅读 2014-03-22 09:46:01
    (1)旋转手机时,SurfaceView 预览图像反转或旋转90度。 解决:在拍照过程中应该设置为将内容始终横屏显示,这样,在拍照程序中SurfaceView的内容就不会旋转90度或180度了。 在AndroidManifest.xml中设置android:...
  •  * 获取图片的旋转角度,有些系统把拍照的图片旋转了,有的没有旋转  */  int degree = readPictureDegree(path);  BitmapFactory.Options opts=new BitmapFactory.Options();//获取缩略图显示到屏幕上  opts....
  • 在部分Android手机(如MT788、Note2)上,使用Camera拍照以后,得到的照片会被自动旋转(90°、180°、270°),这个情况很不符合预期。仔细分析了一下,因为照片属性中是存储了旋转信息的,所以要解决这个问题,...
  • 一直白嫖,今天尝试写点东西吧,一小段代码,解决了相机旋转后再移动方向跟着变的问题,有不对的地方希望大佬们多多指教 using System.Collections; using System.Collections.Generic; using UnityEngine; using ...
  • 在IM拍照时,在三星s7 eadge上拍完照片后从sd上拿到的地址设置给Imageview后显示时,图片旋转了90度。But我拍照的时候明明是竖着拍的,相册预览也是竖着的,为什么拿到图片后就成了横着的? 对比了另一台手机锤子...
  • //自定义相机前置摄像头旋 myCamera = Camera.open(); myCamera .setDisplayOrientation(180); //图片旋转180情况下解决方法 params.set("orientation", "portrait"); params.set("...
  • 0、相关文章: 【Bitmap-旋转】解决Android相机拍照之后照片的翻转问题(阅读量131) 处理相机拍照后Bitmap和图片旋转问题(阅读量1168)
  • 在部分Android手机(如MT788、Note2)上,使用Camera拍照以后,得到的照片会被自动旋转(90°、180°、270°),这个情况很不符合预期。仔细分析了一下,因为照片属性中是存储了旋转信息的,所以要解决这个问题,...
  • 当我将手机旋转90度时,相机预览工作正常.但是当我将手机快速旋转180度时,相机预览会颠倒过来.有没有解决方案……这是我的代码如下:public class CustomCameraActivity extends Activity implementsSurfaceHolder....
  • Core.rotate()旋转 Core.flip()翻转 参考: https://blog.csdn.net/qq_35952946/article/details/79036909 https://blog.csdn.net/tryflys/article/details/78926133 ...
  • ///  /// 获取原图旋转角度(IOS和Android相机拍的照片)  ///  ///  ///  public static int readPictureDegree(string path)  {  int rotate = 0;
  • 简单安卓相机应用

    2015-03-15 13:21:28
    简单安卓相机应用,拍照存储,旋转的处理。
  • zxing优化-针对不同相机旋转角度的适配 zxing大家都知道的,一款不错的二维码扫描库,...Android相机一般默认旋转90度、270度(大概还有180度吧只是我没见过),需求上又要求,咱们竖屏,于是咱们实现了预览的竖...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,190
精华内容 3,676
关键字:

安卓相机旋转