如何以正确的方式预览图库中的图像?

时间:2014-01-06 11:23:38

标签: android image orientation android-camera

背景

我知道某些设备无法自动旋转相机拍摄的照片,因此您必须获取相机拍摄时的方向,拍摄照片的时间(链接hereherehere)。

我需要以正确的方向显示所有这些照片的网格(如果需要,可以旋转),使用固定的单元格大小并使用中心裁剪方式

问题

使用中心裁剪不起作用,因为它不允许我使用ScaleType.MATRIX。我只是不知道如何实现它,因为我希望尽可能少地使用内存,我不希望创建额外的位图......

我尝试了什么

这是我尝试过的,但由于我在这方面相当不高,我不知道如何进一步解决它:

/**
 * @param rotationDegree
 *            degrees to rotate the image, currently should only be any of the values: 0,90,180,270
 */
public static void setImageRotation(final ImageView imageView, final Bitmap bitmap, final int rotationDegree,
        final int dstWidth, final int dstHeight) {
    final Matrix matrix = new Matrix();
    imageView.setScaleType(ScaleType.MATRIX);
    matrix.preRotate(rotationDegree, bitmap.getWidth() / 2, bitmap.getHeight() / 2);
    matrix.postScale((float) dstWidth / bitmap.getHeight(), (float) dstHeight / bitmap.getWidth());
    imageView.setImageMatrix(matrix);
}

我还获得了用于中心裁剪的imageView的android代码,并创建了下一个函数:

public static void prepareCenterCropMatrix(final Matrix matrix, final int srcWidth, final int srcheight,
        final int dstWidth, final int dstHeight) {
    float scale;
    float dx = 0, dy = 0;
    if (srcWidth * dstHeight > dstWidth * srcheight) {
        scale = (float) dstHeight / (float) srcheight;
        dx = (dstWidth - srcWidth * scale) * 0.5f;
    } else {
        scale = (float) dstWidth / (float) srcWidth;
        dy = (dstHeight - srcheight * scale) * 0.5f;
    }
    matrix.setScale(scale, scale);
    matrix.postTranslate((int) (dx + 0.5f), (int) (dy + 0.5f));
}

但无论我如何尝试使用它,它都不起作用。

问题

任何人都可以帮我这个吗?


编辑:我找到了一个替代方案,我写过here。这将告诉imageView如何绘制旋转的位图/ drawable。

然而,我仍然想知道在解码时是否有办法解决这个问题。

1 个答案:

答案 0 :(得分:0)

尝试以下

       imageView.setScaleType(ScaleType.FIT_XY); 
or 
       imageView.setScaleType(ScaleType.FIT_END);