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

java Android-以编程方式处理图像缩放/裁剪,java,android,image,crop,Java,Android,Image,Crop,好吧,这一切折磨了我好几个星期,我设置了一个227像素高的图像,并将其缩放到170像素,即使我希望它在任何时候都是wrap_内容 嗯。在这里,我拍摄了1950像素长的图像(我把它的一部分放在这里,这样你就可以理解它应该是什么样子了) 首先,我想把它缩小到227像素高,因为它是这样设计的,它应该是这样的 Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),R.drawable.ver_bottom_panel_tiled_

好吧,这一切折磨了我好几个星期,我设置了一个227像素高的图像,并将其缩放到170像素,即使我希望它在任何时候都是wrap_内容

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

首先,我想把它缩小到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像素。

但我只想剪切200像素以外的任何东西,或者我将设置的任何宽度-裁剪它,而不是将所有这些长图像压入200像素区域


此外,位图可绘制(位图);和imageView.setBackgroundDrawable(可拉伸);已弃用-我如何更改它?

根据我看到的,您创建了一个新大小的位图(200x227),因此我不确定您期望的是什么。你甚至在评论中写下了你的规模和没有字的裁剪

您可以做的是:

  • 如果API至少为10(姜饼),则可以使用:

  • 如果API太旧,则需要解码大位图,然后使用

  • 大概是这样的:

    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());
      }
    

    根据我看到的,您创建了一个新大小(200x227)的位图,所以我不确定您期望的是什么。你甚至在评论中写下了你的规模和没有字的裁剪

    您可以做的是:

  • 如果API至少为10(姜饼),则可以使用:

  • 如果API太旧,则需要解码大位图,然后使用

  • 大概是这样的:

    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());
      }
    

    你能给我举个例子,如何用Bitmap.CreateBitmap裁剪它吗?它仍然没有裁剪,只是试着将整个图像融入其中。可能是我做错了什么?你检查过我刚才给你的链接了吗?您需要使用正确的函数。无论如何,我已经编写了一个示例代码,尽管我不确定它是否编译得很好。好吧,这就是问题所在-我想使用BitMapRegionCoder,但它只适用于文件。但我想将其与资源一起使用-不同的dpi。处理文件会使这变得复杂。有没有办法在资源中使用BitMapRegionCoder?请阅读我给你的内容。我不能在一个地方教你所有关于android的知识。。。这不仅仅是为了文件。我只举了一个例子。您也可以使用inputStream或fileDescriptor。例如,您可以使用getResources().openRawResource(R.drawable…)这对我来说太疯狂了。。。。。。。。。。。。。。。。。。。。。。。。我从参考资料中得到一张图片。。原稿是227像素。。如果我使用getHeight,它将返回170像素。如果我把它放在一个bitmap.xml中,它将是170像素。但如果我裁剪它-高度将再次达到227像素!!!发生了什么事???你能给我举个例子,如何用Bitmap.CreateBitmap裁剪它吗?它仍然没有裁剪,只是试着将整个图像融入其中。可能是我做错了什么?你检查过我刚才给你的链接了吗?您需要使用正确的函数。无论如何,我已经编写了一个示例代码,尽管我不确定它是否编译得很好。好吧,这就是问题所在-我想使用BitMapRegionCoder,但它只适用于文件。但我想将其与资源一起使用-不同的dpi。处理文件会使这变得复杂。有没有办法在资源中使用BitMapRegionCoder?请阅读我给你的内容。我不能在一个地方教你所有关于android的知识。。。这不仅仅是为了文件。我只举了一个例子。您也可以使用inputStream或fileDescriptor。例如,您可以使用getResources().openRawResource(R.drawable…)这对我来说太疯狂了。。。。。。。。。。。。。。。。。。。。。。。。我从参考资料中得到一张图片。。原稿是227像素。。如果我使用getHeight,它将返回170像素。如果我把它放在一个bitmap.xml中,它将是170像素。但如果我裁剪它-高度将再次达到227像素!!!发生什么事???