2

我为我的应用程序编写了一个自定义 ImageView (Android),效果很好。出于多种目的,我需要将视图坐标(例如单击的坐标)映射到图像坐标(单击发生在图像中的位置),因为图像可以缩放和滚动。到目前为止,以下方法似乎工作正常:

private PointF viewPointToImgPointF(PointF viewPoint) {
    final float[] coords = new float[] { viewPoint.x, viewPoint.y };
    Matrix matrix = new Matrix();
    getImageMatrix().invert(matrix);
    matrix.mapPoints(coords); // --> PointF in image as scaled originally
    if (coords != null && coords.length > 1) {
        return new PointF(coords[0] * inSampleSize,coords[1] * inSampleSize);
    } else {
        return null;
    }
}

private PointF imgPointToViewPointF(PointF imgPoint) {
    final float[] coords = new float[] { imgPoint.x / inSampleSize, imgPoint.y / inSampleSize };
    getImageMatrix().mapPoints(coords);
    if (coords != null && coords.length > 1) {
        return new PointF(coords[0], coords[1]);
    } else {
        return null;
    }
}

在大多数情况下,我可以毫无问题地使用这些方法,但现在我注意到它们并非 100% 准确,因为我尝试了以下方法:

            PointF a = new PointF(100,100);
        PointF b = imgPointToViewPointF(a);
        PointF a2 = viewPointToImgPointF(b);
        PointF b2 = imgPointToViewPointF(a2);
        PointF a3 = viewPointToImgPointF(b2);

并得到这些值:

a: Point(100, 100)
b: Point(56, 569)
a2: Point(99, 99)
b2: Point(55, 568)
a3: Point(97, 97)

如果一切正常,所有 a- 值和所有 b- 值应该保持不变。

我还发现,这种微小的差异正在向图像中心减小。如果 (100, 100) 是图像的中心,那么这些方法将提供正确的结果!

有没有人经历过类似的事情,甚至可能有解决方案?还是我做错了什么?

(对于我测试的图像,inSampleSize == 1。它表示图像已调整大小以节省内存的因素)

4

2 回答 2

1

我没有检查过这个确切的场景,但看起来你的问题是反复将浮点数转换回 int,然后在第二次迭代中再次使用该值作为浮点数。演员阵容中细节的损失每次都会加剧。

于 2013-11-14T12:46:00.060 回答
0

好的,看起来它确实是 Android < 4.4 中的一个错误。

它现在适用于已更新但仍适用于 4.3 及更早版本的设备。所以我认为在旧设备上我无法避免它(除了自己进行整个矩阵计算。我肯定不会......)

于 2013-12-11T16:06:21.520 回答