Android 解决MTK相机前摄镜像问题

很莫名其妙的,前摄默认镜像,原来是为了前摄拍字体正确显示,比如自拍,前摄拍摄的人像虽左右镜像了,但如果后面有字牌显示,字体会显示正常而不是翻转。但现在需求是满足普遍的前摄原生代码不带镜像修改,需要把预览和保存的图片进行左右翻转,那么就需要找到相应的修改位置才行。

以下就是相关修改点:直接修复前摄镜像显示 即可正常显示

充分利用此方法:

PhotoModeHelper.rotateAndMirror(bitmap, orientation, true);

matrix.postScale(-1, 1);

1 ./vendor/mediatek/proprietary/packages/apps/Camera2/common/src/com/mediatek/camera/common/utils/CameraUtil.java

//*/add package

import android.graphics.BitmapFactory;

import com.mediatek.camera.common.mode.photo.PhotoModeHelper;

import java.io.ByteArrayOutputStream;

import android.graphics.Bitmap;

//*/
添加在最后的方法

//*/add sub camera mirror method mirrorJpegData

public static byte[] mirrorJpegData (byte[] jpegData, int orientation) {

byte[] dest = jpegData;

BitmapFactory.Options opts = new BitmapFactory.Options();

opts.inMutable = true;

Bitmap b = BitmapFactory.decodeByteArray(jpegData, 0, jpegData.length, opts);

b = PhotoModeHelper.rotateAndMirror(b, orientation, true);

ByteArrayOutputStream baos = new ByteArrayOutputStream();

b.compress(Bitmap.CompressFormat.JPEG, 100, baos);

dest = baos.toByteArray();

b.recycle();

return dest;

}

//*/

2. /vendor/mediatek/proprietary/packages/apps/Camera2/common/src/com/mediatek/camera/common/mode/photo/PhotoMode.java

@Override

public void onPostViewCallback(byte[] data) {

LogHelper.d(TAG, "[onPostViewCallback] data = " + data + ",mIsResumed = " + mIsResumed);

CameraSysTrace.onEventSystrace(POST_VIEW_CALLBACK, true, true);

if (data != null && mIsResumed) {

//will update the thumbnail

int rotation = CameraUtil.getJpegRotationFromDeviceSpec(Integer.parseInt(mCameraId),

mIApp.getGSensorOrientation(), mIApp.getActivity());

Bitmap bitmap = BitmapCreator.createBitmapFromYuv(data,

ThumbnailHelper.POST_VIEW_FORMAT,

ThumbnailHelper.getThumbnailWidth(),

ThumbnailHelper.getThumbnailHeight(),

mIApp.getAppUi().getThumbnailViewWidth(),

rotation);

//*/ add sub camera mirror
if (mCameraId.equals(FRONT_CAMERA_ID)) {//BACK_CAMERA_ID
Matrix m = new Matrix();
m.postScale(-1, 1);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true);
}
//*/

mIApp.getAppUi().updateThumbnail(bitmap);

}

CameraSysTrace.onEventSystrace(POST_VIEW_CALLBACK, false, true);

}

===============

保存数据是通过PhotoMode.java文件中的saveData方法实现,具体修改参照如下:引用方法

private void saveData (byte[] data) {

if (data != null) {

//*/ add. sub camera mirror
if (mCameraId.equals(FRONT_CAMERA_ID)) {//BACK_CAMERA_ID
data = CameraUtil.mirrorJpegData(data, 0);
}
//*/

//check memory to decide whether it can take next picture.

//if not, show saving

ISettingManager.SettingController controller = mISettingManager.getSettingController();

String dngState = controller.queryValue(KEY_DNG);

long saveDataSize = data.length;

if (dngState != null && "on".equalsIgnoreCase(dngState)) {

saveDataSize = saveDataSize + DNG_IMAGE_SIZE;

}

synchronized (mCaptureNumberSync) {

mCapturingNumber ++;

mMemoryManager.checkOneShotMemoryAction(saveDataSize);

}

String fileDirectory = mICameraContext.getStorageService().getFileDirectory();

Size exifSize = CameraUtil.getSizeFromSdkExif(data);

ContentValues contentValues = mPhotoModeHelper.createContentValues(data,

fileDirectory, exifSize.getWidth(), exifSize.getHeight());

mICameraContext.getMediaSaver().addSaveRequest(data, contentValues, null,

mMediaSaverListener);

}

}

到此完结撒花!

相关推荐
qwert103718 小时前
相机视图矩阵的由来:从空间感知到图形渲染的核心桥梁
数码相机·矩阵·图形渲染
2601_957418801 天前
【源码级方案】Android相机PTP/MTP连接全解析:一套源码解决所有兼容性问题
数码相机
kyle~2 天前
Linux时间系统4---从PHC_PTP到ROS 2驱动与控制链路
linux·运维·数码相机
ZPC82102 天前
识别物体 3D 位置 + 自动生成机器人抓取位姿」
数码相机·yolo·计算机视觉
gaosushexiangji2 天前
触达光子极限:从国产sCMOS相机技术突破看科学仪器的底层创新
数码相机
moonsims2 天前
全国产通、感、算、控一体化AIBrainBox:5G+自组网 双C2链路、多模态融合定位、国产化高帧率全局曝光MIPI相机、边缘AI;工业级INS模块
数码相机
博图光电2 天前
博图短波红外相机(SWIR)应用领域
数码相机
dapei373 天前
Cameralink采集卡软件ESpeedGrab使用讲解:9直方图拉伸
数码相机·opencv·计算机视觉
番茄炒西红柿炒洋柿子3 天前
OpenCV实现相机畸变校准
人工智能·数码相机·opencv
搬砖者(视觉算法工程师)3 天前
计算机视觉与计算摄影测量学第二讲:相机基础与光的传播
数码相机·三维重建