gpt4 book ai didi

android - 位图在 onPictureTaken 中裁剪错误

转载 作者:行者123 更新时间:2023-11-29 01:37:33 29 4
gpt4 key购买 nike

我想实现自己的人脸检测/识别安卓应用。当相机发现一些人脸时,一个矩形会显示在相机预览中(实时)。应用程序也有拍照的方法。但是,我不想保存整个图片,只保存矩形内的区域 - 人脸。当我将矩形坐标提供给 Bitmap.createBitmap 方法来裁剪图片时,裁剪照片的正确性取决于显示的位置,即显示矩形的位置。当检测到的人脸出现在预览中间时,createBitmap 会裁剪它,但如果它显示在显示屏的左侧或右侧则不会。似乎我发送给 Bitmap.createBitmap 的坐标被转换了,但我找不到比例。任何解决方案?

  • 这是我的 onPictureTaken 方法:

     @Override
    public void onPictureTaken(byte[] data, Camera camera) {

    File pictureFile = getOutputMediaFile();
    if (pictureFile == null) {
    Log.d(TAG, "Error creating media file, check storage permissions: ");
    return;
    }

    Bitmap picture = BitmapFactory.decodeByteArray(data, 0, data.length);
    RectF faceRect = mPreview.getFaceRect();


    float x = faceRect.left;
    float y = faceRect.top;
    float w = faceRect.right - faceRect.left;
    float h = faceRect.bottom - faceRect.top;

    int intX = (int) x;
    int intY = (int) y;
    int intW = (int) w;
    int intH = (int) h;

    Bitmap croppedPicture = Bitmap.createBitmap(picture, intX, intY, intW, intH);
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    croppedPicture.compress(Bitmap.CompressFormat.JPEG, 100, stream);
    byte[] byteArrayFromPicture = stream.toByteArray();

    try {
    FileOutputStream fos = new FileOutputStream(pictureFile);
    fos.write(byteArrayFromPicture);
    //fos.write(data);
    fos.close();
    } catch (FileNotFoundException e) {
    Log.d(TAG, "File not found: " + e.getMessage());
    } catch (IOException e) {
    Log.d(TAG, "Error accessing file: " + e.getMessage());
    }
    }

这里是裁剪图片的一些示例,我没有足够的声誉来发布更多链接:

(不好意思做图片的图片,我懒得把矩形和照片一起保存了)

最佳答案

已解决

解决方案非常简单——因为使用前置摄像头,捕获的图像总是被反射,添加两个 if 子句:

Bitmap picture = BitmapFactory.decodeByteArray(data, 0, data.length);
RectF faceRect = mPreview.getFaceRect();
Camera.Parameters parameters = mCamera.getParameters();
int picWidth = parameters.getPictureSize().width;

int intX = 0;
int intY = (int) faceRect.top;
int intW = (int) (faceRect.right - faceRect.left);
int intH = (int) (faceRect.bottom - faceRect.top);

if(faceRect.left > picWidth / 2) {
intX = (int) (faceRect.right - (faceRect.right - picWidth / 2) * 2);
}
else if(faceRect.left <= picWidth / 2) {
intX = (int) (picWidth - faceRect.right);
}

Bitmap croppedPicture = Bitmap.createBitmap(picture, intX, intY, intW, intH);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
croppedPicture.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] byteArrayFromPicture = stream.toByteArray();

关于android - 位图在 onPictureTaken 中裁剪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26983719/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com