【发布时间】:2021-07-15 09:05:10
【问题描述】:
类似于tutorial 中的内容,我正在使用代码初始化 CameraX 的图像分析用例:
ImageAnalysis imageAnalysis =
new ImageAnalysis.Builder()
.setTargetResolution(new Size(1280, 720))
.setTargetRotation(Surface.ROTATION_90)
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build();
imageAnalysis.setAnalyzer(executor, new ImageAnalysis.Analyzer() {
@Override
public void analyze(@NonNull ImageProxy image) {
int rotationDegrees = image.getImageInfo().getRotationDegrees();
// insert your code here.
}
});
cameraProvider.bindToLifecycle((LifecycleOwner) this, cameraSelector, imageAnalysis, preview);
我正在尝试使用setTargetRotation 方法,但我不清楚我应该如何将此旋转应用于输出图像,如文档中模糊描述的那样:
ImageInfo 的旋转值将是旋转,如果应用于输出图像,将使图像匹配此处指定的目标旋转。
如果我在上面显示的 analyze() 方法中设置断点,则在更改 setTargetRotation 值时图像对象不会旋转,因此我假设文档告诉我使用 getTargerRotation() 获取方向感觉这两段代码(构建器与分析器)是分开编码的,并且此信息可以在两者之间传递而无需实际应用任何旋转。我理解正确吗?这对我来说真的没有意义,因为setTargetResolution 方法实际上改变了通过 ImageProxy 发送的大小。我认为setTargetRotation 也应该应用所述旋转,但它似乎没有。
如果我的理解是正确的,那么在进入analyze 方法后,是否有一种最佳的有效方式来旋转这些ImageProxy 对象?现在我正在通过
Bitmap myImg = BitmapFactory.decodeResource(someInutStream);
Matrix matrix = new Matrix();
matrix.postRotate(30);
Bitmap rotated = Bitmap.createBitmap(myImg, 0, 0, myImg.getWidth(), myImg.getHeight(),
matrix, true);
以上想法来自here,但我认为这不是最有效的方法。我敢肯定我也可以想出一种方法来转置数组,但这很快就会变得乏味和混乱。有没有办法设置 ImageAnalysis Builder 直接发送旋转后的 ImageProxy 而不必制作所有内容的位图?
【问题讨论】: