为啥使用矩阵到图像视图与位图的结果不同?

Posted

技术标签:

【中文标题】为啥使用矩阵到图像视图与位图的结果不同?【英文标题】:why different results using matrix to imageview vs bitmap?为什么使用矩阵到图像视图与位图的结果不同? 【发布时间】:2015-05-28 23:58:52 【问题描述】:

为什么使用带有 ImageView 的矩阵 setImageMatrix(matrix) 和 Bitmap.createBitmap(bmp, 0, 0, bmp.width(), bmp.height(), matrix, true); 给出不同的结果?

选项 1。 使用 setImageMatrix(matrix);只有我才能正常工作 设置布局参数(设备宽度,设备高度); 这意味着可绘制的大小可能小于 ImageView 的大小,因为您可以看到 setBackgroundColor(Color.RED) 绘制整个屏幕,而我需要具有精确可绘制大小的 ImageView,但是当我使用 setLayoutParams() 和大小时适当的位图大小 位图被裁剪 你可以看到图像,我用 deviceSize-layoutParams 和 bitmapSize-layoutParams 显示 ImageView 这是我的矩阵 矩阵[1.8266667, 0.0, 110.0][0.0, 1.3733333, 117.000015][0.0, 0.0, 1.0]

private void drawBitmap() 
    imageView = new ImageView(this);
    imageView.setLayoutParams(new ViewGroup.LayoutParams(deviceWidth, deviceHeight));
    imageView.setBackgroundColor(Color.RED);
    imageView.setScaleType(ImageView.ScaleType.MATRIX);
    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.image4);

    Matrix matrix = loadMatrix(bmp);
    RectF viewRect = new RectF(0, 0, deviceWidth, deviceHeight);
    RectF imageRect = new RectF(0, 0, bmp.getWidth(), bmp.getHeight());
    matrix.setRectToRect(imageRect, viewRect, Matrix.ScaleToFit.START);
    imageView.setImageMatrix(matrix);
    imageView.setImageBitmap(bmp);
    setContentView(imageView);

我收到显示在图像第 2 部分的结果,而只需要像第 1 部分显示的那样转换 ImageView 而不占用整个屏幕,而我得到这样的结果 评论这一行 matrix.setRectToRect(imageRect, viewRect, Matrix.ScaleToFit.START);

使用 2_nd 选项时,layoutParams 没有问题 虽然它以某种方式裁剪 ImageView 并没有完全显示

矩阵包含应该缩放和转换 ImageView 的数据

我需要将 ImageView 转换为可绘制大小的正确解决方案之一。我的意思是 ImageView 应该占据(或 ImageView 的触摸区域)应该作为可绘制部分。

   Bitmap targetBitmap = Bitmap.createBitmap((source.getWidth()),
            (source.getHeight()),
            Bitmap.Config.ARGB_8888);
    Paint p = new Paint();
    p.setAntiAlias(true);
    p.setDither(true);
    p.setFilterBitmap(true);
    RectF rectF = new RectF(0, 0, source.getWidth(), source.getHeight());
    matrix.mapRect(rectF);

    targetBitmap = Bitmap.createBitmap((int) rectF.width(), (int) rectF.height(), Bitmap.Config.ARGB_8888);

    Canvas tempCanvas = new Canvas(targetBitmap);
    tempCanvas.drawBitmap(source, matrix, p);
    if (targetBitmap != source) 
        source.recycle();
    
return targetBitmap;

【问题讨论】:

试图理解。 wrap_content 意味着 ImageView 只会和图像一样大,但您正在谈论缩放图像。请编辑您的问题,以更多地谈论您要完成的工作。我最近一直在 ImageView 中按矩阵进行缩放,非常熟悉它的工作原理。我可以给您的一个提示是确保 ImageView 已运行 onLayout(),否则 ImageView 将没有设置矩阵所需的宽度和高度。 假设 ImageView 使用 match_parent 调整大小,并且您的位图设置为覆盖整个 ImageView 的大小,您可以放大,但是当您缩小时,位图永远不会小于 ImageView ,这对你有用吗? 【参考方案1】:
private void drawBitmap() 

    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.image4);
    int imageWidth = bmp.getWidth();
    int imageHeight = bmp.getHeight();

    // first we set the size of the view to have the same aspect ratio
    // as the image
    int viewWidth = deviceWidth;
    int viewHeight = deviceWidth * imageHeight / imageWidth;
    imageView.setLayoutParams(new LayoutParams(viewWidth, viewHeight));

    // imageView.setBackgroundColor(Color.RED);

    //  get a rectangle that is the size of the ImageView
    RectF viewRect = new RectF(0, 0, viewWidth, viewHeight);

    // get a rectangle that is the size of the bitmap
    RectF imageRect = new RectF(0, 0, imageWidth, imageHeight);

    // init the matrix so it will map the image to the full size of the view
    // imageRect is the source rectangle, the current size of the image
    // viewRect is the target rectangle, the size we want the image to be
    // setRectToRect will calculate the matrix required to map source to target
    // we use scale to fit so that the aspect ratio doesn't change
    matrix.setRectToRect(imageRect, viewRect, ScaleToFit.START);

    // tell the ImageView to use this matrix
    // make sure android:scaleType="matrix" is in the ImageView attributes
    imageView.setMatrix(matrix)

    imageView.setImageBitmap(bmp);

【讨论】:

亲爱的@kris larson 我已经编辑了我的问题并更改了屏幕截图,并且我使用了您发布的代码,但我无法得到正确的结果。 它没有做任何改变:(

以上是关于为啥使用矩阵到图像视图与位图的结果不同?的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中动态且顺序地用颜色填充图像视图或位图

位图未设置为图像视图

合并/转换textview与/到drawable

通过倒置矩阵移动位图,位图移动后消失

在 Picasso 图像加载器中加载位图图像会减慢列表视图中的滚动速度

通过第三个将一个位图合并到另一个