java Android - 以编程方式处理图像缩放/裁剪

时间:2013-08-19 11:13:29

标签: java android image crop

好吧,所有这一切都让我折磨了好几周,我设置了一个高达227像素的图像,它的高度为170像素,即使我希望它在任何时候都是wrap_content。

确定。在这里,我拍摄了长度为1950像素的“我的图像”(我在这里放了一部分,这样你就可以理解它应该是什么样子了)。

enter image description here

首先,我想将它缩放到227像素高,因为它的设计方式和应该如何

Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),R.drawable.ver_bottom_panel_tiled_long);
            int width = bitmapOrg.getWidth();
        int height = bitmapOrg.getHeight();
        int newWidth = 200; //this should be parent's whdth later
        int newHeight = 227;

        // calculate the scale
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;

        // create a matrix for the manipulation
        Matrix matrix = new Matrix();
        // resize the bit map
        matrix.postScale(scaleWidth, scaleHeight);

        // recreate the new Bitmap
        Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, 
                          width, height, matrix, true); 


        BitmapDrawable dmpDrwbl=new BitmapDrawable(resizedBitmap);

    verbottompanelprayer.setBackgroundDrawable(dmpDrwbl);

所以...它根本不是裁剪图像 - 不,它是1950像素压缩到200像素。 enter image description here

但是我想要除了这个200像素或我设置的任何宽度之外切割任何东西 - 裁剪它而不是将所有长图像按到200像素区域。

另外,BitmapDrawable(位图位图);和imageView.setBackgroundDrawable(drawable);已弃用 - 我该如何更改?

1 个答案:

答案 0 :(得分:4)

根据我所看到的,你创建一个新大小的位图(200x227),所以我不确定你的期望。你甚至写过评论中的评论,也没有关于裁剪的文字......

你能做的是:

  1. 如果API至少为10(姜饼),您可以使用BitmapRegionDecoder使用decodeRegion

  2. 如果API太旧,则需要解码大位图,然后使用Bitmap.createBitmap

  3. 将其裁剪为新的位图

    类似的东西:

    final Rect rect =...
    if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD_MR1)
      {
      BitmapRegionDecoder decoder=BitmapRegionDecoder.newInstance(imageFilePath, true);
      croppedBitmap= decoder.decodeRegion(rect, null);
      decoder.recycle();
      }
    else 
      {
      Bitmap bitmapOriginal=BitmapFactory.decodeFile(imageFilePath, null);
      croppedBitmap=Bitmap.createBitmap(bitmapOriginal,rect.left,rect.top,rect.width(),rect.height());
      }